0

每次用户按下一个应该获取数据库的下 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的时候,手动填写变量,直接运行查询,运行正常。

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

我不知道为什么它不能正常运行,但我觉得我忽略了一些明显的东西。有任何想法吗?

4

2 回答 2

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 );
于 2013-02-04T20:05:01.867 回答
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();
于 2013-02-04T19:47:10.113 回答