簡體   English   中英

PDO 錯誤:SQLSTATE[HY000]:一般錯誤:2031

[英]PDO error: SQLSTATE[HY000]: General error: 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 ),否則引擎會將它們轉換為字符串。

我沒有收到 Invalid number of parameters 錯誤,因此所有占位符都已正確綁定(我假設)。

詢問:

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

所有占位符值都位於 $criteria 中,除了最后兩個 LIMIT,我手動綁定了bindValue()

當使用相同的參數名稱綁定兩個值時,可能會發出相同的錯誤 2031,例如:

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

..所以,當心。

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

如果您嘗試使用占位符運行查詢而不是准備諸如

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

代替

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

手冊

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

執行准備好的語句。 如果准備好的語句包含參數標記,您必須

  • 調用 PDOStatement::bindParam() 將 PHP 變量綁定到參數標記:綁定變量將它們的值作為輸入傳遞並接收其關聯參數標記的輸出值(如果有)

  • 或傳遞一組僅限輸入的參數值

你需要選擇一種方法。 你不能混合兩者。

這不完全是一個答案,但是如果您嘗試使用帶有連字符的單詞作為占位符,也會發生此錯誤,例如:

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

所以更好地使用

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

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

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

當您的 SQL 嘗試更新 AUTO_INCREMENT 字段時,也會發生異常(至少在 MySQL/PDO 中)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM