PHPでデータベースにアクセスする方法のうち、
PDOを利用するための設定
PDOを利用できるようにするには、
接続するDBに対応したPDO用のドライバが用意されているか
ドライバとは、
本稿で用いるPostgreSQLの場合は、
extension=php_pdo.dll PDO全般
extension=php_pdo_pgsql.dll PostgreSQL向けのPDO関連機能
PHPでPDOが利用可能になっているか
これはDBアクセスを行うPDOというクラスをPHPプログラム内で利用できるかどうかということです。PHPの言語処理系をソースコードからコンパイルする時には、
PDOによるDBの接続と切断
前述しましたが、
DB接続する場合は、
DBアクセスが終了し、
リスト2にDBの接続と切断を行う例を示します。一連の処理を try {...} catch() {...} で囲んでいるところがポイントです。
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 {...} 内の処理でエラーが発生して例外がスロー
ここでは() 内でPDOに関連した例外を表す PDOException が指定されていますので、 catch() {...} 内の処理はPDOException、
SQLをすぐに実行する
関数でSQLをすぐに実行する時はpg_
$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()は、
メソッドは関数と同じように、
SQLを準備する
関数で実行するSQLを準備するにはpg_
// $stmtはPDOStatementインスタンス
$stmt = $db->prepare( 'INSERT INTO bookmark( title, url ) VALUES ( :title, :url )' );
準備したSQLにパラメータを設定して実行
prepareメソッドによって準備されたSQLには、
a.配列(array)で名前付きプレースホルダにパラメータを当てはめて実行
$stmt->execute( array( ':title' => $title, ':url' => $url ) );
上記で準備したSQL
b.bindParamメソッドで名前付きプレースホルダにパラメータを当てはめる
$stmt = $db->prepare( 'INSERT INTO bookmark( title, url ) VALUES ( :title, :url )' );
$stmt->bindParam( ':title', $title, PDO::PARAM_STR, 100 );
$stmt->bindParam( ':url', $url, PDO::PARAM_STR, 200 );
$stmt->execute();
配列ですべてのパラメータを一括して設定できない場合は、
PDO::PARAM_
c.配列を用いて ? で表されたプレースホルダの順にパラメータを当てはめて実行
$stmt = $db->prepare( 'INSERT INTO bookmark( title, url ) VALUES ( ?, ? )' );
$stmt-<execute( array( $title, $url ) );
プレースホルダは ?
で記述することもできます。この場合はSQL文中の先頭に近い ?
から順に配列の要素をパラメータとして当てはめてからSQL文を実行します。
d.bindParamメソッドで ? で表されたプレースホルダの位置を表す番号でパラメータを当てはめる
$stmt = $db->prepare( 'INSERT INTO bookmark( title, url ) VALUES ( ?, ? )' );
$stmt->bindParam( 1, $title );
$stmt->bindParam( 2, $url );
$stmt->execute();
プレースホルダが?
の場合でも、?
にパラメータを当てはめるかは、?
の位置で設定します。位置は最も先頭に近い ?
が1、
クラスとメソッドのおさらい
今回用いたクラスとメソッドを表1に示します。newはメソッドではないのですが、
クラスやメソッドの詳細は、
PDOクラス | new PDO(...) | データベースに接続 |
query | SQLをすぐに実行する | |
PDOStatementクラス | prepare | 実行するSQLを準備する |
bindParam | SQLにパラメータを当てはめる | |
execute | パラメータを当てはめたSQLを実行する | |
PDOExceptionクラス | getMessage | エラーメッセージを参照 |