在这里、这里和这里阅读一些相关问题。简单的查询仍会触发错误
SQLSTATE[HY000]: General error: 25 bind or column index out of range
$query
INSERT OR IGNORE INTO `menu` (`id`,`name`,`name_clean`,`display`) VALUES (:idInsert,:nameInsert,:name_cleanInsert,:displayInsert);
UPDATE `menu` SET id=:idUpdate,name=:nameUpdate,name_clean=:name_cleanUpdate,display=:displayUpdate WHERE id = 1;
';
$values
[:idInsert] => 1
[:idUpdate] => 1
[:nameInsert] => 2
[:nameUpdate] => 2
[:name_cleanInsert] => 3
[:name_cleanUpdate] => 3
[:displayInsert] => 1
[:displayUpdate] => 1
代码段。 $this->db->handle
是数据库句柄。如上面的参考资料之一所述,我已经实现了能够执行多个查询的setAttribute('PDO::ATTR_EMULATE_PREPARES, true)
$statement = $this->db->handle->prepare($query);
$statement->execute($values);
和这个人战斗了几个小时,感觉就像我在跑圈子。我在这里错过了什么?
更新
根据需要定义表
DROP TABLE IF EXISTS `menu`;
CREATE TABLE `menu` (`id` INTEGER PRIMARY KEY NOT NULL ,`name` VARCHAR,`name_clean` VARCHAR,`sequence` INTEGER, `display` INTEGER);
我认为你遇到了这个:
The keys from input_parameters must match the ones declared in the SQL. Before PHP 5.2.0 this was silently ignored.
参考: PHP: PDOStatement::execute
我的猜测是PHP尝试匹配两个查询中每个查询的参数。
您的输入和更新参数看起来相同,因此我认为不需要拥有这两组。尝试将它们折叠成一组
[:id] => 1
[:name] => 2
[:name_clean] => 3
[:display] => 1
并在两个查询中引用它们。
另一个注意事项:您确定要吗
WHERE id = 1
这可能也应该是
WHERE id=:id
问题是 PDO 希望在第一个查询中将 8 个值绑定到 4 个参数,由 ";" 分割。
看到您的SQL代码(以及您添加的数据库结构),我会将其更改为以下内容:
INSERT INTO menu (id, name, name_clean, display) VALUES
(
:idInsert, :nameInsert, :name_cleanInsert, :displayInsert
)
ON DUPLICATE KEY UPDATE
id = VALUES(:idUpdate),
name = VALUES(:nameUpdate),
name_clean = VALUES(:name_cleanUpdate),
display = VALUES(:displayUpdate);
这是手写的,可能包含语法错误。