PHP PDO:更新SQL WHERE IN()子句中的数组

时间:2012-05-12 02:21:39

标签: php sql arrays pdo where-clause

我正在尝试获取一组ID号并使用该ID号更新每一行。 PHP PDO代码如下:

private function markAsDelivered($ids) {
  $update = $this->dbh->prepare("
     UPDATE notifications
     SET notified = 1
     WHERE notification_id IN (
        :ids
     )
  ");
  $ids = join(',', $ids);
  Logger::log("Marking the following as delivered: " . $ids, $this->dbh);
  $update->bindParam(":ids", $ids, PDO::PARAM_STR);
  $update->execute();
}

但是,运行此选项时,虽然正在记录多个ID号,但只会更新列表中的第一项。如何修改此更新以更新多行?

1 个答案:

答案 0 :(得分:6)

占位符只能表示单个原子值。它有点工作的原因是因为mysql看到的值是'123,456'形式,它将其解释为整数,但一旦遇到非数字部分(逗号)就丢弃其余的字符串。

相反,做一些像

这样的事情
$list = join(',', array_fill(0, count($ids), '?'));
echo $sql = "...where notification_id IN ($list)";
$this->dbh->prepare($sql)->execute(array_values($ids));