2013-06-24 142 views
15

我得到這個令人討厭的錯誤,雖然我有一個爲什麼我得到它的想法,我不能爲我的生活找到一個解決方案。PDO錯誤:SQLSTATE [HY000]:一般錯誤:2031

if ($limit) { 
    $sth->bindValue(':page', $page - 1, PDO::PARAM_INT); 
    $sth->bindValue(':entries_per_page', $page * $entries_per_page, PDO::PARAM_INT); 
} 

$sth->execute($criteria); 

查詢包含佔位符(:placeholder)。但要添加這些LIMIT佔位符,我需要使用手動方法(bindValue),否則引擎會將它們變成字符串。

我沒有得到無效的參數數量的錯誤,所以所有的佔位符已被正確綁定(我假設)。

查詢:

SELECT `articles`.*, `regional_municipalities`.`name` AS `regional_municipality_name`, 
     `_atc_codes`.`code` AS `atc_code`, `_atc_codes`.`name` AS `substance` 
FROM `articles` 
LEFT JOIN `_atc_codes` 
ON (`_atc_codes`.`id` = `articles`.`atc_code`) 
JOIN `regional_municipalities` 
ON (`regional_municipalities`.`id` = `articles`.`regional_municipality`) 
WHERE TRUE AND `articles`.`strength` = :strength 
GROUP BY `articles`.`id` 
ORDER BY `articles`.`id` 
LIMIT :page, :entries_per_page 

所有佔位符值駐留在$標準,除了最後兩所限,我手動bindValue()綁定。

+1

嘗試在谷歌搜索「PDO結合極限參數」 –

+0

1)它會一直不錯,包括人類可讀的錯誤信息,而不是僅僅的神祕代碼,2)顯示您的實際查詢,以便我們可以看到錯誤源於哪裏。 – deceze

+0

@deceze如果在那裏有任何人類可讀的消息,我會:a)現在可能已經解決了它,b)如果沒有,然後將它包括在這裏。這是完整的錯誤信息,相信我。 – silkfire

回答

17

您不能使用->bind*->execute($params)。使用或者;如果您將參數傳遞到​​,這些將使PDO忘記已通過->bind*綁定的參數。

3

the manual

public bool PDOStatement::execute ([ array $input_parameters ])

Execute the prepared statement. If the prepared statement included parameter markers, you must either:

  • call PDOStatement::bindParam() to bind PHP variables to the parameter markers: bound variables pass their value as input and receive the output value, if any, of their associated parameter markers

  • or pass an array of input-only parameter values

你需要選擇的方法。你不能混用兩者。

+0

我不能使用'bindParam' /'bindValue'作爲其他值...嘆。 – silkfire

+0

@silkfire請參閱http://stackoverflow.com/questions/10014147/limit-keyword-on-mysql-with-prepared-statement-maybe-still-a-bug/10014200#10014200瞭解其他想法。 –

+0

'PDO :: ATTR_EMULATE_PREPARES,true)' - 不應該**啓用**模擬準備?我認爲這是相反的方式,非常具有誤導性。 – silkfire

13

此相同的錯誤2031時能發出一個綁定兩個值具有相同參數的名稱,如在:

  • $sth->bindValue(':colour', 'blue');
  • $sth->bindValue(':colour', 'red');

..所以,要小心了。

+0

這個答案拯救了我的一天! – JWizard

2

如果您嘗試運行帶有佔位符的查詢,而不是準備statment如

$stmt = $db->query('SELECT * FROM tbl WHERE ID > ?'); 

,而不是

$stmt = $db->prepare('SELECT * FROM tbl WHERE ID > ?'); 
-1

異常也發生(至少在MySQL這個例外情況也出現/ PDO)當您嘗試更新AUTO_INCREMENT字段時。

2

這不完全是一個答案,但這個錯誤也發生,如果你試圖用一個字連字符作爲佔位符,例如:

$sth->bindValue(':page-1', $page1);

所以最好使用

$sth->bindValue(':page_1', $page1);

0

如果您有不匹配的參數,則會發生這種情況。例如:

$q = $db->prepare("select :a, :b"); 
$q->execute([":a"=>"a"]); 
相關問題