是否有(棘手/非标准)的方式来做到这一点?
会是这样的
$stmt = $db->prepare( 'SELECT title FROM episode WHERE id IN (?, ?, ?, ?);
$ids = array(1,2,3,4,5,6,7);
$idSection = implode(array_pad(array(), count($ids), '?')) //To give ?,?,?,?,?,?,?
$stmt = $db->prepare( 'SELECT title FROM episode WHERE id IN ($idSection);
$stmp->execute($ids);
即使这样可行,但对于使用相同的预准备语句运行多组数据仍然没有用,除非每次搜索的$ID集都是相同的长度,并且它不适用于名称占位符.
如果你这样做,我假设
$stmt = $db->prepare( 'SELECT title FROM episode WHERE id IN (:ids);
$ids = implode('","' array(1,2,3,4,5,6,7));
$stmt->bindParam( ':ids', $ids);
它失败是因为准备好的语句被构造成它将搜索单个id值并且“1”,“2”,“3”,“4”,“5”,“6”,“7”将不匹配?
我确信有一个更好的答案,而不仅仅是不使用IN(…)子句.我是否只需手动清理$ids术语并将其包含在没有占位符的查询中?
$stmt = $db->prepare( "SELECT title FROM episode WHERE id IN $ids AND genre like :genre");
$stmt->bindParam( ':genre', '%$genre%);
解决方法:
避免使用IN子句的一种方法是使用将作为逗号分隔列表进入IN(…)的值填充临时表;然后在temp-table的列上进行INNER-JOIN或者进行嵌套选择:
inner join temptable T2 on T1.mycol = T2.col1
要么
... where mycol in ( Select col1 from temptable)