首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在LIMIT子句中应用bindValue方法?

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

Stack Overflow用户
提问于 2010-02-16 08:11:16
回答 10查看 64.2K关注 0票数 122

以下是我的代码的快照:

代码语言:javascript
复制
$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语句之前。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2010-02-16 08:35:35

我记得以前遇到过这个问题。在将值传递给绑定函数之前,将值强制转换为整数。我想这解决了这个问题。

代码语言:javascript
复制
$fetchPictures->bindValue(':skip', (int) trim($_GET['skip']), PDO::PARAM_INT);
票数 170
EN

Stack Overflow用户

发布于 2013-08-06 00:52:06

最简单的解决方案是关闭仿真模式。只需添加以下行即可完成此操作

代码语言:javascript
复制
$PDO->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );

此外,当creating a PDO connection时,此模式可以设置为构造函数参数。这可能是一个更好的解决方案,因为一些人报告他们的驱动程序不支持setAttribute()函数。

它不仅可以解决绑定问题,还可以将值直接发送到execute()中,这将大大缩短您的代码。假设已经设置了仿真模式,则整个事件将需要多达六行代码

代码语言:javascript
复制
$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);
票数 49
EN

Stack Overflow用户

发布于 2010-02-16 08:32:02

查看错误报告,以下内容可能会起作用:

代码语言:javascript
复制
$fetchPictures->bindValue(':albumId', (int)$_GET['albumid'], PDO::PARAM_INT);

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

但是你确定你输入的数据是正确的吗?因为在错误消息中,数字后面似乎只有一个引号(而不是将整个数字括在引号中)。这也可能是传入数据的错误。你能做个print_r($_GET);来找出答案吗?

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2269840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档