サンプルソース
<?php // table の id に対して次の値が検索条件として渡されてくると仮定 $data = array(2, 7, 14, 23); /* * 入力値の数だけ ,? を繰り返し、2文字目以降を取得することで動的に SQL の IN 句のバインドを生成 * * 1.count(array(2, 7, 14, 23)) で渡されてきた入力パラメーターの数をかぞえる。結果は 4 となる。 * 2.str_repeat(',?', 4) で ',?' を 4 回繰り返す。結果は ,?,?,?,? となる。 * 3.substr(',?,?,?,?', 1) で ,?,?,?,? 文字列の 2 番目から最後までを返す。結果は ?,?,?,? となる。 */ $sql = 'SELECT * FROM testtable WHERE id IN(' . substr(str_repeat(',?', count($data)), 1) . ')'; // SELECT * FROM testtable WHERE id IN(?,?,?,?) と表示されれば成功! echo $sql; ?>
使っている関数へのリンクまとめ
- PHP: count – Manual
count — 変数に含まれるすべての要素、 あるいはオブジェクトに含まれる何かの数を数える - PHP: str_repeat – Manual
str_repeat — 文字列を反復する - PHP: substr – Manual
substr — 文字列の一部分を返す
おわりに
EC-CUBE のプラグインを適当に作っておりましたら、カートに入れた商品の種類で検索を掛けたくなってしまいまして。ほら、カートに入れる商品の種類や数って、そのときのお買い物によってまちまちですよね?
それで、商品種類数がわかれば動的に IN 句のバインドが作れるだろうとはわかっていたのですけれども、エレガントに短く行う方法はないかと試しているときに次のページに出会いました。よく練られた、素晴らしいページです。ありがとうございます!
本投稿の内容は、参考ページを実際にやってみて、わたくしなりに解説しなおしたというものです。アイデアにオリジナリティはなく、全て参考ページから勉強させていただきました。
以上です。