WHERE IN子句与PDO的绑定参数

Rad*_*adu 13 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();
Run Code Online (Sandbox Code Playgroud)

始终显示计数为1,但是当我跳过参数化并只是将变量本身添加到其中时,我得到一个准确的计数.这里发生了什么?

Atl*_*tli 11

您不能像这样绑定IN子句的参数.$ myArray字符串只计为一个值,就像你这样做:

SELECT foo FROM bar WHERE ids IN ('1,2,3')
Run Code Online (Sandbox Code Playgroud)

即使有三个逗号分隔值,数据库也只将它们作为一个字符串值读取.

您需要手动将IN列表插入到查询中,即旧式方式.

'SELECT foo FROM bar WHERE ids IN (' . $myArray .')'
Run Code Online (Sandbox Code Playgroud)

遗憾的是没有别的办法.至少现在(是.

  • 真的吗?准备好的陈述无法处理?这有多蹩脚:/ (11认同)
  • @hoppa:他们可以像这样处理它:`id IN(:id1,:id2,:id3 ......)`,你得到了模式.使用oldschool方法你会更好. (5认同)
  • 这个问题证实了这一点:http://stackoverflow.com/questions/920353/php-pdo-can-i-bind-an-array-to-an-in-condition (2认同)

小智 7

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

$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);
Run Code Online (Sandbox Code Playgroud)