使用limit获取mysql行时遇到问题

时间:2013-02-04 19:40:42

标签: php mysql pdo

每次用户按下应该获取数据库的下10行的按钮时,我都会通过ajax请求调用php脚本。当按下按钮时,没有任何反应,我在控制台或php中没有错误

$query = $conn->prepare('SELECT name, file_loc, img_id, filter, votes FROM images WHERE user_id=? ORDER BY votes DESC LIMIT ?, 10');
$query->execute(array($user_id, $skip));
$result = $query->fetchAll();

当我去phpmyadmin时,手动填写变量,直接运行查询,它运行正常。

在php中,当我将echo $skip . ' ' . $user_id;添加到脚本的末尾时,它显示所有变量都是它们应该是的。另外,如果我编辑查询的结尾以使用静态数而不是将变量插入到读取LIMIT 10, 10,那么一切正常(尽管不是变量,它不能增加10)。

我不知道为什么这不能正常运行,但我觉得我忽略了一些显而易见的事情。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

在仿真模式下(默认情况下处于启用状态),PDO用实际数据替换占位符。 通过“懒惰”绑定,PDO将每个参数视为字符串 结果,查询变为

LIMIT '10', 10

这显然是导致查询失败的错误语法。

所以,你有2个解决方案:
通过关闭仿真(因为mysql可以正确排序所有占位符)
或者通过明确地绑定数字,就像在Kalpesh的答案中那样。但是不要忘记为这个变量设置正确的类型(PDO :: PARAM_INT)。

要关闭仿真,请在连接

后运行此代码
$conn->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );

并且,为了获得错误,请添加此

$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

答案 1 :(得分:0)

你能试试吗?

$query = $conn->prepare('SELECT name, file_loc, img_id, filter, votes FROM images WHERE user_id=? ORDER BY votes DESC LIMIT ?, 10');
$query->bindParam(1, $user_id);
$query->bindParam(2, $skip);
$query->execute();
$result = $query->fetchAll();