人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPでMysqlのクエリ文で、条件数が可変時、スマートに文を作る

こんにちは、PHPとMysqlで何か作ろうとしている初心者です。

mysqlでクエリを送るときに例えば…
$stmt = $pdo->prepare("SELECT hoge FROM hogetable WHERE id=? or id=?");
$id=array(56,34);
$stmt->execute($id);
といった文を書くと思います。この状況でidの数を可変にしたい時
自分はまず"SELECT hoge FROM hogetable WHERE"だけの文を作り、
executeする配列数文、"or id=?"を結合し、最後にいらいない"or"をltrimして
最初に書いた文に結合、executeしているのですが、もっとラクな方法はないでしょうか?
それともこのやり方が普通なんですかね?

回答いただけたら有難いです。

●質問者: 匿名質問者
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● 匿名回答1号

普通、複数の値を ORしたい場合は inを使います。

id in (?,?,?)


匿名質問者さんのコメント
回答ありがとうございます。 しかし、その場合でも条件の数が可変であれば ",?"を結合して最後に","をltrimしなくてはいけませんよね?

匿名回答1号さんのコメント
?の数は たくさんにしておいて 配列の数を超えた分は 最初の 数にしておけばいいかもしれません。 たとえば 配列が 1,2,3とあったら ?,?,?,?,? で作って 1,2,3,1,1 とすればいいでしょう。

匿名質問者さんのコメント
回答ありがとうございます。 なるほど!その手がありましたか!

2 ● 匿名回答2号
ベストアンサー

"or id=?"を結合し、最後にいらいない"or"をltrim


php覚えたいなら文字列操作関数覚えたほうがよくない?
http://php.net/manual/ja/function.str-repeat.php

$id=array(56,34);
$sql = "SELECT hoge FROM hogetable WHERE id=?" . str_repeat(" or id=?", count($id) - 1);
$stmt = $pdo->prepare($sql);
$sql = "SELECT hoge FROM hogetable WHERE id in (?" . str_repeat(",?", count($id) - 1) .")";

匿名質問者さんのコメント
回答ありがとうございます。 文字列操作関数を知った気になっていましたが 結構バリエーションがあるんですね…

3 ● 匿名回答3号

配列の要素数だけ ? を , でつなぎたいって事だから
? が同じ要素数だけある配列を作って , で連結すれば得られるでしょう。

$id = array(56,34);
$sql = 'SELECT hoge FROM hogetable WHERE id IN ('
 . (empty($id) ? '0' : implode(',', array_fill(0, count($id), '?')) )
 . ')';

匿名質問者さんのコメント
回答ありがとうございます。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ