PHPKonf 2020 Online

どの API を使うか

PHP には、MySQL への接続用の API が三種類あります。 以下に、mysql と mysqli そして PDO が提供する API を示します。 それぞれのコードは、"" 上で稼働する MySQL サーバーに ユーザー名 "user"、パスワード "password" で接続するものです。 そして、クエリを実行してユーザーにあいさつします。

例1 三種類の MySQL 用 API の比較

// mysqli
$mysqli = new mysqli("""user""password""database");
$result $mysqli->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row $result->fetch_assoc();

// PDO
$pdo = new PDO(';dbname=database''user''password');
$statement $pdo->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row $statement->fetch(PDO::FETCH_ASSOC);

// mysql
$c mysql_connect("""user""password");
$result mysql_query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row mysql_fetch_assoc($result);

おすすめの API

mysqliPDO_MySQL のどちらかを使うことをおすすめします。 古い mysql 拡張モジュールを新規開発で使うのはおすすめしません。 というのも、これは PHP 5.5.0 で非推奨となり、PHP 7 で削除されたからです。 詳しい機能比較を以下に示します。全体的なパフォーマンスは、どれもほぼ同じです。 拡張モジュール自体のパフォーマンスが PHP のウェブリクエストの実行時間に及ぼす影響はごくわずかで、 たいていは 0.1% 程度に過ぎません。


  ext/mysqli PDO_MySQL ext/mysql
どのバージョンの PHP から使えるか 5.0 5.1 2.0
PHP 5.x に同梱されているか Yes Yes Yes
PHP 7.x に同梱されているか Yes Yes No
開発状況 進行中 進行中 5.x では保守対応のみ、7.x では削除
ライフサイクル 活動中 活動中 5.x で非推奨、7.x で削除
新規開発でおすすめできるか Yes Yes No
オブジェクト指向のインターフェイス Yes Yes No
手続き型のインターフェイス Yes No Yes
mysqlnd によるノンブロッキングな非同期クエリ Yes No No
持続的接続 Yes Yes Yes
文字セット Yes Yes Yes
サーバーサイドのプリペアドステートメント Yes Yes No
クライアントサイドのプリペアドステートメント No Yes No
ストアドプロシージャ Yes Yes No
複数ステートメント Yes Most No
トランザクション Yes Yes No
SQL によるトランザクション制御 Yes Yes Yes
MySQL 5.1+ の全機能への対応 Yes Most No
add a note add a note

User Contributed Notes 4 notes

alvaro at demogracia dot com
8 years ago
Apart from the feature list, I suggest you try out both MySQLi and PDO and find out what API design you like most. MySQLi is more powerful and probably more complex to learn. PDO is more elegant and has the advantage that you only need to learn one PHP API if you need to work with different DBMS in the future.
rellect at gmail dot com
1 year ago
Another point to consider and one of the advantages of PDO is that it's not limited to mysql and supports other database engines such as PostgreSQL, SQLite, etc.
3 years ago
These are quite possibly the most paradoxical lines in this table:

API supports non-blocking, asynchronous queries with mysqlnd
     ext/mysqli: Yes     PDO_MySQL: No
API supports client-side Prepared Statements
     ext/mysqli: No     PDO_MySQL: Yes

Apparently it's either asynchronous I/O or the security of bound parameters.
michaeln at associations plus dot see eh
7 years ago
Another useful consideration to keep in mind when choosing your library is how extensible it is. Chances are, in any sufficiently advanced development scenario, you're going to be extending your database access class to add a method (or multiple methods) for how to handle database errors and alert the development team of errors and whether to have the code fail immediately or fail gracefully serving the user a user-friendly failure notice.

For example, I have a class where I have added extra parameters to the query() function (and a few others), which accept the __FILE__ and __LINE__ constants to facilitate tracking issues. If this were not reasonably possible with PDO-mysql for example (not sure, never used it), it may make one option or the other much less likely to be viable for your usage case.
To Top