2016-06-15 1 views
0

私はこの形式でMySQLの内部のフィールドのいくつかのデータを保存:1,5,9,4
私は関連このフィールドの名前。今私はこのフィールドをIN節PDOで使いたいと思います。私はそのフィールドの内容を$related variabeに保存しました。これは私の次のコードです:IN節でPDOプリペアドステートメントを使用するには?

$sql = "SELECT id,title,pic1 FROM tbl_products WHERE id IN (?) LIMIT 4"; 
$q = $db->prepare($sql); 
$q->execute(array($related)); 
echo $q->rowCount(); 

しかし、私は4つの記録(1,5,9,4)をフェッチする必要があるのに対し、このコードを実行した後、私は1つのレコードのみを取得することができます。私は何を間違えたのですか?

+0

[FIND \ _IN \ _SET()vs IN()]の重複している可能性があります(http://stackoverflow.com/questions/4155873/find-in-set-vs-in) –

+1

一般的な方法は、関係のための余分なテーブル。これは悪いデータベース設計です。 –

+0

@GeraldSchneider私はこれを知っています、これは私の質問の単なるサンプルです。 –

答えて

0

「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を渡します。

関連する問題