Php 带PDO的WHERE IN子句的绑定参数

Php 带PDO的WHERE IN子句的绑定参数,php,mysql,pdo,Php,Mysql,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,但当我跳过参数化并将变量本身添加到它所

我的代码:

$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,但当我跳过参数化并将变量本身添加到它所在的位置时,我会得到一个准确的计数。这是怎么回事?

不能像这样为IN子句绑定参数。$myArray字符串将仅计为一个值,就像您这样做:

SELECT foo FROM bar WHERE ids IN ('1,2,3')
即使有三个逗号分隔的值,数据库也只将它们作为一个字符串值读取

您需要手动将IN列表插入到查询中,这是传统的方式

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

不幸的是,没有其他办法。至少现在是这样。

我知道这个问题很老了,但这对我来说很有用:

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

你为什么不使用这个解决方案呢


它解析一个值数组,这些值是绑定占位符对及其元素,如果是,您只需要输入一个数组,然后它将解析该数组并使用动态生成的绑定名称为您修改字符串,然后输入数组的这些值

?事先准备好的陈述不能处理吗?这有多蹩脚:/@hoppa:他们可以这样处理:
id在(:id1,:id2,:id3…)中,你得到了模式。你最好还是用老派的方法。这个问题证实了这一点:@Jared,我想我的问题是重复的。应该更多地搜索:(不用担心,这个问题是从2009开始的。你知道的,PDO可能已经修补了支持这一点。考虑到另一个问题的年龄,我不会认为这是重复的。)