PDO Sqlite一般错误:25个绑定或列索引超出范围

时间:2016-01-23 21:26:51

标签: php sqlite pdo

阅读一些相关问题hereherehere。简单查询仍会触发错误

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);

2 个答案:

答案 0 :(得分:2)

我认为你遇到了这个问题:

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

答案 1 :(得分:0)

问题在于,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);

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

相关问题