繁体   English   中英

HY093在PDO中执行准备好的语句时出错

[英]HY093 Error when executing prepared statement in PDO

我收到来自多个API请求数据,并存储在每一个单独的MySQL表。 对于每个请求我具有相关联的表,其中相匹配的JSON API响应字段名称。 因为我没有使用的所有字段从API,我发现在MySQL表中的字段并用它来创建PDO的准备语句,然后喂养结果阵列成执行。 下面是接受语句,并将结果阵列功能:

function insert_array($sql,$args)
{
    $this->connect();
    $q = $this->con->prepare($sql);
    foreach($args as $record) {
        $q ->execute($record);
        echo "<pre>";var_dump($record);echo "</pre>";
        $arr = $q->errorInfo();
        print_r($arr);
    }
    $this->disconnect();
    return $q;
}

最后三行在foreach循环中都只是进行调试。

对于我的第一个请求,此方法工作正常,但未插入任何记录,对于其他人,我收到HY093。

对于可行的,准备好的语句($ sql)如下所示

INSERT INTO fs_dynamicagents (agent_id, firstname, lastname) VALUES (:agent_id, :firstname, :lastname) ON DUPLICATE KEY UPDATE firstname=:firstname, lastname=:lastname

我第一次发现独特的领域,所以这就是为什么AGENT_ID是不是在更新语句。 这成功地插入,即使我没有使用所有字段。 这是var_dump和errorInfo的输出:

array(4) {
  ["agent_id"]=>
  string(3) "002"
  ["firstname"]=>
  string(9) "Bill"
  ["lastname"]=>
  string(5) "Murray"
  ["password"]=>
  string(4) "1212"
}
Array ( [0] => 00000 [1] => [2] => )

现在,这是一个不起作用的示例:

INSERT INTO fs_queue (name, record) VALUES (:name, :record) ON DUPLICATE KEY UPDATE record=:record

以及第一条API记录的一部分:

array(79) {
  ["name"]=>
  string(7) "Choice1"
  ["fc_name"]=>
  string(7) "Choice1"
  ["friendlyname"]=>
  string(7) "Choice1"
  ["record"]=>
  string(1) "1"
  ["agent_announcement_file"]=>
  string(0) ""
  ["play_agent_announcement_file"]=>
  string(1) "0"
  ["incoming_call_script"]=>
  string(0) ""
  ["caller_agent_match"]=>
  string(1) "0"
  ["survey_id"]=>
  NULL
}

Array ( [0] => HY093 [1] => [2] => )

你可以看到我已经不包含字段的所有79,但我已经尽力至少包括与标签“名”,和一个空字符串和空值的字段。 不过是“名”和“记录”应该被约束,所以我不认为那些是一个问题。

我在网上找到了这个错误代码的每个实例是由于A型(或区分大小写)。 我试图定义“记录”作为一个int和一个varchar。

好吧,我曾希望键入此内容的过程能使我明白问题所在,但没有这种运气。 如果一夜的睡眠无济于事,我很想听听想法。

编辑:什么我都试过被去除对重复更新部分(和清空表,所以不会有任何重复),这样每个参数只能绑定一次。 听起来这是几年前的一个错误,现已修复,但即使没有该错误,我也会收到相同的错误。

EDIT2:嗯,甚至陌生人,去除对重复更新会导致一些自己以前的工作报表的失败,同样的错误。 并非所有这些都可以,当然,并非所有原因都不会失败的应用程序,如果遇到重复的操作,将失败。

Edit3:我尝试过的其他方法是删除update语句的key-by-key,并将其更改为

INSERT INTO fs_queue (name, record) VALUES (:name, :record) ON DUPLICATE KEY UPDATE record= VALUES(record)

我认为这不会解决它,因为它在其他表上成功了,但实际上仍然失败。

Edit4:我能够使所有正在使用的从输入数组列已添加到MySQL表中的字段,以使这些工作之一。 不过,我不认为这是真正解决了这个问题,因为我有其他人没有被使用的所有列得手,甚至在阵列的中间。

好的,我知道了。 首先,我根本没有设置ATTR_EMULATE_PREPARES,这意味着它将默认为数据库准备引擎,除非需要PDO引擎。 由于MySQL无法重新使用占位符,因此它正在使用PDO引擎。 将其设置为false将强制使用MySQL引擎,并且所有请求都将失败。

因此,PDO引擎可以重用占位符,但是这种情况并不十分适合查找值。 即使试图从3列中找到2列,有时也会失败。 因此,与其让PDO进行排序,不如将所有不需要的东西都扔掉,然后再将其插入。

我正在使用一个函数删除在这里找到的列。

<?php

function delete_col(&$array, $key) {
    return array_walk($array, function (&$v) use ($key) {
        unset($v[$key]);
    });
}

$table_fields = array("id","fruit");

$insert_data = array(
    array( 
        "id" => "1",
        "fruit" => "Apple",
        "color" => "Red"
    ),array( 
        "id" => "2",
        "fruit" => "Apple",
        "color" => "Green"
    ),array( 
        "id" => "3",
        "fruit" => "Pear",
        "color" => "Green"
    )
);

foreach($insert_data[0] as $key=>$value) {
    if(!in_array($key, $table_fields)) {
        delete_col($insert_data, $key);
    }
}
echo "<pre>";
print_r($insert_data);
echo "</pre>";

?>

假定第一条记录的每一列都有一个条目。 我确实有一些不正确的地方,但到目前为止还没有引起问题,但是我可能最终会重写它以遍历每一行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM