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