簡體   English   中英

PHP PDO准備語句參數導致錯誤

[英]PHP PDO Prepared Statement parameter causing error

我在准備帶有參數的語句時遇到問題,請參見下文。

如果這是一個愚蠢的錯誤,我事先表示歉意。

錯誤:

Failed to run query (Project List) - SQLSTATE[42000]: Syntax error or access violation: 1064 
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''0,8'' at line 1

編碼:

$limit = ($pagenum - 1) * $page_rows . "," . $page_rows;

print_r($limit); // Prints 0,8 as expected

$query = "SELECT * FROM projects INNER JOIN users ON projects.companyid = users.companyid ORDER BY projects.projectid DESC LIMIT :limit";

$query_params = array (
    ':limit' => $limit
);

try {
    $stmt = $db->prepare($query);
    $stmt->execute($query_params);
}
catch (PDOException $ex) {
    die("Failed to run query (Project List)" . " - " . $ex->getMessage());
}

到目前為止,我已經嘗試過:

  • 將SQL Limit作為$limit字符串的一部分添加
  • 重命名限制參數/變量以防萬一(保留關鍵字等)
  • LIMIT 0,8手動測試了SQLyog中的SQL查詢-正常工作
  • 通過直接傳遞限制變量測試准備好的語句-可以正常工作
  • 閱讀所有建議的類似問題,至少在我的理解范圍內沒有發現類似問題。

您的$ limit參數將作為一個參數進行轉義,而應將其作為兩個參數進行轉義。 您的sql當前看起來類似於“ limit'0,8';”。 應該看起來像“極限0、8”;

為了解決這個問題,您應該將limit參數一分為二。 編輯SQL的末尾,如下所示:

LIMIT :offset, :limit

您的參數列表如下所示:

$query_params = array (
    ':offset' => ($pagenum - 1) * $page_rows,
    ':limit' => $page_rows
);

正如史密斯先生所說,您還必須添加以下行:

$db->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );

為確保將限制參數正確地處理為整數而不是字符串。

暫無
暫無

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

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