プログラミング言語マスターへの道


PDOって何?

PDOとは、PHP Data Objectのことで、PHPに実装されているデータベース抽象化レイヤクラスです。要約すると、1つの関数で複数のデータベース(DBMS、RDBMS)へのアクセスを可能とします。
PDOを使うことで、どのデータベースを利用する場合でも同じ関数を使うことができますので、もし将来データベースを変更することがあっても、PDOオブジェクトを作成する時に指定したパラメータだけを変更するばいいことになります。

PDOと関数

今まではデータベースの種類によって利用する関数を分けていました。例えばMySQLへ接続する場合は「mysql_connect」関数で接続していましたし、PostgreSQLの場合は「pg_connect」関数で接続していました。データベースを固定している場合は問題がありませんが、もし将来的に違うデータベースへの変更や移植もする場合には、全て書き換えなくてはいけません。PDOは2005年11月24日にリリースされたPHP5.1以降に標準で利用できるようになっています。

PDOの特徴

PDOはデータベースの違いを吸収し、共通の関数でデータベースを操作できるように設計されています。また、拡張モジュール(PECL)として提供されています。
現在、MySQL、PostgreSQL、SQLiteなど、多くのデータベースシステムが存在しています。PDOは、これら複数のデータベースの違いを完全にとはいきませんが、意識することなく一つの関数で操作する機能を開発者に与えます。

もっとPDO

PDOは主要なデータベースのほとんどをサポートしているので、PEAR::DBなどからの移行も比較的容易です。そして、PDOはPHP 5で実装された例外処理も扱えるため、PEAR::DBなどで例外処理に悩んだ開発者にとって有効な選択肢であると言えます。ここで注意して欲しいのは、PDOはデータベースへのアクセスを抽象化するためのクラス群であり、O/Rマッピングツールが行っているようなデータベースの抽象化を行うレイヤではないということです。

PDOの必要環境

PDOはPHP 5.1から標準で導入されるようになりました。Windows/UNIXを問わず利用することができます。よってPHP 5.1の環境と、PDOの動作に必要なデータベースの構築を行ってください。

PDOの機能

(1)INSERT・UPDATE・DELETEのSQLクエリの実行
(2)以下の形式でのデータベースからの値の取得 配列
◇オブジェクト(定義されているクラスのインスタンスの作成)
◇同じスコープ内で有効な変数
◇文字列
(3)複数次元の配列でのすべての行の取得
(4)プリペアードステートメントの実行
(5)トランザクションの使用
(6)オートコミットのサポート
(7)テーブルのカラムの一般化機能

PDO実装までの経緯

PHPは、WEBアプリケーション作成の開発に適した言語です。WEBアプリケーションと連携する多くのデータベースへアクセスする機能も標準で備えていますが、その接続するための命令はそれぞれのデータベース毎に異なっていました。
mySQLではmysql_connect、PostgreSQLではpg_connectなど、データベース毎に異なっていました。また、関数に渡すパラメータなども各データベースによって異なるなど、複数のデータベースをサポートする開発者にとって多大な負担になっていました。
PHP4では、PEARの1つとしてPEAR::DBがあり、これがデータベースへのアクセス機能をまとめ、共通のAPIを提供していました。
しかし、この機能はPHPスクリプトで書かれているため、速度面で遅くなりがちという欠点を抱えていたのです。中小規模のシステムならともかく、大規模なシステムではその速度の遅さが欠点となっていました。
そこで、PHP5からはC言語で書かれた拡張モジュールとしてPDOが作成・提供されることとなりました。

注意点

各データベースの独自実装SQLや、複雑な処理の違いを完全に吸収するわけではありません。あくまでリスク低減、開発工数の削減がある程度可能となっているだけである。過信は禁物です。環境によっては、SQLインジェクションの問題が発生します。

PDOとPHP

PHPPEAR::DBとの違いって?
PHPと同様の仕組みとしてPEAR::DBやCreoleなどがありますが、それらはPHPで用意されているネイティブドライバ(ネイティブ関数)をPHPスクリプトでラッピングしているため、実効速度が遅いなどの問題が生じます。PDOはPHPスクリプトとネイティブドライバの組合せでは無く、PHP Extension(PHP拡張)として利用できるため、速度面ではさほど心配は要らないといわれています。PEAR::DBやPEAR::MDBなどは、PHPで用意されている多くのネイティブなデータベースアクセスのための関数をPHPスクリプトでまとめ、共通のAPIを提供しています。
速度と例外処置
しかしながら、その共通のAPIを提供している部分はPHPスクリプトで書かれているため、速度面での期待はできません。また、PHP 5で開発している開発者にとって、PHP 4で実装が進んでいるこれらのレイヤークラス群は例外処理などで歯がゆい思いをしていると思います。
ネイティブ関数群との違いって?
PHPには多くのデータベースに対応している、データベース固有の関数群があります。このようなデータベース固有のネイティブドライバは速度面での期待はもちろん、データベース特有の機能を使える半面、データベースごとに用意されている関数が共通化されていません。また、これらの関数もやはり、PHP 5に特化されているとは言いがたいものが多いです。