ServBayでPHP MySQL拡張機能(mysqlnd, mysqli, PDO)を利用する
ServBayはパワフルな統合型ローカルWeb開発環境として、PHPアプリケーションとデータベースの連携を大幅に簡素化します。すべてのサポートされているPHPバージョンに対し、mysqlnd
、mysqli
、PDO_MySQL
といった主要なMySQLデータベース拡張モジュールがプリインストールされ、デフォルトで有効になっています。これにより、わずらわしい設定を行うことなく、PHPプロジェクトからMySQLやMariaDBデータベースへのデータ操作をすぐに始められます。
ServBayで利用可能なPHP MySQL拡張機能
ServBayのPHP環境には、互換性とパフォーマンスを確保するため次の3つの代表的なMySQL拡張が組み込まれています:
- MySQL Native Driver(
mysqlnd
): PHPのネイティブドライバーであり、mysqli
やPDO_MySQL
の基盤となるライブラリです。MySQL/MariaDBサーバーとの通信に必要な機能を提供し、パフォーマンスやメモリ管理面で優れています。 - MySQLi(
mysqli
): MySQL Improved Extensionの略。オブジェクト指向型・手続き型の両インターフェースを提供し、MySQLやMariaDBとの接続に特化。プリペアドステートメント、トランザクション、ストアドプロシージャ、複数クエリの実行など、充実した高機能をサポートします。 - PDO MySQL(
PDO_MySQL
): PHP Data Objects(PDO)のMySQLドライバーです。PDOは一貫したAPIで複数種類のデータベース(MySQL、MariaDB、PostgreSQL、SQLite等)にアクセスでき、コードの移植性が向上します。
拡張機能の有効状態
ServBayでは、mysqlnd
、mysqli
、PDO_MySQL
拡張モジュールはすべてのPHPバージョンでデフォルト有効化されています。追加の操作は不要です。ServBayがphp.ini
の設定も済ませているため、これら拡張をすぐに利用してデータベースへ接続できます。
各PHP MySQL拡張機能の詳細
この3つの拡張の違いを理解することで、プロジェクトごとにベストな選択ができます:
MySQL Native Driver(
mysqlnd
)- 主な役割:
mysqlnd
はC言語で実装されたPHPのネイティブドライバーで、PHPからMySQL/MariaDBサーバーへの通信を担う基礎的なレイヤーです。 - 特徴:PHP 5.3以降は
mysqli
やPDO_MySQL
のデフォルト基盤となっており、外部のMySQLクライアントライブラリ(例:libmysqlclient
)へのリンクが不要。 - メリット:古い
libmysqlclient
と比較し、mysqlnd
は一般的に高速かつ効率的なメモリ管理、非同期クエリや永続接続の最適化、豊富なプラグインAPIなど先進的な機能を備えています。通常、mysqlnd
APIを直接使うことはなく、mysqli
やPDO
経由でその恩恵を享受します。
- 主な役割:
MySQLi(
mysqli
)- 主な役割:MySQL Improved Extensionは、特にMySQL(4.1.3以降)およびMariaDBのために設計されたPHP拡張です。
- 特徴:オブジェクト指向、手続き型両方のインターフェースを提供。プリペアドステートメント(SQLインジェクション対策)、トランザクション管理、ストアドプロシージャ、複数クエリなど高度な機能に対応。
- メリット:機能が豊富でMySQL/MariaDBに最適化され、高いパフォーマンスを発揮。プロジェクトがMySQLまたはMariaDBのみに限定され、専用の高度な機能が必要な場合は信頼性の高い選択肢です。
PDO MySQL(
PDO_MySQL
)- 主な役割:PHP Data Objects(PDO)は、さまざまなデータベースにアクセスできる軽量・一貫性のあるインターフェースを提供します。
PDO_MySQL
はMySQL/MariaDB専用ドライバーです。 - 特徴:
PDO
クラスやPDOStatement
クラスにより統一APIで操作。必ずプリペアドステートメント(prepare()
やexecute()
)を利用し、SQLインジェクション対策の最善策になります。トランザクションにも対応。 - メリット:高いデータベース移植性が最大の魅力。将来的にPostgreSQLやSQLiteなど他のデータベースへ移行する場合も、PDOを使っていればコード修正を最小限に抑えられます。明確でオブジェクト指向のインターフェースで、コードは簡潔かつ安全性が高くなります。新規プロジェクトにはPDOの利用が推奨されます。
- 主な役割:PHP Data Objects(PDO)は、さまざまなデータベースにアクセスできる軽量・一貫性のあるインターフェースを提供します。
PHPコード例:データベース接続と基本操作
以下のサンプルは、mysqli
拡張またはPDO
拡張を用いて、ServBayが管理する(例:MariaDBやMySQL)データベースに接続し、基本操作を行う手順です。
前提条件:
- ServBayでMySQLまたはMariaDBサービスが起動していること
servbay_db
というデータベースが作成されていることservbay_user
というユーザーが、パスワードyour_password
で作成され、servbay_db
への適切な権限を持っていることservbay_db
内には、users
テーブルが存在し、id
(INT, PK, AI)・name
(VARCHAR)・email
(VARCHAR)・age
(INT)カラムがあること
これらの設定は、ServBay内蔵のphpMyAdminや他のDB管理ツールで作成できます。
コード例(mysqli
の場合)
php
<?php
// --- mysqli サンプル ---
// データベース接続パラメータ
$servername = "127.0.0.1"; // または 'localhost'
$port = 3306; // ServBayのMySQL/MariaDB標準ポート
$username = "servbay_user";
$password = "your_password"; // ご自身のパスワードに置き換えてください
$dbname = "servbay_db";
// mysqli接続(オブジェクト指向)
$conn = new mysqli($servername, $username, $password, $dbname, $port);
// 接続チェック
if ($conn->connect_error) {
die("mysqli Connection failed: " . $conn->connect_error);
}
echo "mysqli Connected successfully<br>";
// データ挿入(プリペアドステートメントでSQLインジェクション対策)
$stmt = $conn->prepare("INSERT INTO users (name, email, age) VALUES (?, ?, ?)");
$name = "ServBay Demo";
$email = "mysqli@servbay.demo";
$age = 5;
// "ssi" はstring, string, integerの型指定
$stmt->bind_param("ssi", $name, $email, $age);
if ($stmt->execute()) {
echo "mysqli: New record created successfully<br>";
} else {
echo "mysqli Error: " . $stmt->error . "<br>";
}
$stmt->close();
// データ取得
$sql = "SELECT id, name, email, age FROM users WHERE name = 'ServBay Demo'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "mysqli Queried data:<br>";
// データ出力
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Name: " . $row["name"]. " - Email: " . $row["email"]. " - Age: " . $row["age"]. "<br>";
}
} else {
echo "mysqli: 0 results found<br>";
}
// 接続終了
$conn->close();
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
コード例(PDO
の場合)
php
<?php
// --- PDO サンプル ---
// データベース接続パラメータ
$host = '127.0.0.1'; // または 'localhost'
$port = 3306; // ServBayのMySQL/MariaDB標準ポート
$dbname = 'servbay_db';
$username = 'servbay_user';
$password = 'your_password'; // ご自身のパスワードに置き換えてください
$charset = 'utf8mb4';
// DSN(データソース名)
$dsn = "mysql:host=$host;port=$port;dbname=$dbname;charset=$charset";
// PDOオプション設定
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 警告ではなく例外を投げる
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // デフォルトの取得結果は連想配列
PDO::ATTR_EMULATE_PREPARES => false, // ネイティブなプリペアドステートメント利用
];
try {
// PDO接続インスタンス作成
$pdo = new PDO($dsn, $username, $password, $options);
echo "PDO Connected successfully<br>";
// データ挿入(プリペアドステートメント利用)
$sql = "INSERT INTO users (name, email, age) VALUES (:name, :email, :age)";
$stmt = $pdo->prepare($sql);
$name = 'ServBay PDO Demo';
$email = 'pdo@servbay.demo';
$age = 10;
// パラメータをバインドして実行
$stmt->execute([
':name' => $name,
':email' => $email,
':age' => $age
]);
echo "PDO: New record created successfully<br>";
// データ取得
$stmt = $pdo->prepare("SELECT id, name, email, age FROM users WHERE name = :name");
$stmt->execute([':name' => 'ServBay PDO Demo']);
// 全件取得
$users = $stmt->fetchAll(); // デフォルトはFETCH_ASSOC
if ($users) {
echo "PDO Queried data:<br>";
foreach ($users as $row) {
echo "id: " . $row['id'] . " - Name: " . $row['name'] . " - Email: " . $row['email'] . " - Age: " . $row['age'] . "<br>";
}
} else {
echo "PDO: 0 results found<br>";
}
} catch (\PDOException $e) {
// 接続・クエリエラーをキャッチして表示
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
// 通常、スクリプト終了時にPDO接続は自動的に閉じられるため明示的なclose()不要
// $pdo = null; // 明示的にcloseしたい場合
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
設置方法: 上記のいずれかのサンプルコードを.php
ファイル(例:db_test_mysqli.php
やdb_test_pdo.php
)として保存し、ServBayのWebサイトのルートディレクトリ(例:/Applications/ServBay/www/myproject/
)配下に置きます。その後、対応するURL(例:http://myproject.servbay.demo/db_test_mysqli.php
)にブラウザでアクセスしてください。ServBayでサイト設定が正しく行われていることを確認しましょう。
よくある質問(FAQ)
Q: ServBayでPHPのMySQL拡張を手動インストールする必要がありますか?
A: いいえ、不要です。ServBayは全ての管理しているPHPバージョンにmysqlnd
、mysqli
、PDO_MySQL
という主要MySQL拡張をプリインストールし、デフォルトで有効化しています。追加のインストールや設定は一切不要、そのままPHPコードからご利用いただけます。
Q: mysqli
とPDO
、どちらを選ぶべきでしょうか?
A:
- 基本的に
PDO
推奨:複数種類のデータベースサポートが今後必要、もしくはより現代的で移植性・セキュリティを重視したい場合は、PDOが最適です。プリペアドステートメント利用が必須になるため、安全性も向上します。 mysqli
検討時:プロジェクトがMySQL/MariaDBだけで完結し、これら特有の高度な機能も活用したい場合は、mysqli
もパフォーマンス・互換性の面で優秀です。オブジェクト指向型・手続き型どちらも選択可。
新規案件では、一般的にPDOの採用が推奨されます。
Q: ServBayでMySQL/MariaDBサービスに接続する際のパラメータは?
A:
- ホスト名(Host):通常は
127.0.0.1
またはlocalhost
です。 - ポート番号(Port):MySQL/MariaDBの標準は
3306
。ServBayのソフトウェア管理画面で実際のポート番号を確認できます。 - ユーザー名・パスワード(Username/Password):MySQL/MariaDBで作成したデータベースユーザーの認証情報を使用。初回セットアップ時は新規ユーザーを作成、または(推奨しませんが)rootユーザーの利用も可能。ServBayのphpMyAdminなどでユーザー管理/権限設定が行えます。
- データベース名(Database Name):接続したいDB名を指定します。
Q4: 古いプロジェクトで非推奨のmysql_*
関数を使っている場合、ServBayで動作しますか?
A: 動作します。ServBayは、レガシーなアプリや保守目的のために、PHP 5.6環境に**mysql_*
関数(例:mysql_connect
)へのサポートを含めています**。これらの関数はPHP 5.5で非推奨、PHP 7.0で完全削除されています。ServBayのPHP 5.6なら、古いコードを修正せず運用可能です。
ただし、以下を強く推奨します:
- このサポートは一時的な互換・レガシー保守目的に限定してください。
- 新規案件やリファクタリング時には、必ず
mysqli
またはPDO
への移行を行いましょう。mysql_*
関数はSQLインジェクション対策などセキュリティ面で脆弱であり、現代的なDB機能も利用できません。
まとめ
ServBayは、全PHPバージョンにmysqlnd
、mysqli
、PDO_MySQL
拡張をプリインストール&デフォルト有効化し、さらにPHP 5.6でレガシーなmysql_*
関数にも対応することで、PHP開発者のDB連携を飛躍的に簡素化します。拡張の追加インストールや面倒な設定は一切不要で、プロジェクトに最適な拡張(PDOまたはmysqli推奨)を選び、ただちにServBay環境のMySQL/MariaDBにデータ操作可能です。
この「すぐに使える」利便性により、アプリケーションロジック開発に集中しやすくなります。ServBayの安定・高速なローカル開発環境を活用して、あなたのWebサービスをスピーディに構築・テスト・保守しましょう。