【发布时间】:2013-05-02 09:13:02
【问题描述】:
我有一个产品页面,显示我网站上的所有待售产品,侧面有链接,允许用户缩小结果范围,例如按颜色。因此,如果他们单击“红色”链接,则只会显示红色的产品。数据库表的设置使每种颜色的值都为“是”或“否”,因此当单击链接时,查询如下所示:
if(isset($_GET['color'])) {
$color = filter($_GET['color']);
$query = mysql_query("SELECT * FROM products WHERE $color='yes'") or die (mysql_error());
}
然后,我有一个 while 循环来显示产品:
<?php
while ($result = mysql_fetch_array($query)) {
...Display product info here...
}
?>
我遇到问题的部分是在返回结果后对结果进行排序。页面上还有其他链接可以按“价格”和“最新”对返回的结果进行排序。我对如何使用这些排序链接的逻辑有疑问。
例如,当我点击“红色”链接后,我只能看到红色的产品。现在我希望能够单击“价格”链接,该链接应仅按价格排序红色产品。我不知道我是否可以在返回结果后对结果进行排序,或者我是否可以使用附加条件( ORDER BY price )重新查询数据库。如果第二种情况是正确的方法,我如何将条件附加到前一个查询并重新查询数据库?谁能帮我解决这个问题?我已经为此工作了几个小时,但没有运气!
【问题讨论】:
-
查询只是字符串,所以修改查询应该不会那么难。顺便说一句,您将需要使用准备好的语句,或者使用适当的 SQL 转义;你现在拥有的是危险代码。
-
如上所示,我有一个自定义的“过滤器”功能来过滤掉查询字符串中的有害输入。
-
嗯,好吧,我看到请求值用于列名,因此准备好的语句在这种情况下实际上不起作用。 ..也就是说,你可能仍然应该使用它=D
-
无论如何我都不是 SQL 专家。你能解释一下我的代码有多危险吗?
-
取决于过滤器函数的作用(如果可能过滤可能的值或使用 mysql_real_escape_string),但您的脚本可能对 SQL 注入开放。如果有人在颜色字段中输入了类似“1;SELECT * FROM PasswordsTable #”的内容,他们可能会得到一些您希望隐藏的数据。