Mysql ...价格范围内的价格范围?

时间:2011-09-07 15:59:12

标签: php mysql range between

我正在开发一个房地产脚本。该脚本具有搜索选项,用户可以在其中指定价格范围,例如。 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- Date Range within a Date Range,但这符合我想要的吗?

3 个答案:

答案 0 :(得分: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_pricemax_price始终不需要都在此范围内。

请参阅:How does the SQL injection from the "Bobby Tables" XKCD comic work?

答案 1 :(得分: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

答案 2 :(得分:-2)

如此符合我的理解,不应该是

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

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