Php PDO Sqlite常规错误:25绑定或列索引超出范围

Php PDO Sqlite常规错误:25绑定或列索引超出范围,php,sqlite,pdo,Php,Sqlite,Pdo,阅读一些相关的问题,然后。一个简单的查询仍然会触发一个错误 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

阅读一些相关的问题,然后。一个简单的查询仍然会触发一个错误

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
是db句柄。如上面的一篇参考文献所述,我已经实现了
setAttribute(\PDO::ATTR\u EMULATE\u 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);

我想你遇到了这样的情况:

输入参数中的键必须与SQL中声明的键匹配。在PHP5.2.0之前,这被默默地忽略了。

参考:

我的猜测是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);

这是手工编写的,可能包含语法错误。

@RyanVincent抱歉,您可以重新措辞吗?将值绑定到准备好的语句的代码在哪里?请在
execute($values)之前发布
var\u dump($values)
的完整、未经修改的输出
调用。如果只在
$values
中包含相关的集合并分别准备/执行它们,两个查询是否都成功?我不确定SQLite在一条语句中处理多个查询时的行为,即使启用了“模拟准备”。@MichaelBerkowski确实如此,在这种情况下,我必须为它们提供正确的参数。这听起来很有希望,但是在一个快速测试中,当我给第二个查询的参数与第一个查询同名时,SQLite完全忽略了第二个查询。我有MySql,而不是SqlLite,所以我自己无法尝试确切的场景。正如@MichaelBerkowski所说的,您的方案失败还有另一个原因。@MichaelBerkowski好吧,如果名称不同,它成功了吗?@RudigerW。刚刚尝试,第二个查询被忽略。@etilge否,它没有。我想我在前面的评论中提到了这一点。这似乎是第二个查询总是被忽略的更多证据——PDO抱怨您绑定了太多的参数,因为它只是试图将它们绑定到第一个查询。仿真没有任何效果——在这两种情况下似乎都是以同样的方式发生的。