微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 在’IN(…)’子句的查询中使用预准备语句?

是否有(棘手/非标准)的方式来做到这一点?

会是这样的

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

即使这样可行,但对于使用相同的预准备语句运行多组数据仍然没有用,除非每次搜索的$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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐