PHPでデータベースにアクセスする方法のうち,今回はPDO(PHP Data Objects)によって行う方法を紹介します。PDOをサポートしているデータベース(DB)を用いると,接続の時にその種類を指定する以外は,PDOによって統一化された方法でアクセスすることができます。関数の場合は接続するデータベースの種類ごとに関数名が変わりますが,PDOでは多くの機能がPDOクラスに集約され,各DBごとに特化したメソッドや定数についてのみ,DBの種類に応じた名称がつけられています。
PDOを利用するための設定
PDOを利用できるようにするには,事前に確認しておかなくてはならないことがあります。
接続するDBに対応したPDO用のドライバが用意されているか
ドライバとは,PDOによる接続を行うモジュールで,それぞれのDBMSごとに必要です。Oracle, PostgreSQLなど主なDBでは,あらかじめ用意されていることが多いですが,PHPプログラムがそれを利用可能になっているかは,php.iniという設定ファイルの内容を確認する必要があります。
本稿で用いるPostgreSQLの場合は,リスト1の設定をphp.iniに追加しなくてはなりません。行頭に;(セミコロン)がついている場合はセミコロンを削除します。
リスト1 php.iniの設定(Windows版PHPの場合)
extension=php_pdo.dll PDO全般
extension=php_pdo_pgsql.dll PostgreSQL向けのPDO関連機能
PHPでPDOが利用可能になっているか
これはDBアクセスを行うPDOというクラスをPHPプログラム内で利用できるかどうかということです。PHPの言語処理系をソースコードからコンパイルする時には,PDOを利用可能にするオプションを設定しなくてはなりません。詳細はオンラインマニュアルを参照してください。
PDOによるDBの接続と切断
前述しましたが,PDOによってDB接続を行うにはPDOというクラスを用います。クラスとは,プログラム内で扱うデータの型を新たに定義したものです。これによってオブジェクト指向という考え方に基づいたプログラミングを可能にします。
DB接続する場合は,それを表す変数に対してPDOインスタンスを代入します。インスタンスとは,クラスによって定義された型に対して,実際に処理するデータを当てはめたものです。ここでいうデータは,接続するDBを表す文字列,ユーザ名,パスワードなどです。
DBアクセスが終了し,切断する場合は,接続に用いた変数をunset関数により開放します。単にnullを代入するだけでもDBから切断できます。
リスト2にDBの接続と切断を行う例を示します。一連の処理を try {...} catch() {...} で囲んでいるところがポイントです。
リスト2 DBへの接続と切断の例
try {
// DBに接続する(PostgreSQLの場合)
$db = new PDO( 'pgsql:host=localhost port=5432 dbname=postgres', 'postgres', 'postgres' );
/* ..... DBアクセス ..... */
// DBから切断する ( $db = null; も可能)
unset( $db );
} catch( PDOException $ex ) {
// DBアクセスができなかったとき
print 'アクセスできません : ' . $ex->getMessage();
unset( $db );
die();
}
try {...} catch() {...} は, try {...} 内の処理でエラーが発生して例外がスロー(throw)されたことを察知すると,自動的に catch() {...} の処理を行うというものです。察知可能な例外の種類は catch() の()内で指定します。複数の例外を察知できるようにするには,その種類ごとに catch() が必要です。
ここでは() 内でPDOに関連した例外を表す PDOException が指定されていますので, catch() {...} 内の処理はPDOException,およびそれを継承した例外がスローされた時に実行されることになります。
SQLをすぐに実行する
関数でSQLをすぐに実行する時はpg_query関数(PostgreSQLの場合)を用いるのでした。このときPDOではqueryメソッドを用います。SELECT文を実行する例をリスト3に示します。この中で$rowはSELECTの実行結果を1行ずつ読み込むために用いる変数です。なお,SELECT文中のbookmarkテーブルについては前回を参照してください。
リスト3 SQL(SELECT文)を実行する例
$db = new PDO( ... ); // DB接続
foreach( $db->query( 'SELECT * FROM bookmark ORDER BY id' ) as $row ) {
// 文字コードを表示用に変換(UTF-8からシフトJISへ)
$title = mb_convert_encoding( $row[ 'title' ], 'SJIS', 'UTF-8' );
print 'id = ' . $row[ 'id' ] . ', title = ' . $title . ', url = ' . $row[ 'url' ] . "\n";
}
$db->query()は,PDOインスタンスが持つqueryメソッドを実行するという意味です。クラスには,実際の処理に用いるデータであるプロパティ(property)と,データを用いた処理を行うメソッド(method)とが同じクラスメンバとしてまとめられています。
メソッドは関数と同じように,必要な引数を設定して実行すると,結果を表す戻り値を受け取ることができます。queryはそのメソッドのうちの1つで,接続されたDBに対して,()内に記述されたSQL文を実行する処理を行います。

