2015-01-03 3 views
1

Я пытаюсь создать функцию, которая будет отфильтровывать продукты на основе ценовых диапазонов.Как фильтровать по диапазонам цен в PHP/MySQL?

Пользователь может выбрать дополнительные диапазоны цен сразу (с помощью флажков). Флажки выглядят следующим образом:

<label>0-500 <input type="checkbox" name="price[]" value="1"/></label> 
    <label>500-1000 <input type="checkbox" name="price[]" value="2"/></label> 
    <label>1000-2000 <input type="checkbox" name="price[]" value="3"/></label> 

Когда пользователь отправляет форму фильтра с 2-мя флажки проверили, он посылает мне массив, который выглядит как этот [0 => "2", 1 => "3"].

Тогда я буду фильтровать продукты через SQL-запрос (SELECT * FROM ... WHERE price > 500 AND price < 2000 // очень упрощенный).

Дело в том, что я не знаю как правильно получить эти ценовые диапазоны от массива, который не включает его конкретно.

Я был бы очень признателен за вашу помощь. Спасибо заранее!

+1

Может быть, это действительно проблема плохого дизайна пользовательского интерфейса. Возможно, было бы лучше, если бы пользователь мог просто выбрать max и мин? – Strawberry

+0

Я думал об этом. Но я видел несколько сайтов, использующих такую ​​фильтрацию, и предпочитаю этот способ. –

+0

ОК. Как эти сайты делают это? Я должен сказать, что, как пользователь, мне кажется странным, что я могу выбрать 0-9 и 20-29, но не 10-19!?!?!? – Strawberry

ответ

1

попробовать это,

//parameter like [0 => "2", 1 => "3"] 
function getQuery($form){ 
    $query = "SELECT * FROM yourtable WHERE false"; 
    if (in_array("1", $form)){ 
     $query .= " OR price >= 0 AND price <= 500"; 
    } 
    if (in_array("2", $form)){ 
     $query .= " OR price >= 500 AND price <= 1000"; 
    } 
    if (in_array("3", $form)){ 
     $query .= " OR price => 1000 AND price <= 2000"; 
    } 
    return $query; 
} 

функция возвращает запрос, основанный на вашем Флажки массиве

Edit (с Арис идеей)

//parameter like [0 => "500-1000", 1 => "1000-2000"] 

function getQuery($form){ 
    $query = "SELECT * FROM yourtable WHERE false"; 
    foreach ($form as $range){ 
     $ranges = explode("-", $range); 
     $from = ranges[0]; 
     $to = ranges[1]; 
     $query .= " OR BETWEEN $from AND $to"; 
    } 
    return $query; 
} 
1

Вам нужно как-то сопоставить его. Например, значение = «1» означает «0-500».

Другим решением является установить значение фактического диапазона, а затем разобрать его и получить минимальные и максимальные цены:

<label>0-500 <input type="checkbox" name="price[]" value="0-500"/></label> 
    <label>500-1000 <input type="checkbox" name="price[]" value="500-1000"/></label> 
    <label>1000-2000 <input type="checkbox" name="price[]" value="1000-2000"/></label> 

В этом случае ваш массив будет выглядеть, как показано ниже:

[0 => "500-1000", 1 => "1000-2000"] 

разбирает строки и вставить в SQL запросе

+0

Спасибо. Я на самом деле пытался сделать так, но он не работал так, как предполагалось. Я предпочел бы использовать вход min-max. –

+0

вам нужно прочитать значение, разобрать в 2-х частях и убедиться, что у вас есть 2 числа. форматирование чисел между PHP и mysql иногда может быть сложным. возможно, поэтому он не работал. – Aris