「IN」の値には、多くの?
プレースホルダが必要です。
ので:
$related = array(1,2,3); // your "IN" values
$sql = "SELECT id,title,pic1 FROM tbl_products WHERE id IN (";
$questionmarks = "";
for($i=0;$i<count($related);$i++)
{
$questionmarks .= "?,";
}
$sql .= trim($questionmarks,",");
$sql .= ") LIMIT 3;";
// echo $sql; // outputs: SELECT id,title,pic1 FROM tbl_products WHERE id IN (?,?,?) LIMIT 3;
$q = $db->prepare($sql);
$q->execute($related); // edited this line no need to array($related), since $related is already an array
echo $q->rowCount();
https://3v4l.org/No4h1
(あなたが4つのレコードをしたい場合もLIMIT 3
を取り除く返される)
もっとエレガントなあなたは、このようなあなたのプレースホルダを追加するstr_repeatを使用することができます。
$related = array(1,2,3); // your "IN" values
$sql = "SELECT id,title,pic1 FROM tbl_products WHERE id IN (";
$sql .= trim(str_repeat("?,",count($related)),",");
$sql .= ") LIMIT 3;";
// echo $sql; // outputs: SELECT id,title,pic1 FROM tbl_products WHERE id IN (?,?,?) LIMIT 3;
$q = $db->prepare($sql);
$q->execute($related); // edited this line no need to array($related), since $related is already an array
echo $q->rowCount();
https://3v4l.org/qot2k
また、もう一度あなたの質問を読んで、私はあなた$related
変数が1,40,6,99
のような値のカンマで区切られた数字とちょうどstring
であることを推測することができます。その場合はarray
にする必要があります。 do:$related = explode($related,",");
これを数字の配列にします。あなたのexecute
メソッドでは、そのまま$related
を渡します。
[FIND \ _IN \ _SET()vs IN()]の重複している可能性があります(http://stackoverflow.com/questions/4155873/find-in-set-vs-in) –
一般的な方法は、関係のための余分なテーブル。これは悪いデータベース設計です。 –
@GeraldSchneider私はこれを知っています、これは私の質問の単なるサンプルです。 –