カテゴリー
コンピューター

動的に SQL の IN 句のバインドを生成する方法をメモ【PHP】

サンプルソース

<?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;
?>

使っている関数へのリンクまとめ

おわりに

EC-CUBE のプラグインを適当に作っておりましたら、カートに入れた商品の種類で検索を掛けたくなってしまいまして。ほら、カートに入れる商品の種類や数って、そのときのお買い物によってまちまちですよね?

それで、商品種類数がわかれば動的に IN 句のバインドが作れるだろうとはわかっていたのですけれども、エレガントに短く行う方法はないかと試しているときに次のページに出会いました。よく練られた、素晴らしいページです。ありがとうございます!

本投稿の内容は、参考ページを実際にやってみて、わたくしなりに解説しなおしたというものです。アイデアにオリジナリティはなく、全て参考ページから勉強させていただきました。

以上です。

コメントを残す