嘗試使用bindValue 方法參數化LIMIT 子句來執行SQL 查詢時,PHP PDO 可能會加入變數值用單引號引起來。此行為可能會導致SQL 語法錯誤,如所提供的程式碼片段中所觀察到的:
$fetchPictures->prepare("SELECT * FROM pictures WHERE album = :albumId ORDER BY id ASC LIMIT :skip, :max"); $fetchPictures->bindValue(':albumId', $_GET['albumid'], PDO::PARAM_INT); if(isset($_GET['skip'])) { $fetchPictures->bindValue(':skip', trim($_GET['skip']), PDO::PARAM_INT); } else { $fetchPictures->bindValue(':skip', 0, PDO::PARAM_INT); } $fetchPictures->bindValue(':max', $max, PDO::PARAM_INT); $fetchPictures->execute() or die(print_r($fetchPictures->errorInfo())); $pictures = $fetchPictures->fetchAll(PDO::FETCH_ASSOC);
錯誤訊息「您的SQL 語法中有錯誤」可能是由添加到:skip 中的單引號引起的LIMIT 子句中的變數。
據信此行為與 2008 年報告的 PDO 中長期存在的錯誤有關: https://bugs.php.net/bug.php?id=44639
解決方案:
依照回應中的建議,在傳遞先前將值轉換為整數將它們傳遞給bindValue方法解決了這個問題:
$fetchPictures->bindValue(':skip', (int) trim($_GET['skip']), PDO::PARAM_INT);
透過將$_GET['skip']變數轉換為整數在綁定之前使用(int) ,我們可以防止 PDO 新增單引號並確保 SQL 查詢正確執行。
以上是在 LIMIT 子句中使用「bindValue」時如何避免 SQL 注入?的詳細內容。更多資訊請關注PHP中文網其他相關文章!