今からスタート! PHP

第11回 データベースへのアクセス [PDO編]

この記事を読むのに必要な時間:およそ 3 分

SQLを準備する

関数で実行するSQLを準備するにはpg_prepare関数(PostgreSQLの場合)を用いるのでした。PDOではprepareメソッドを用います。その例をリスト4に示します。このとき$stmtにはPDOStatementインスタンスが代入されます。

リスト4 prepareの使用例

// $stmtはPDOStatementインスタンス
$stmt = $db->prepare( 'INSERT INTO bookmark( title, url ) VALUES ( :title, :url )' );

準備したSQLにパラメータを設定して実行

prepareメソッドによって準備されたSQLには,パラメータを設定できます。以下に4通りの方法を示します。

a.配列(array)で名前付きプレースホルダにパラメータを当てはめて実行

$stmt->execute( array( ':title' => $title, ':url' => $url ) );

上記で準備したSQL(INSERT文)には,実際にDB追加されるデータとして :title, :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();

配列ですべてのパラメータを一括して設定できない場合は,bindParamメソッドで1つずつデータを置き換えていき,必要なパラメータをすべて設定できた時点ではじめて実行することもできます。

PDO::PARAM_STRは,このパラメータをDB側では文字列型のデータとして受け取ってもらうように設定することを表します。後に続く数値は文字列の長さです。これらは一部の場合を除いて省略することもできます。

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();

プレースホルダが? の場合でも,bindParamメソッドは実行できます。どの ? にパラメータを当てはめるかは,文字列の先頭から数えた ? の位置で設定します。位置は最も先頭に近い ? が1,それ以降2, 3... となります。

クラスとメソッドのおさらい

今回用いたクラスとメソッドを表1に示します。newはメソッドではないのですが,決まり文句の1つとして一緒に掲げておきます。データベースの種類が違っていても,ほとんどのアクセス方法は同じですから,それぞれの実行環境で試してみてください。

クラスやメソッドの詳細は,PHPマニュアルなどを参照してください。

表1  今回用いたメソッドなど

PDOクラス new PDO(...) データベースに接続(※newは演算子)
query SQLをすぐに実行する
PDOStatementクラス prepare 実行するSQLを準備する
bindParam SQLにパラメータを当てはめる
execute パラメータを当てはめたSQLを実行する
PDOExceptionクラス getMessage エラーメッセージを参照

著者プロフィール

沖林正紀(おきばやしまさのり)

SE/プログラマを経て,WebアプリケーションやXMLなどについて雑誌記事や書籍の執筆活動を始める。大手メーカで製品資料の作成や,セミナーの講師を担当したこともある。現在は,取材記事や製品レビューなどに執筆活動の幅を広げる一方,プログラミング教材の開発も手がけている。

著書