TOP書籍連動> PDOを使ってみる
PDOの紹介
PDOの紹介

第1回:PDOの概要

著者:Ilia Alshanetsky   2005/12/6
前のページ  1  2  3
PDOを使ってみる

   PDOを使うといっても、他のデータベースのインタフェースを使用するのとそれほど変わりありません。まず他のインタフェースと同じように、データベースとのコネクションハンドルを作成します。PDOの場合はPDOオブジェクトのインスタンスを作成します。オブジェクトのコンストラクタはいくつかの引数を取りますが、必須なのはDSNの引数だけです。

   DSNはほとんど場合、ホストネームとデータベースを指定します。PostgreSQLやFirebirdなどのデータベースでは、ログインユーザとパスワードを特定するために使用されますが、ほとんどのデータベースではログイン情報はコンストラクタの第2、第3引数で個別に指定します。

   また、コンストラクタはオプションで第4引数にそのほかの設定を配列形式で指定することもできます。これら追加の設定は接続を開始する段階でのみ指定することができる値で、コネクション全体に関わるオートコミットの設定やエラーレポーティングの設定などがあります。

⁄⁄MySQL connection
new PDO('mysql:host=localhost;dbname=testdb',
$login, $passwd);

⁄⁄PostgreSQL
new PDO('pgsql:host=localhost port=5432
dbname=testdb user=john password=mypass');

⁄⁄SQLite
new PDO('sqlite:/path/to/database_file');

   DSNの引数の最初の部分はPDOのどのドライバを使用するのかを決定するために、mysql:などのデータベースを指定する値にしなければなりません。残りの部分で接続時に必要なパラメータを指定します。

   大抵はMySQLドライバを使用している例のようにコネクションのトークンはセミコロンで分割されます。注意しなければならないのが、PostgreSQLにおいてデータベースクライアントが独自のDSNをサポートしているので、PDOでも簡単のためにネイティブなフォーマットでの記述をサポートしていることです。

   SQLiteも例外であり、次のような規則があります。データベースがファイルなのでドライバ以外のDSNはデータベースファイルへのパスになるか、メモリベースのデータベースを表す:memoryとなります。接続の過程だけがPDOのデータベース間で異なる部分です。その他のコードは標準化されており、すべてのデータベースで同じです。

   多くのオブジェクト指向のエクステンションのように、オブジェクトの生成に失敗するとデータベースとの接続に失敗したとみなされ、PDOはPDOException型の例外を投げます。投げられた例外はキャッチしなければなりません。例外をキャッチしない場合、PHPでは実行がそこで終了してしまうfatal errorとなってしまいます。

try {
     $db = new PDO(…);
} catch (PDOException $e) {
     echo $e->getMessage();
}

   大抵の場合は例外から取得できるメッセージによって、データベースとのコネクションが確立できなかった理由がわかります。すべての例外において追加されたメソッドが使用可能で、例外の起きた場所を収集するgetFile()メソッドとgetLine()メソッドを使用して例外の起きた場所の情報を収集することができます。

   さらに、getTrace()を使用することで、問題を起こすコードを呼び出す関数やメソッドのリストを取得することも可能です。

   スクリプト内にデータベース認証用のDSNが直接含まれていることが望ましくない場合があります。そのような場合のために、PDOには先ほどの例で示されたデフォルトモードに2つの代替手段を用意してあります。1つめの方法は、完全にDSNを格納することができる初期設定ファイルを使用することであり、このファイルはpdo.dsn.nameなどの特殊なnameトークンを使用することで参照されます。この初期設定ファイルには範囲制限がありません。つまり、php.ini、httpd.confやApacheサーバ上の.htaccessで設定することができ、さらにはini_set()関数を用いてそのスクリプト内で定義することさえできます。

ini_set("pdo.dsn.name","sqlite::memory:");
$db = new PDO("name");

   トークンは実際はINI設定名の最後の部分です。したがって、簡単にPDO("ilia")を作成することもできて、その場合DSNはpdo.dsn.iliaから取得されることになります。このように命名規則が設定されていることには、ある実用的な目的があります。

   名前を自由につけられることで、アプリケーションではコンフリクトを起こすことなくそれぞれ独自の接続文字列を定義することができます。例えばPHPmyGalleryがpdo.dsn.galleryを使用していても、同じバーチャルホスト上で起動しているFUDforumはpdo.dsn.fudforumを使用することが可能です。

   DSNを指定するもう1の方法は、URIに接続文字列を含んだ設定ファイルへのパスを組み合わせて使用することです。この方法は、それぞれのデータベース接続要求にそれぞれ別の追加ファイルが必要なため幾分非効率的ですが、状況によっては使用する価値があります。

$db = new PDO("uri:/etc/app/config" .
     md5($_SERVER['DOCUMENT_ROOT']));

   例えば、同じコードベースを使用して50のアプリケーションをそれぞれ違うデータベースを使用してインストールしたいとします。それぞれのアプリケーションに、アプリケーションが起動しているドキュメントルートのmd5ハッシュを用いて定めた別々のDSNを探させることができます。

   このような場合、カスタムな設定ファイルがインストールの過程で簡単に生成されるのでコードを変更する必要はありません。

前のページ  1  2  3


Ilia Alshanetsky
著者プロフィール
Ilia Alshanetsky
PHP開発チームの活動メンバーの1人であり、現在のPHP 4.3.X.のリリースマネージャー。また、オープンソース掲示板FUDフォーラム(http://fud.prohost.org/forum/)をはじめとする数多くのプロジェクトにも貢献している。


INDEX
第1回:PDOの概要
  PDOの紹介
  現在の状況
PDOを使ってみる