【问题标题】:PDO Sqlite General error: 25 bind or column index out of rangePDO Sqlite 一般错误:25 绑定或列索引超出范围
【发布时间】:2016-04-30 08:56:13
【问题描述】:

阅读一些相关问题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

sn-p。 $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);

【问题讨论】:

  • @RyanVincent 对不起,你能改一下吗?
  • 将值绑定到准备好的语句的代码在哪里?
  • 请在execute($values) 调用之前发布来自var_dump($values) 的完整、未缩写的输出。
  • 如果您仅在$values 中包含相关集并单独准备/执行它们,这两个查询是否都会成功?我不确定 SQLite 如何在一个语句中处理多个查询,即使启用了模拟准备。
  • @MichaelBerkowski 他们这样做了,在这种情况下,我必须为他们提供适当的参数。

标签: php sqlite pdo


【解决方案1】:

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

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

【讨论】:

  • 这听起来很有希望,但在快速测试中,当我给它的参数与第一个查询相同的名称时,SQLite 完全忽略了第二个查询。
  • 我有 MySql,而不是 SqlLite,所以我自己无法尝试确切的场景。正如@MichaelBerkowski 所说,您的方案失败还有另一个原因。
  • @MichaelBerkowski 很好,如果名称不同,它成功了吗?
  • @RudigerW。刚试过,第二个查询被忽略了。
  • @etilge 不,它没有。我想我在我早期的一个顶部的 cmets 中提到了这一点。这似乎有更多证据表明第二个查询总是被忽略 - PDO 抱怨您绑定了太多参数,因为它只是试图将它们绑定到第一个查询。模拟没有任何效果 - 在任何一种情况下似乎都以相同的方式发生。
【解决方案2】:

问题是 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);

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

【讨论】:

    猜你喜欢
    • 2014-03-24
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多