以下是我的代码的快照:
$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代码的限制部分给我的变量添加了单引号。我查了一下,发现了一个我认为相关的bug:http://bugs.php.net/bug.php?id=44639
这就是我看到的吗?这个bug从2008年4月就已经打开了!在此期间,我们应该做什么?
我需要建立一些分页,并需要确保数据是干净的,sql注入安全,在发送sql语句之前。
发布于 2010-02-16 08:35:35
我记得以前遇到过这个问题。在将值传递给绑定函数之前,将值强制转换为整数。我想这解决了这个问题。
$fetchPictures->bindValue(':skip', (int) trim($_GET['skip']), PDO::PARAM_INT);
发布于 2013-08-06 00:52:06
最简单的解决方案是关闭仿真模式。只需添加以下行即可完成此操作
$PDO->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
此外,当creating a PDO connection时,此模式可以设置为构造函数参数。这可能是一个更好的解决方案,因为一些人报告他们的驱动程序不支持setAttribute()
函数。
它不仅可以解决绑定问题,还可以将值直接发送到execute()
中,这将大大缩短您的代码。假设已经设置了仿真模式,则整个事件将需要多达六行代码
$skip = isset($_GET['skip']) ? (int)trim($_GET['skip']) : 0;
$sql = "SELECT * FROM pictures WHERE album = ? ORDER BY id LIMIT ?, ?";
$stmt = $PDO->prepare($sql);
$stmt->execute([$_GET['albumid'], $skip, $max]);
$pictures = $stmt->fetchAll(PDO::FETCH_ASSOC);
发布于 2010-02-16 08:32:02
查看错误报告,以下内容可能会起作用:
$fetchPictures->bindValue(':albumId', (int)$_GET['albumid'], PDO::PARAM_INT);
$fetchPictures->bindValue(':skip', (int)trim($_GET['skip']), PDO::PARAM_INT);
但是你确定你输入的数据是正确的吗?因为在错误消息中,数字后面似乎只有一个引号(而不是将整个数字括在引号中)。这也可能是传入数据的错误。你能做个print_r($_GET);
来找出答案吗?
https://stackoverflow.com/questions/2269840
复制相似问题