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

※この記事は読者によって投稿されたユーザー投稿のため、編集部の見解や意向と異なる場合があります。また、編集部はこの内容について正確性を保証できません。

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

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

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

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/

この記事が役に立ったらシェア!
メルマガの登録はこちら Web担当者に役立つ情報をサクッとゲット!

人気記事トップ10(過去7日間)

今日の用語

robots.txt
ロボット型の検索エンジンが自分のページを登録しないようにするためにサイト管理者が ...→用語集へ

インフォメーション

RSSフィード


Web担を応援して支えてくださっている企業さま [各サービス/製品の紹介はこちらから]