この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
■プレースホルダ
SQL文作成時に、 実行時に値が決まる部分を「?」に置き換えて、
「?」に当てはめたい値を変数とか配列で指定します。
そうすると、SQLインジェクション対策のためのエスケープ処理を自動で行ってくれます。
————————————
$id = 6; $sql = select * from t_bbs where id = ?;
query($sql, $id);
————————————
「?」のところに「6」が入ります。 プレースホルダの使い方はこんな感じです。さくっといきます。
さて本題はここからですが、
プレースホルダは代入する数だけ「?」を適切な箇所に用意する必要があります。
例えば、上記の例を少し複雑にして、 複数のid値と一致したものをt_bbsから取得したいとします。
id値の数が固定なら頑張って下記のようにできますが・・・ スマートではありません・・・
$sql = select * from t_bbses where id = ? or id = ? or id = ?;
そこで、複数のid値を配列に格納して、かつその格納した数だけ「?」を生成してあげましょう。
$id = array(1,2,3); $holder = implode(‘, ‘, array_fill(0, count($id), ‘?’));
count()で配列の中身の数を取得し、
array_fill()により、0番目から配列の中身の数だけ「?」を挿入します。
implode()により、「?」と「?」の間に「,」を挿入します。
そうすると、出来上がりは、$holder = (?, ?, ?)となります。
$sql = select * from t_bbses where id IN ($holder); query($sql, $id); IN句を使ってまとめてあげると、すっきりしたSQL文の完成です!