2

我正在开发一个房地产脚本。该脚本有一个搜索选项,用户可以在其中指定价格范围,例如。user_price_low 到 user_price_high 并且列表必须从数据库中获取,例如。db_price_high 和 db_price_low。

我使用 BETWEEN 语句试图找到匹配项,

WHERE price_low BETWEEN '.$_REQUEST['minprice_buy'].' AND '.$_REQUEST['maxprice_buy']

但令我惊讶的是......

如果用户有 user_price_high = 60 和 user_price_low = 20 并且记录有 db_price_low = 30 和 db_price_high = 120

在这种情况下,我的查询无效。

我尝试查看日期范围内的 MySql Query- 日期范围,但这是否符合我的要求?

4

3 回答 3

4

Chandan,永远不要将 $_* 函数直接输入到查询中。这是一个 SQL 注入漏洞。

将代码更改为:

$min_price = mysql_real_escape_string($_REQUEST['minprice_buy']);
$max_price = mysql_real_escape_string($_REQUEST['maxprice_buy']);
$query = "SELECT whatever 
          FROM whichever 
          WHERE price_low BETWEEN '$min_price' AND '$max_price' ";
// Dont forget these quotes       ^          ^     ^          ^
// Or mysql_real_escape_string() will not work!.

关于您的问题,将查询更改为:

WHERE '$min_price' BETWEEN price_low AND price_high 
  AND '$max_price' BETWEEN price_low AND price_high

您可能还需要考虑:

WHERE ('$min_price' BETWEEN price_low AND price_high) 
  OR  ('$max_price' BETWEEN price_low AND price_high)

在这里min_price并且max_price不需要一直都在范围内。

请参阅:“Bobby Tables”XKCD 漫画中的 SQL 注入如何工作?

于 2011-09-07T16:10:38.147 回答
2

如果您想检查范围是否有任何共同点,您应该使用

WHERE greatest(price_low,user_price_low)<=least(price_high,user_price_high)

如果您想检查用户范围是否在所有范围内,您可以使用
未定义的行为user_preice_low>user_price_high

WHERE user_price_low>=price_low && user_price_high<=price_high
于 2011-09-07T16:14:46.413 回答
-2

所以根据我的理解,不应该是

WHERE price_low >= '.$_REQUEST['minprice_buy'].' AND price_high <='.$_REQUEST['maxprice_buy']'

mysql_real_escape_string();在查询中使用之前验证您的输入,不要在任何查询中直接使用 $_GET、$_REQUEST、$_POST 变量。

于 2011-09-07T16:11:05.730 回答