プリペアドステートメントのインタフェース
- 編集部の見解や意向と異なる内容の場合があります
- 編集部は内容について正確性を保証できません
- 画像が表示されない場合、編集部では対応できません
- 内容の追加・修正も編集部では対応できません
ヒューマンリソシア株式会社はコラム「プリペアドステートメントのインタフェース」を公開しました。
前回の続きになります。
前回は「?を使った」プリペアドステートメントのインタフェースをみましたが…あれ、順番を間違えると色々と悲劇や喜劇が起きるんですね。
なので、筆者は個人的にはあんまりお勧めしません。
んじゃどうするのかというと「名前付き」というのを用います。
説明するよりもコードを見てもらった方が早いと思うので、早速、まずはコードを見ていただきましょう。
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/column/16/
ソーシャルもやってます!