尝试使用 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中文网其他相关文章!