在'IN(.....)'子句的查询中使用预准备语句?

时间:2011-05-20 14:04:50

标签: php pdo

是否有(棘手/非标准)方法?

会像

$stmt = $db->prepare( 'SELECT title FROM episode WHERE id IN (?, ?, ?, ?);

工作?因此,如果我想搜索可变数量的ID,我可以吗

$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);

即使这样可行,但对于使用相同的预准备语句运行多组数据仍然没有用,除非每次搜索的$ids集都是相同的长度而它不是使用名称占位符。

我假设你做了

$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%);

2 个答案:

答案 0 :(得分:10)

MySql有一个FIND_IN_SET函数,您可以使用它来实现相同的结果:

$ids = array(1,2,3,4,5,6,7);
$stmt = $db->prepare( 'SELECT title FROM episode WHERE FIND_IN_SET(id,?)' );
$param = implode(',',$ids);
$stmt->bind_param('s',$param); 
$stmt->execute(); 

答案 1 :(得分:-2)

避免使用IN子句的一种方法是使用以逗号分隔列表的形式进入IN(...)的值填充临时表;然后在临时表的列上进行INNER-JOIN或进行嵌套选择:

        inner join temptable T2 on T1.mycol = T2.col1

OR

       ...  where mycol in ( Select col1 from temptable)