vol.4 ‐ 『「既存の改修」を目的にしたオブジェクト指向とプリペアドステートメントのインタフェース』

前回に引き続き「改修」という実務的ネタを学びつつ「試験対策」を兼ねてみよう、という試みのコラム第二弾でございます。
とりあえず前回で「DBハンドルの定数があちこちに散らかっている状況」をどうにかするために、まずは「PDOにおけるデータベースハンドルの取得を、クラス化することでDRYにする」状況を作りました。

次の一手は…分量にもよるのですが、個人的には次の手順をお勧めします。

  • 一端、PDO::queryで書き直して、まずは「DBアクセスは全てPDO経由」にする
  • 全体的にプリペアドステートメントで書き直す
  • 部分的な「「HTML用のエスケープ処理」をしてからDBに入れているレコード」に、個別に対応をしていく

このあたりは正直、ある程度「力技」ですね。UNIX系等で開発している場合、grepコマンドがこういう時に「びっくりするくらい」役に立ちますので、是非使ってみてください。

さて。
力技部分は「がんばってもらう」よりほかないので。今回は「プリペアドステートメント」の、ちょっと技術的な部分に焦点を当てて、少し深掘りしていこうかと思います。
PHP上級試験用の教科書であるオライリー社の「プログラミングPHP」では、基本的にはPEAR::DB、付録的にPDOの話が出ています。
書籍の初版が2007年なのでやむなしとは思うのですが、PEAR::DBは現在(というか大分前に)開発が止まってしまい、後続はPEAR::MDB2になっています。
幸い、PEAR::DBとPEAR::MDB2のインタフェースは似ておりますので、さほど弊害はないのですが。
以下、MDB2と書いてあるときはおおむね「あぁPEAR::DBも含むんだろうなぁ」という感じでご覧いただければ幸いです。

今回議論の俎上に載せたいのは「静的バインドのインタフェース」です。
同じ静的バインドという機構ではありますが、MDB2とPDOとで大分「異なる」インタフェースを持つので。善し悪しを論じる訳ではないのですが、差異くらいは把握しておきたいなぁ、というのが今回の趣旨になります。

まず「プリペアドステートメント」で「ここにバインドしてくださいませ」を示す方法ですが、双方に共通な手法として「?を用いる」という手法があります。

SELECT * FROM hoge_table WHERE hoge_id = ?;

この?に「後で値をバインドするから」と意思表示をするわけですね。ちなみにこの?は複数書けます。今回は以下のSQLを前提にしてみましょう。

SELECT * FROM hoge_table WHERE hoge_id = ? and hoge_string = ?;

ではこの?に値をどうやってバインドするか?というと、以下のようなインタフェースになります。

MDB2の場合
$st = $mbd2_dbh->prepare('SELECT * FROM hoge_table WHERE hoge_id = ? and hoge_string = ?;');
$res = $st->execute( array(100, 'hoge_main') );

PDOの場合
$st = $pdo_dbh->prepare('SELECT * FROM hoge_table WHERE hoge_id = ? and hoge_string = ?;');
$res = $st->execute( array(100, 'hoge_main') );

PDOの場合その1
> $st = $pdo_dbh->prepare('SELECT * FROM hoge_table WHERE hoge_id = ? and hoge_string = ?;');
$st->bindValue(1, 100);
$st->bindValue(2, 'hoge_main');
$res = $st->execute();

色々あります…が、実は上述はいずれにしても「よろしくない」実装方法です。理由は簡単で、各カラムに対してデータ型を明示していないからです。
では、型を指定した状態のコードを書いてみましょう。

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

PDOの場合
$st = $pdo_dbh->prepare('SELECT * FROM hoge_table WHERE hoge_id = ? and hoge_string = ?;');
$st->bindValue(1, 100, PDO::PARAM_INT);
$st->bindValue(2, 'hoge_main', PDO::PARAM_STR);
$res = $st->execute();

インタフェースが、似ているようで違いますね。
次回は「?を用いない」インタフェースを学びます。

Rails初級者に朗報!全額補助で中級にステップアップ!

古庄道明氏

古庄 道明 氏

1970年浅草生まれ 1995年に富士通系のソフトハウスに就職しプログラマに転身。1999年個人事業主として独立し現在に至る。「寺子屋」「格子組」といったエンジニア支援活動を独自に展開し、占い師時代の「ガルーダ」という占い師名にちなんだ「がる先生」の愛称で親しまれている。
コンサルティングからシステム設計、ネットワークにセキュリティと、守備範囲は比較的多岐に渡る。「技術の基本は、その技術がない時の"困ってる"が根っこ」をモットーに、古い話から現代へ歴史をたどるように教えるのが持ち味。

※本サイトに掲載されているテクニカル・コラムは、掲載時点で公開されている情報をもとに執筆者の視点で書かれたものです。弊社及び執筆者は本テクニカル・コラムの内容について一切保証をいたしません。また、技術的な問い合わせについても対応いたしかねますので予めご了承ください。

お仕事のご紹介には、まずヒューマンリソシアへの登録が必要です。
ヒューマンリソシア人材派遣サイトの便利な機能 ・お気に入りの派遣求人のブックマーク ・登録会への予約 ・有給休暇の管理 ・WEB給与明細の確認 ・お気に入りの情報をメール受信
登録会の入力手続きをあらかじめおこなえます。

ヒューマンリソシア派遣サービスに 登録する 無料

ページトップへ戻る