Mysql ... ценовой диапазон в пределах ценового диапазона? - PullRequest
2 голосов
/ 07 сентября 2011

Я занимаюсь разработкой сценария недвижимости. В скрипте есть опция поиска, где пользователь может указать диапазон цен, например. user_price_low to 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- Диапазон дат в диапазоне дат , но соответствует ли это тому, что я хочу?

Ответы [ 3 ]

4 голосов
/ 07 сентября 2011

Чандан, никогда не вводите функции $ _ * непосредственно в запрос.Это дыра для 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 не обязательно должны постоянно находиться в диапазоне.

См .: Как происходит SQL-инъекция из "Бобби"Таблицы "XKCD комиксов?"

2 голосов
/ 07 сентября 2011

Если вы хотите проверить, есть ли у диапазонов общие точки, вы должны использовать

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
0 голосов
/ 07 сентября 2011

так в соответствии с тем, что я понимаю, не должно быть

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

Проверьте ваш ввод, используя mysql_real_escape_string();, прежде чем использовать их в запросе, не используйте переменные $ _GET, $ _REQUEST, $ _POST напрямую в любом запросе.

...