2016-06-15 115 views
0

我以这种格式在MySQL内部的一个字段中存储了一些数据:1,5,9,4
我把这个字段命名为有关。现在我想在IN子句PDO内使用此字段。我将这些字段内容存储在$related版本中。这是我的下一个代码:如何使用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),我可以获取只有一个记录。我做错了什么?

+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变量只是一个string与像1,40,6,99值逗号分隔的数字。如果是这种情况,您需要将其设为array。做:$related = explode($related,",");使它成为一个数组数组。然后在您的execute方法中按原样传递$related