我正在使用PHP编程来创建一个PDO语句。
PDO预处理语句如下:
更新`log` SET `id` = ? WHERE `id` IN ( ? );
IN数组中的变量内容是整数。
第一个?是一个单独的整数。第二个?是一个整数数组,所以我将它们连接成字符串1,2,3,这个字符串通常适用于IN数组。
所以完整的代码如下:
public function mergeIDs($newID,$changeTheseIDs){ // (integer and array of integers, respectively)
$inSet = implode(',',$changeTheseIDs);
$query = $this->connect()->prepare("UPDATE `log` SET `id` = ? WHERE `id` IN ( ? );");
$query->execute([$newID,$changeTheseIDs]);
}
问题似乎是SQL只处理插入到IN数组中的第一个整数ID。与IN数组中的整数匹配的任何ID都应该被更改。
如果我在我的服务器上的SQL工具中以这样的方式运行SQL:
更新 `log` SET `id` = 5 WHERE `id` IN (1,2,3);
它可以正常工作,我将所有ID为1、2或3的ID都更改为5。
但是我的PDO版本只将1更改为5,2和3保持不变。
有什么想法吗?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
尝试类似这样的代码:
public function mergeIDs($newID,$changeTheseIDs){ //(分别为整数和整数数组) $mergeSet = array_merge([$newID],$changeTheseIDs); $marks = array_fill(0, count($changeTheseIDs), '?'); $query = $this->connect()->prepare("UPDATE `log` SET `id` = ? WHERE `id` IN (". implode(',', $marks) .");"); $query->execute($mergeSet); }你需要为IN子句中的每个整数准备一个
?,不能只有一个。public function mergeIDs($newID,$changeTheseIDs){ //(分别是整数和整数数组) $inPH = implode(',', array_fill(0, count($changeTheseIDs), '?')); $query = $this->connect()->prepare("UPDATE `log` SET `id` = ? WHERE `id` IN ( {$inPH} );"); $query->execute([$newID, ...$changeTheseIDs]); }