![](/img/trans.png)
[英]Got error SQLSTATE[HY000]: General error: 2031 when trying to execute if statement
[英]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.