PHP Data Object (PDO) とはPHPに拡張モジュールとして標準で提供されているデータベース抽象化レイヤであり、各種データベース(DBMS、RDBMS)への接続を抽象化する。 2005年11月24日にリリースされたPHP 5.1.0から標準でバンドルされるようになった拡張モジュール(PECL)であり、データソース名(DSN)によって使用する内部エンジンを切り替えることで各種データベースに対する統一的なアクセスインターフェイスを提供する。<?phptry { $pdo = new PDO("mysql:host=localhost;dbname=pdotest", "username", "password");} catch(PDOException $e){ var_dump($e->getMessage());}?> 例えば、上記のコードではPDOクラスの第一引数にDSNを与えており、mysql:がMySQL或いはMariaDBに接続するための内部エンジンを使用することを表している。この部分をpgsql:などに変更することで使用するデータベースをMySQLからPostgreSQLなどに変更することが出来る。 多くのデータベースに対応する必要のあるシステム開発や、システムを異なるデータベースに移行するときなどに、特に威力を発揮する。またDoctrineやEloquentのようなORMライブラリの内部でデータベース接続を行うバックエンドとして利用されている。 PDOは、以下の機能を提供している[1]。 例えば userテーブルに変数$nameに'ウィキペディア'という文字列をSQLに挿入する例(prepareメソッド):<?php$names = 'ウィキペディア';$stmt = $pdo->prepare('INSERT INTO user (name) VALUES (:name)');$stmt->bindValue(':name', $names, PDO::PARAM_STR);$stmt->execute();?>または:<?php$names = 'ウィキペディア';$stmt = $pdo->prepare('INSERT INTO user (name) VALUES (:name)');$stmt->execute([':name' => $names]);?> PHPはWebアプリケーション作成の開発に適した言語であり、Webアプリケーションと連携する多くのデータベースにアクセスする機能も、モジュールとして標準で備えている。しかし、その接続するための関数とそれに渡す引数はそれぞれのデータベース毎に異なっていた。 MySQLやMariaDBではmysql_connect関数に代表されるMySQLモジュール[※ 1](PHP7.0現在はmysqli_connnectに代表されるMySQLi[※ 2]に置き換えられた[※ 3])、PostgreSQLではpg_connect関数に代表されるPostgreSQLモジュール[※ 4]など、データベース毎に実装が異なっていた。また、関数に渡すパラメータなども各データベースによって異なるなど、複数のデータベースをサポートする開発者にとって多大な負担になっていた[1]。 PHP4では、PEARの1つとして、PEAR::DBがあり、これがデータベースへのアクセス機能をまとめ、共通のAPIを提供していた。しかし、この機能はPHPスクリプトで書かれているため、速度面で遅くなりがちという欠点を抱えていた[2]。中小規模のシステムならともかく、大規模なシステムではその速度の遅さが欠点となっていた。 そこで、PHP5からはC言語で書かれた拡張モジュールとしてPDOが作成・提供されることとなった。 PDOはデータベースへの接続を抽象化するライブラリであり、SQLに対する抽象化は殆ど行わないことに注意が必要である。すなわちデータベース毎の独自拡張の利用やSQL構文の差異の吸収はプログラマが手で行うか、クエリビルダやORMなどのより高度な抽象化を行うライブラリを利用する必要がある。 また、プリペアドステートメントを用いることでSQLインジェクションの脆弱性をより安全に回避することができるが、環境によっては対応が不完全で問題が発生したケースもある[3]。
概要
機能
INSERT・UPDATE・DELETEなどのSQLクエリの実行
以下の形式でのデータベースからの値の取得
配列
オブジェクト(定義されているクラスのインスタンスの作成)
同じスコープ内で有効な変数
文字列
複数次元の配列でのすべての行の取得
プリペアードステートメントの実行及びエミュレーション
トランザクションの使用
オートコミットのサポート
テーブルのカラムの一般化機能
プリペアードステートメントを使ったプログラム例
実装までの経緯
備考
注釈^ ⇒PHP: MySQL (最初の API) - Manual
^ ⇒PHP: MySQLi - Manual
^ ⇒PHP: 削除された拡張モジュールおよび SAPI - Manual
^ ⇒PHP: PostgreSQL - Manual
出典^ a b ⇒ThinkIT 第1回:PDOの概要 (1/3)
^ ⇒PDOでサクサクDB開発:CodeZine
^ ⇒PHP5.3.6からPDOの文字エンコーディング指定が可能となったがWindows版では不具合(脆弱性)あり
関連項目
関係データベース管理システム (RDBMS)
外部リンク
PHP: PDO - Manual PHP 公式サイト、PDO のマニュアル
⇒オンラインテストPDO関数
表
話
編
歴
PHP
実装
Zend Engine(公式)
HHVM
Parrot
Phalanger