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

时间:2017-12-06 23:17:30

标签: php phalcon

我正在尝试使用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

  

INSERT INTO客户端(company_id,name,phone,cpf,rg,city_id,address,obs)VALUES(:company_id,:name,:phone,:cpf,:rg,:city_id,:address,:obs)< / p>

我的$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
  • Vagrant 2.0.0

感谢每一位帮助。

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

据我所知,我已经检查了我的命名空间,但是我正在使用\ Pdo,所以我认为它是原生的PHP PDO类。这是var_dump的{​​{1}}:

  

object(PDOStatement)#90(1){[“queryString”] =&gt; 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 )“}

这是我的桌子:

self::getConnection()->prepare($query)

2 个答案:

答案 0 :(得分:1)

将$ 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) ""
}

答案 1 :(得分:1)

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

Phalcon尝试构建result_set

您可以在执行前提供var_dump self::getConnection()->prepare($query);

并提供你桌子的DDL。