2016-06-13 187 views
0

我有這個準備好的語句查詢如何調試SQLSTATE [HY000]:常規錯誤:2031在事先準備好的發言

$stmt = $conn->prepare(" 
     UPDATE language 
     SET lang_alias=:lang_alias , lang_name=:lang_name 
     WHERE lang_id=:lang_id" 
); 

如果我設置一個陣列綁定值

$query_array = array (":lang_alias" => "en", ":lang_name" => "English (UK)", ":lang_id" => 1) ; 

和然後執行它

$stmt->execute(array($query_array)); 

它不會工作,我得到

Notice: Array to string conversion referring to $stmt->execute(array($query_array));

Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number'指的是同一行。

然後我試圖使用bindParam綁定值

$stmt->bindParam(':lang_alias', $a); 
$stmt->bindParam(':lang_name', $c); 
$stmt->bindParam(':lang_id', $d3, PDO::PARAM_INT); 

如果我嘗試了替代bindParam語法工作正常

$stmt->bindParam("sssiii", $a, $b, $c, $d1, $d2, $d3);

它不會工作。給

Warning: PDOStatement::bindParam() expects at most 5 parameters, 7 given referring to $stmt->bindParam("sssiii", $a, $b, $c, $d1, $d2, $d3);

Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2031 ' referring to $stmt->execute();

是由一個事實,即在默認情況下編寫的語句轉換爲字符串的所有值,所以我必須要定義int用手錯誤?這就是爲什麼bindParam工作正常?還是我失蹤的其他東西?

2.爲什麼bindParam("sssiii"... sytntax不會工作?

3.我希望此查詢動態獲取其值,因此手動使用bindParam不是一個選項。我想使用關聯數組或bindParam("sssiii"...語法。

我該怎麼做?謝謝

+0

@ Fred-ii-完成。還是一樣的錯誤。這是一個錯誤,而不是在我的代碼中。 – slevin

+0

@slevin如果Chris的評論解決了它,也許可以邀請他將它作爲答案發布,然後再有人從他腳下拉下地毯;-) –

+0

@ chris85是的,就是這樣,謝謝指出。 'bindParam(「sssiii」...'語法的問題仍然存在,我看不出來怎麼回事 – slevin

回答

3

$query_array已經是一個數組,因此當您運行$stmt->execute(array($query_array))時,您正在製作一個多維數組。這:

$stmt->execute($query_array); 

應該是你所需要的。

至於bind問題,您不使用PDO語法

您正在使用mysqli語法與sssiii

+0

最後一件事情,所以,準備好的語句根本沒有'bindParam($ a,$ b,$ c)'語法?謝謝 – slevin

+1

據我所知,不,不在PDO中。 PDO'bindParam'需要綁定1個參數。 – chris85

相關問題