[英]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.