PHP には、様々な MySQL へ接続する API があります。 以下に、mysqli と PDO が提供する API を示します。 それぞれのコードは、"example.com" 上で稼働する MySQL サーバーに ユーザー名 "user"、パスワード "password" で接続するものです。 そして、クエリを実行してユーザーにあいさつします。
例1 MySQL 用 API の比較
<?php
// mysqli
$mysqli = new mysqli("example.com", "user", "password", "database");
$result = $mysqli->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = $result->fetch_assoc();
echo htmlentities($row['_message']);
// PDO
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
$statement = $pdo->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['_message']);
例2 プリペアドステートメントの比較
<?php
// mysqli
$mysqli = new mysqli("example.com", "user", "password", "database");
$statement = $mysqli->prepare("SELECT District FROM City WHERE Name=?");
$statement->execute(["Amersfoort"]);
$result = $statement->get_result();
$row = $result->fetch_assoc();
echo htmlentities($row['District']);
// PDO
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
$statement = $pdo->prepare("SELECT District FROM City WHERE Name=?");
$statement->execute(["Amersfoort"]);
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['District']);機能の比較
全体的なパフォーマンスは、どれもほぼ同じです。 拡張モジュール自体のパフォーマンスが PHP のウェブリクエストの実行時間に及ぼす影響はごくわずかで、 たいていは 0.1% 程度に過ぎません。
| ext/mysqli | PDO_MySQL | |
|---|---|---|
| どのバージョンの PHP から使えるか | 5.0 | 5.1 |
| PHP 7.x と PHP 8.x に同梱されているか | Yes | Yes |
| 開発状況 | 進行中 | 進行中 |
| ライフサイクル | 活動中 | 活動中 |
| 新規開発でおすすめできるか | Yes | Yes |
| オブジェクト指向のインターフェイス | Yes | Yes |
| 手続き型のインターフェイス | Yes | No |
| mysqlnd によるノンブロッキングな非同期クエリ | Yes | No |
| 持続的接続 | Yes | Yes |
| 文字セット | Yes | Yes |
| サーバーサイドのプリペアドステートメント | Yes | Yes |
| クライアントサイドのプリペアドステートメント | No | Yes |
| ストアドプロシージャ | Yes | Yes |
| 複数ステートメント | Yes | Most |
| トランザクション | Yes | Yes |
| SQL によるトランザクション制御 | Yes | Yes |
| MySQL 5.1+ の全機能への対応 | Yes | Most |