簡體   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