The text: "PDO does not allow you to use MySQL's support for Multiple Statements" is outdated.
Since v5.3, PHP intoduced multiple statement support into PDO (by PDO_MYSQLND driver replacing the previous PDO_MYSQL).
このセクションでは、 PHP アプリケーションの開発で MySQL データベースを扱うときの選択肢について説明します。
API って何?
API は Application Programming Interface の略で、 何らかのタスクを実行するためにアプリケーションから呼び出す必要のある クラスやメソッド、関数、変数などを定義したものです。 データベースとの通信を必要とする PHP アプリケーションが使うための API は、 通常は PHP の拡張モジュールとして公開されています。
API は手続き型にすることもできるし、 オブジェクト指向型にすることもできます。 手続き型の API の場合は何かの処理を実行するための関数を呼ぶことになり、 オブジェクト指向型の API の場合はクラスのインスタンスを作ってそのメソッドを呼ぶことになります。 通常は、後者の方法をおすすめします。 後者のほうがよりモダンであり、 きっちりとしたコードを書けるからです。
MySQL サーバーとの接続が必要な PHP アプリケーションを書く場合に 使える API はいくつかあって、その中から選べます。 このドキュメントでは、 どんな API が使えてどれを選ぶのが最適なのかを解説します。
コネクタとは?
MySQL のドキュメントで使われている コネクタ という用語は、 何かのアプリケーションから MySQL データベースサーバーに接続するためのソフトウェアのことを指します。 MySQL はさまざまな言語用のコネクタを提供しており、 PHP もその中に含まれます。
PHP のアプリケーションで、 データベースサーバーとの通信が必要になったときには、 データベースサーバーへの接続やデータベースへの問い合わせなどの関数を呼ぶ PHP コードを書くことになるでしょう。 つまり、PHP アプリケーションから使える API を提供するソフトウェアが必要になるということです。 そのソフトウェアは、 アプリケーションとデータベースサーバーの間の通信も処理しないといけません。 おそらくは中間ライブラリも利用することになるでしょう。 このソフトウェアのことを一般的にコネクタと呼びます。 というのも、 このソフトウェアのおかげで アプリケーションがデータベースサーバーに 接続 (connect) できるようになるからです。
ドライバとは?
ドライバとは、 特定のデータベースサーバーとの通信をするために作られたソフトウェアのことです。 ドライバはライブラリと呼ばれることもあり、 MySQL Client Library や MySQL Native ドライバ というように使われます。 これらのライブラリが実装するのは低レベルのプロトコルで、 これを使って MySQL データベースサーバーと通信します。
例を挙げると、データベース抽象化レイヤーの PHP Data Objects (PDO) は各データベース専用のドライバの中からひとつを選んで使います。 数あるドライバの中のひとつに PDO MYSQL ドライバがあり、 これが MySQL サーバーとのインターフェイスとなります。
人によっては、コネクタとドライバを混同して使うこともあって、 混乱の元となります。 MySQL 関連のドキュメントでは、ドライバ
という用語は、 コネクタパッケージのうち、 データベース固有の機能を提供するソフトウェアという意味で 予約されています。
拡張モジュールとは?
PHP のドキュメントを読んでいると、拡張モジュール という用語がよく出てきます。 PHP のコードには、コア機能とは別に オプションの拡張モジュールが用意されています。 PHP で使える MySQL 関連の拡張モジュールには mysqli や PDO MySQL があり、 PHP の拡張モジュール用フレームワークを使って実装されています。
拡張モジュールは一般的に PHP プログラマー向けの API を公開しており、 その機能をプログラムから使えるようになっています。 しかし、PHP 拡張モジュールフレームワークを使って書かれた拡張モジュールの中には、 PHP プログラマー向けの API を公開していないものもあります。
たとえば PDO MySQL ドライバは PHP の拡張モジュールですが、 それ自体は PHP プログラマー向けの API を公開していません。 さらに上位にある PDO レイヤーへのインターフェイスを提供しているだけです。
API と拡張モジュールとは同じ意味ではありません。 拡張モジュールが必ずしもプログラマー向けの API を公開しているとは限らないからです。
MySQL を使うために、提供されている主要な PHP API は何ですか?
MySQL データベースサーバーに接続することを検討する際、 ふたつの主要な選択肢があります:
PHP の mysqli 拡張モジュール
PHP Data Objects (PDO)
それぞれ、長所と短所があります。 以下の説明で、それぞれの API の重要な側面を簡単に説明していきます。
PHP の mysqli 拡張モジュールとは何ですか?
mysqli
拡張モジュール、
もしくは 改良版
MySQL 拡張モジュールとしても知られているものは、
MySQL のバージョン 4.1.3 以降の新機能を利用するために開発されました。
mysqli
拡張モジュールは、
PHP 5 以降にバンドルされています。
mysqli
拡張モジュールにはたくさんの利点がありますが、
mysql
拡張モジュールに対する、
主な改良点は下記のとおりです:
オブジェクト指向インターフェイス
プリペアドステートメントのサポート
複数のステートメント実行をサポート
トランザクションのサポート
強化されたデバッグ機能
オブジェクト指向インターフェイスと同時に、 手続き型のインターフェイスも提供されています。
mysqli
拡張モジュールは、
PHP の拡張モジュール用フレームワークを使って実装されています。
ソースコードは ext/mysqli 以下にあります。
mysqli
拡張モジュールについての詳細は、
MySQLi を参照ください。
PDO とは何ですか?
PHP Data Objects, または PDO は、PHP アプリケーションのための、特別なデータベース抽象化レイヤです。 PDO は、あなたのアプリケーションが接続するデータベースサーバーに関係なく、 一貫した API を提供します。 理屈の上では、PDO の API を使えば、 たとえば Firebird から MySQL にデータベースサーバーを切り替えることができます。 PHP コードに必要な変更は少なく済むでしょう。
データベース抽象化レイヤのその他の例としては、 Java の JDBC や、Perl の DBI が挙げられます。
PDO には、綺麗で、簡潔で、 移植可能な API であるという利点がある一方で、 最新の MySQL サーバーで利用可能な高度な機能を全て利用できるとは限らない、 という重要な欠点があります。 たとえば、PDO は MySQL がサポートしている 複数ステートメントの実行を許可していません。
PDO は、PHP の拡張モジュール用フレームワークを使って実装されています。 ソースコードは ext/pdo 以下にあります。
PDO についての詳細は、 PDO を参照ください。
PDO MYSQL ドライバ とは何ですか?
PDO MySQL ドライバ 自体は、 少なくとも PHP プログラマから見ると API ではありません。 実際には、 PDO MySQL ドライバ は PDO の直下のレイヤにあって、 MySQL 特有の機能を提供しているものです。 プログラマは、PDO の API を呼ぶことは変わりませんが、 PDO は MySQL サーバーと通信するために、 PDO MySQL ドライバを使うのです。
PDO MySQL ドライバは、 数ある PDO ドライバのうち、利用できるもののひとつです。 他の PDO ドライバとして、Firebird と PostgreSQL データベースサーバーのものが含まれています。
PDO MySQL ドライバは、 PHP の拡張モジュール用フレームワークを使って実装されています。 ソースコードは ext/pdo_mysql 以下にありますが、 その API は PHP プログラマには公開されていません。
PDO MySQL ドライバについての詳細は、 MySQL (PDO) を参照ください。
PHP の MySQL Native ドライバとは何ですか?
MySQL データベースサーバーと通信するために、
mysqli
と PDO MySQL ドライバは、
それぞれ必須のプロトコルを実装している低レベルのライブラリを使っています。
かつては、その低レベルのライブラリとして利用可能だったのは、
libmysqlclient
とも呼ばれている MySQL Client Library だけでした。
しかし、
libmysqlclient
が提供していたインターフェイスは、
PHP アプリケーションとの通信に最適化されていませんでした。
なぜなら、libmysqlclient
は、C言語 で書かれたアプリケーションを念頭に置いていたからです。
このため、PHP アプリケーションのための代替として、
libmysqlclient
の代わりに、
MySQL Native ドライバ、mysqlnd
が開発されたのです。
mysqli
拡張モジュール
と PDO MySQL ドライバはそれぞれ、
libmysqlclient
や
mysqlnd
のいずれかを使って個別に設定できます。
mysqlnd
は、
PHP システムと統合するために特別に設計されているため、
libmysqlclient
と比較して、
大幅な省メモリ化や高速化が実現されています。
これらの改善を利用することを強くお勧めします。
MySQL Native ドライバ は、 PHP 拡張モジュール用フレームワークを使って実装されています。 ソースコードは ext/mysqlnd 以下にありますが、 その API は PHP プログラマには公開されていません。
機能の比較
以下の表は、PHP から MySQL に接続する主要な方法に関する、 機能の比較を示しています:
PHP の mysqli 拡張モジュール | PDO (PDO MySQL ドライバ と MySQL Native ドライバ を利用) | |
---|---|---|
PHP で実装されたバージョン | 5.0 | 5.0 |
MySQL での開発状況 | アクティブ | アクティブ |
文字セットに関するAPI のサポート | Yes | Yes |
サーバー側でのプリペアドステートメントの API サポート | Yes | Yes |
クライアントサイドでのプリペアドステートメントの API サポート | No | Yes |
ストアドプロシージャの API のサポート | Yes | Yes |
複数ステートメントの API のサポート | Yes | Most |
MySQL 4.1以降の機能を全てサポートしているか | Yes | Most |
The text: "PDO does not allow you to use MySQL's support for Multiple Statements" is outdated.
Since v5.3, PHP intoduced multiple statement support into PDO (by PDO_MYSQLND driver replacing the previous PDO_MYSQL).
mysqli can be great in some circumstances but much work has been put into PHP Portable Data Objects (PDO) which you should also consider when choosing a way to connect to your database using php. For example, PDO supports MySQL with minimal performance hit and the code your write for it will support many other databases with little or no changes. That said, the database connection code, even if you have to change a lot of it to use another database will be much less work than coding your actual database data entry and report apps. When I started creating PHP/MySQL apps years ago, I used php's native support for PHP then moved to PEAR:DB and MDB/MDB2 and finally to wizzyweb which is basically like "phpMyAdmin for Apps" to create apps as it automatically generates the PHP PDO connection code and the application code. Sure, I could code it all from scratch but I save about 90% of the time it used to take. The point is look at the total amount of time you will save by using native code vs. an abstraction layer. Most people find that programmer time is the most valuable part of the equation so anything than can save programmer time should be heavily weighted.