2011-08-12 146 views
11

我的代码:绑定参数WHERE IN子句与PDO

$myArray = implode($myArray, ','); 
$sth = $dbh->prepare('SELECT foo FROM bar WHERE ids IN (:ids)'); 
$sth->bindParam(':ids', $myArray); 
$sth->execute(); 
$result = $sth->fetch(); 
echo $sth->rowCount(); 

始终显示为1的数,但是当我跳过参数化和刚才添加的变量本身在它的地方,我得到一个准确计数。这里发生了什么?

回答

12

您不能像这样绑定IN子句的参数。在$ myArray的字符串将只算一个值,就像如果你这样做:

SELECT foo FROM bar WHERE ids IN ('1,2,3') 

即使有三个逗号分隔值,数据库中读取它们作为唯一一个字符串值。

您需要手动将IN列表插入到旧式的查询方式中。

'SELECT foo FROM bar WHERE ids IN (' . $myArray .')' 

很遗憾没有其他办法。最起码到现在。

+7

认真?准备好的陈述不能处理?这是多么的蹩脚:/ – hoppa

+0

要注意sql注入。 – Dani

+5

@hoppa:他们可以像这样处理它:'id IN(:id1,:id2,:id3 ...)',你得到了模式。你最好用老式的方法。 – Maerlyn

6

我知道这个问题是旧的,但这个工作对我来说:

$arrayOfValues = array(1,2,3,4,5); 
$questionMarks = join(",", array_pad(array(), count($arrayOfValues), "?")); 
$stmt = $dbh->prepare("update some_table set end_date = today where value_no in ($questionMarks)"); 
$stmt->execute($arrayOfValues); 
0

你为什么不使用此解决方案?

https://stackoverflow.com/a/39353278/1834212

它解析其是对绑定占位符和它的元素的值的数组,在你只需要供给阵列的IN的情况下,然后将其将解析阵列和修改字符串为您使用动态生成的绑定名称,然后馈送数组的这些值