如何在 LIMIT 子句中应用 bindValue 方法?

新手上路,请多包涵

这是我的代码的快照:

 $fetchPictures = $PDO->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 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 “15’, 15’ 附近使用正确的语法

似乎 PDO 在 SQL 代码的 LIMIT 部分中为我的变量添加了单引号。我查了一下,发现了这个我认为相关的错误: http ://bugs.php.net/bug.php?id=44639

这就是我在看的吗?自 2008 年 4 月以来,此错误已打开!在此期间我们应该做什么?

我需要建立一些分页,并且需要在发送 sql 语句之前确保数据是干净的、sql 注入安全的。

原文由 Nathan H 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 526
2 个回答

我记得以前有这个问题。在将值传递给绑定函数之前将其转换为整数。我认为这可以解决它。

 $fetchPictures->bindValue(':skip', (int) trim($_GET['skip']), PDO::PARAM_INT);

原文由 Stephen Curran 发布,翻译遵循 CC BY-SA 2.5 许可协议

尝试以下操作:

 $sql2 = "SELECT  * FROM tab ORDER BY id DESC limit 2

原文由 bricas30 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题