【问题标题】:Exception: Parameter 'index' must be a int例外:参数 'index' 必须是 int
【发布时间】:2017-12-06 23:17:29
【问题描述】:

我正在尝试使用 PDO 在 MySQL 数据库中插入一行,并且我正在使用参数绑定,但我遇到了一个奇怪的错误。重要的功能是:

private static function getConnection() : \Pdo
{
    $con = new \PDO('mysql:host=localhost;dbname=mydatabase;charset=utf8', 'myuser', 'mypassword');
    return $con;
}

public static function runBool(string $query, ?array $bind = []) : bool
{
    return self::getConnection()
        ->prepare($query)
        ->execute($bind);
}

如您所见,getConnection() 仅返回一个连接(并且工作正常),问题在于函数runBool()->execute($bind); 行上引发错误:

例外:参数 'index' 必须是 int

比如我的$query

插入客户端(company_id、name、phone、cpf、rg、city_id、address、obs)值(:company_id、:name、:phone、:cpf、:rg、:city_id、:address、:obs)

我的$bind

array(8) {
    ["company_id"]=> int(1)
    ["name"]=> string(3) "John Doe"
    ["phone"]=> string(11) "123456789"
    ["cpf"]=> string(0) ""
    ["rg"]=> string(0) ""
    ["city_id"]=> int(79)
    ["address"]=> string(0) ""
    ["obs"]=> string(0) ""
}

我已经尝试 foreach $bind 并单独使用 bindParam()bindValue(),然后运行 ​​execute 但我在 execute() 上遇到相同的错误。 我已经在数组的每个键之前包含: 并将其删除(在this comment 之后),但没有任何变化。 我已经在 Google 上搜索了很多,但似乎没有人遇到相同类型的问题。

信息:

  • PHP 7.1.12
  • Ubuntu 16.04.03
  • MySQL 5.7.20
  • 流浪者 2.0.0

感谢每一个帮助。

---------------- 编辑 ----------------

如被问及,我检查了我的命名空间,但我使用的是 \Pdo,所以我认为它是原生 PHP PDO 类。这是self::getConnection()->prepare($query)var_dump

object(PDOStatement)#90 (1) { ["queryString"]=> string(149) "INSERT INTO client (company_id, name, phone, cpf, rg, city_id, address, obs) VALUES (:company_id, :name, :phone, :cpf, :rg, :city_id, :address, :obs)" }

这是我的桌子:

CREATE TABLE `client` (
  `id` int(10) UNSIGNED NOT NULL,
  `name` varchar(50) NOT NULL,
  `phone` varchar(15) NOT NULL,
  `city_id` int(10) UNSIGNED NOT NULL,
  `address` varchar(100) DEFAULT NULL,
  `cpf` varchar(14) DEFAULT NULL,
  `rg` varchar(15) DEFAULT NULL,
  `obs` varchar(100) DEFAULT NULL,
  `company_id` int(10) UNSIGNED NOT NULL,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `client`
  ADD PRIMARY KEY (`id`),
  ADD KEY `city_id` (`city_id`),
  ADD KEY `company_id` (`company_id`);
ALTER TABLE `client` ADD FULLTEXT KEY `search` (`name`,`phone`,`address`,`cpf`,`rg`,`obs`);
ALTER TABLE `client` ADD FULLTEXT KEY `search_basic` (`name`);

ALTER TABLE `client`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=613;

ALTER TABLE `client`
  ADD CONSTRAINT `client-city_id` FOREIGN KEY (`city_id`) REFERENCES `city` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION,
  ADD CONSTRAINT `client-company_id` FOREIGN KEY (`company_id`) REFERENCES     `company` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION;

【问题讨论】:

  • 听起来该结构包含一个名为index 的字段,该字段被标记为键或唯一。虽然在 mysql 中将字段索引命名为关键字很奇怪
  • 本题与PDO无关,故去掉标签
  • 哪种结构?没有列、表、变量或任何所谓的“索引”。
  • 我认为这与 PDO 相关,因为它发生在 PDOStatement::execute() 函数中。

标签: php phalcon


【解决方案1】:

首先检查你使用的是什么 PDO,检查命名空间,因为你得到的错误不是 PDO 错误,而是 Phalcon 结果集错误,这里是一个 git:https://github.com/phalcon/cphalcon/blob/master/ext/phalcon/mvc/model/resultset.zep.c#L366

Phalcon 尝试构建一个result_set

您能否在执行前提供self::getConnection()->prepare($query); 中的var_dump

并提供你的表的 DDL。

【讨论】:

  • 哇,这对我有很大帮助。我只能在大约 10 小时内对其进行测试,但似乎是正确的看待方式。我以为我使用的是纯 PHP PDO,但我可能错误地使用了一些 Phalcon 类。
  • 我刚刚用 var_dump 编辑了我的问题,似乎我使用的是原生 PHP PDO 类,但这很奇怪,因为我使用的是 Phalcon 框架,所以它可以相关.
【解决方案2】:

将您的 $bind 变量更改为

array(8) {
    [":company_id"]=> int(1)
    [":name"]=> string(3) "John Doe"
    [":phone"]=> string(11) "123456789"
    [":cpf"]=> string(0) ""
    [":rg"]=> string(0) ""
    [":city_id"]=> int(79)
    [":address"]=> string(0) ""
    [":obs"]=> string(0) ""
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 2022-11-21
  • 2016-02-20
相关资源
最近更新 更多