0

我正在尝试使用 PDO 从 MYSQL 获取我的数据,但我没有任何运气。

这是我尝试过的:

$postQuery = $DBH->prepare("SELECT title, views, rating, thumb FROM posts WHERE category=:category and status=1 ORDER BY :sort DESC");
$postQuery ->bindParam(':category', $category);
$postQuery ->bindParam(':sort', $sort);
$postQuery ->execute();

这可以正常工作,但它会按字母顺序返回所有帖子,忽略类别和排序。

我试过这个:

$postQuery = $DBH->query("SELECT title, views, rating, thumb FROM posts WHERE category={$category} and status=1 ORDER BY {$sort} DESC");

这确实有效,但我没有得到准备好的声明的保护。关于为什么一种说法有效而另一种说法无效的任何想法?

4

2 回答 2

3

您的绑定参数:sort将扩展为字符串文字,而不是 SQL 标识符。也就是说,您正在有效地评估以下内容:

ORDER BY 'rating' DESC

由于像这样的文字对于每条记录都是恒定的,因此它对结果集的顺序没有影响。

您不能参数化标识符,因此必须将该部分 SQL 连接到您准备好的语句中(最安全的方法是$sort根据适合您需要的任何逻辑从一组预定的安全值中进行设置)。

于 2012-11-19T18:31:50.170 回答
1

您不能在 ORDER BY 子句中使用占位符。看到这个问题:如何使用准备好的 PDO 语句设置 ORDER BY 参数?

于 2012-11-19T18:36:07.020 回答