logo

プリペアドステートメントのインタフェース

ヒューマンリソシア株式会社はコラム「プリペアドステートメントのインタフェース」を公開しました。

###

前回の続きになります。
前回は「?を使った」プリペアドステートメントのインタフェースをみましたが…あれ、順番を間違えると色々と悲劇や喜劇が起きるんですね。
なので、筆者は個人的にはあんまりお勧めしません。

んじゃどうするのかというと「名前付き」というのを用います。
説明するよりもコードを見てもらった方が早いと思うので、早速、まずはコードを見ていただきましょう。



MDB2の場合
$st = $mbd2_dbh->prepare(‘SELECT * FROM hoge_table WHERE hoge_id = :hogeid and hoge_string = :hogestring ;’, array(‘integer’, ‘text’);
$res = $st->execute( array(‘hogeid’ => 100, ‘hogestring’ => ‘hoge_main’) );

PDOの場合
$st = $pdo_dbh->prepare(‘SELECT * FROM hoge_table WHERE hoge_id = :hogeid and hoge_string = :hogestring ;’);
$st->bindValue(‘:hogeid’, 100, PDO::PARAM_INT);
$st->bindValue(‘:hogestring’, ‘hoge_main’, PDO::PARAM_STR);
$res = $st->execute();

MDB2の場合は「連想配列のキーがプレースホルダの名前に対応するように」する必要があります。:は不要ですね。
一方でPDOの場合は、bindValueの第一引数に名前を指定して、こちらは「:を含む」文字列にする必要があります。

もう一つ、インタフェースの話で割と見落としやすいところを。少し話は巻き戻りますが「DB接続時のエラー補足」が、両者で大分と趣を異にします。
MDB2はPEAR::isErrorというものを用いて判定をしますが、PDOは接続エラー時には例外を投げます。このあたりも「基本的な仕様」として、頭の片隅に入れておくとよい試験対策になるかと思います。

もう一点注意をしていただきたいのが。
コラムの4回目で「一端、PDO::queryで書き直して」と書いたので或いは気づかれている方もいらっしゃるかと思いますが、PDO使おうがMDB2使おうが「SQL-Injectionの可能性のある、危険なSQLを発行する」事は十分に可能です。
もちろん、継承で上書いて「queryメソッドを殺す」ことも可能ですが。ちなみにこれは「オーバーライド」と呼称します。「上位クラスのメソッドの再定義(上書き)」ですね。

この続きは以下をご覧ください
リンク

関連情報
http://resocia.jp/
本プレスリリースは発表元企業よりご投稿いただいた情報を掲載しております。
お問い合わせにつきましては発表元企業までお願いいたします。