どの API を使うか

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/mysqliPDO_MySQL
どのバージョンの PHP から使えるか5.05.1
PHP 7.x と PHP 8.x に同梱されているかYesYes
開発状況進行中進行中
ライフサイクル活動中活動中
新規開発でおすすめできるかYesYes
オブジェクト指向のインターフェイスYesYes
手続き型のインターフェイスYesNo
mysqlnd によるノンブロッキングな非同期クエリYesNo
持続的接続YesYes
文字セットYesYes
サーバーサイドのプリペアドステートメントYesYes
クライアントサイドのプリペアドステートメントNoYes
ストアドプロシージャYesYes
複数ステートメントYesMost
トランザクションYesYes
SQL によるトランザクション制御YesYes
MySQL 5.1+ の全機能への対応YesMost
To Top