За последние 24 часа нас посетил 18401 программист и 1605 роботов. Сейчас ищут 953 программиста ...

Фильтрация - по рейтингу

Тема в разделе "Прочие вопросы по PHP", создана пользователем macbeth9, 27 июн 2012.

  1. macbeth9

    macbeth9 Активный пользователь

    С нами с:
    27 июн 2012
    Сообщения:
    13
    Симпатии:
    0
    Привет всем! Появилась проблема. Хочу сделать фильтрацию по рейтингу как http://www.tripadvisor.ru/HACSearch?geo=298570 (слева)

    И так начнем по порядку

    Начну по порядку.

    Есть таблица list (id,street,stars,`city`,`country`)

    stars - это рейтинг, до 5 звезд.

    На странице вывода этих записей search_list.php, устанавливаю checkboxs для фильтрации по рейтингу.

    Код (Text):
    1. <input type="checkbox" name="stars1" value="1"> 1 stars
    2. <input type="checkbox" name="stars2" value="2"> 2 stars
    3. <input type="checkbox" name="stars3" value="3"> 3 stars
    4. <input type="checkbox" name="stars4" value="4"> 4 stars
    5. <input type="checkbox" name="stars5" value="5"> 5 stars
    Получаю значения с помощью аякс

    Код (Text):
    1. <script type="text/javascript">
    2. jQuery(document).change(function(){
    3. var stars_query1 = $('input:checkbox[name=stars1]:checked').val();
    4. var stars_query2 = $('input:checkbox[name=stars2]:checked').val();
    5. var stars_query3 = $('input:checkbox[name=stars3]:checked').val();
    6. var stars_query4 = $('input:checkbox[name=stars4]:checked').val();
    7. var stars_query5 = $('input:checkbox[name=stars5]:checked').val();
    8. jQuery("#search").load('lib/search.php',{stars1:stars_query1,stars2:stars_query2,stars3:stars_query3,stars4:stars_query4,stars5:stars_query5},$("#load_search").fadeIn(),$("#load_search").fadeOut());
    9. });
    10. </script>
    Вывод идет на страницу search.php и код получается сначала такой

    Код (Text):
    1. $stars1 = $_POST['stars1'];
    2. $stars2 = $_POST['stars2'];
    3. $stars3 = $_POST['stars3'];
    4. $stars4 = $_POST['stars4'];
    5. $stars5 = $_POST['stars5'];
    6.  
    7. $result_list = mysql_query("SELECT `street`,`id`,`stars` FROM `list` WHERE `city`=".(int)$_POST['city']." AND `country`='".$_POST['country']."'");
    8.  
    9. while ($list = mysql_feth_array($result_list)) {
    10. echo $list['street']."<br>";
    11. }
    Нужно как из этих значений оформить запрос.

    Пытался сделать что то такое

    Код (Text):
    1. if ($_POST['stars1'] == 1) {$stars1 = 'AND `stars`=1';
    2.         if ($_POST['stars2'] == 2) {$stars1 = 'AND (`stars`=1 OR `stars`=2)';
    3.         if ($_POST['stars3'] == 3) {$stars1 = 'AND (`stars`=1 OR `stars`=2 OR `stars`=3)';}
    4.         if ($_POST['stars4'] == 4) {$stars1 = 'AND (`stars`=1 OR `stars`=2 OR `stars`=3 OR `stars`=4)';}
    5.         if ($_POST['stars5'] == 5) {$stars1 = 'AND (`stars`=1 OR `stars`=2 OR `stars`=3 OR `stars`=4 `stars`=5)';}
    6.         }
    7.         }
    8.          
    9.         $result_list = mysql_query("SELECT `street`,`id`,`stars` FROM `list`  WHERE `city`=".(int)$_POST['city']." AND  `country`='".$_POST['country']."' $stars1");
    Но вариантов будет очень много, да и код не правильный.
    Но нужно думаю что то такое AND (`stars`=1 OR `stars`=2).

    Подскажите как сделать?
     
  2. uorypm

    uorypm Активный пользователь

    С нами с:
    3 мар 2012
    Сообщения:
    98
    Симпатии:
    0
    macbeth9, доброго Вам времени суток.
    Как вариант{
    Нужно всего 5 запросов (для каждого значения `stars`). Создается массив $array. В $array[1] помещаются (если пользователь выбрал 1-звездочные) записи со `stars` = 1... В $array[5] помещаются (если пользователь выбрал 5-звездочные) записи со `stars` = 5. И тупо выводится весь массив $array.
    }
     
  3. macbeth9

    macbeth9 Активный пользователь

    С нами с:
    27 июн 2012
    Сообщения:
    13
    Симпатии:
    0
    Можете пожалуйста набросать начало, а то голова уже не варит.
     
  4. macbeth9

    macbeth9 Активный пользователь

    С нами с:
    27 июн 2012
    Сообщения:
    13
    Симпатии:
    0
    uorypm Помогите пожалуйста написать начало Вашего варианта
     
  5. uorypm

    uorypm Активный пользователь

    С нами с:
    3 мар 2012
    Сообщения:
    98
    Симпатии:
    0
    Доброго времени суток, macbeth9, и всем остальным.
    Код (Text):
    1.  
    2. $q = "SELECT columns FROM table WHERE заведомо_ложное_условие"; //Условие, например, '1 = 0'
    3. $q1 = $q2 = $q3 = $q4 = $q5 = "";
    4. if($_POST['stars1'] == 1) $q1 = " OR stars = 1";
    5. if($_POST['stars2'] == 2) $q2 = " OR сstars = 2";
    6. if($_POST['stars3'] == 3) $q3 = " OR stars = 3";
    7. if($_POST['stars4'] == 4) $q4 = " OR stars = 4";
    8. if($_POST['stars5'] == 5) $q5 = " OR stars = 5";
    9. $q .= $q1 . $q2 . $q3 . $q4 . $q5;
    10. mysql_query($q); // или mysqli_query($q);
    Надеюсь помог.
     
  6. macbeth9

    macbeth9 Активный пользователь

    С нами с:
    27 июн 2012
    Сообщения:
    13
    Симпатии:
    0
    Спасибо, все работает, только есть одно но. У меня записи выводятся с условием WHERE `city`=1 AND `country`=100

    И запрос формируется таким образом
    Код (Text):
    1. SELECT `street`,`id`,`price`,`stars`,`borough`,`price_date` FROM `list` WHERE `city`=20944 AND `country`='RU' OR `stars`=2 OR `stars`=3
    Получается что, выводим ГДЕ ГОРОД=1 И СТРАНА=100 ИЛИ ЗВЕЗДА=2 ИЛИ ЗВЕЗДА 3. Запрос выводит записи отвечающие первой части условия так и второй независимо от города и страны. По идее что сохранить первое условие нужно вот так WHERE city=1 AND `country`=100 AND (`stars`=1 OR `stars`=2 OR `stars`=3)
    И вот если нажат один чекбокс, запрос становится вида WHERE city=1 AND `country`=100 AND `stars`=1
    А если уже два то формируется таким образом WHERE city=1 AND `country`=100 AND (`stars`=1 OR `stars`=2)

    Вот здесь и есть проблема, как такое сделать. uorypm практический правильно подсказал, но пример не учитывает первое условие.
     
  7. uorypm

    uorypm Активный пользователь

    С нами с:
    3 мар 2012
    Сообщения:
    98
    Симпатии:
    0
    И снова доброго Вам времени суток, macbeth9.
    Была предложена идея реализации задачи, а не само решение. Если прочитаете свое сообщение еще раз, то сразу поймете, что именно и где надо дописать или переписать. Эх, не любите Вы думать.
    Поэтому ловите.
    Код (Text):
    1.  
    2. $q = "SELECT columns FROM table WHERE `city`= какое-то_число AND `country`= 'какая-то_локаль' AND (заведомо_ложное_условие";
    3. $q1 = $q2 = $q3 = $q4 = $q5 = "";
    4. if($_POST['stars1'] == 1) $q1 = " OR stars = 1";
    5. if($_POST['stars2'] == 2) $q2 = " OR stars = 2";
    6. if($_POST['stars3'] == 3) $q3 = " OR stars = 3";
    7. if($_POST['stars4'] == 4) $q4 = " OR stars = 4";
    8. if($_POST['stars5'] == 5) $q5 = " OR stars = 5";
    9. $q .= $q1 . $q2 . $q3 . $q4 . $q5 . ")";
    10. mysql_query($q); // или mysqli_query($q);
    Обратите внимание на наличие открывающейся круглой скобки в начале формирования запроса - это не опечатка. 'Заведомо_ложное_условие' надеюсь понятно для чего нужно или объяснить? Надеюсь мое решение Вам помогло.
    Также обратите внимание, что если ни один пункт чекбокса не выбран, то запрос вернет пустую таблицу.
     
  8. macbeth9

    macbeth9 Активный пользователь

    С нами с:
    27 июн 2012
    Сообщения:
    13
    Симпатии:
    0
    Спасибо! Все прекрасно работает, то что надо. Но можно еще вопрос? А если у меня еще есть поле например type, по которому мне тоже нужно делать фильтр, совместно с полем stars. Как мне сделать два условия?
     
  9. uorypm

    uorypm Активный пользователь

    С нами с:
    3 мар 2012
    Сообщения:
    98
    Симпатии:
    0
    Здравствуйте, macbeth9.
    Все делается аналогично.
    Код (Text):
    1.  
    2. $q = "SELECT columns FROM table WHERE `city`= какое-то_число AND `country`= 'какая-то_локаль' AND (заведомо_ложное_условие";
    3. $q1 = $q2 = $q3 = $q4 = $q5 = "";
    4. if($_POST['stars1'] == 1) $q1 = " OR stars = 1";
    5. if($_POST['stars2'] == 2) $q2 = " OR stars = 2";
    6. if($_POST['stars3'] == 3) $q3 = " OR stars = 3";
    7. if($_POST['stars4'] == 4) $q4 = " OR stars = 4";
    8. if($_POST['stars5'] == 5) $q5 = " OR stars = 5";
    9. $q .= $q1 . $q2 . $q3 . $q4 . $q5 . ") AND (заведомо_ложное_условие2";
    10. $type1 = $type2 = $type3 = ... = $typeN = "";
    11. if($_POST['type1'] == 1) $type1 = " OR type1 = 1";
    12. if($_POST['type2'] == 2) $type2 = " OR type2 = 2";
    13. if($_POST['type3'] == 3) $type3 = " OR type3 = 3";
    14. // ...
    15. if($_POST['typeN'] == 5) $typeN = " OR typeN = N";
    16. $q .= $type1 . $type2 . $type3 . ... . $typeN . ")";
    17. mysql_query($q); // или mysqli_query($q);
    Если допустимо, что пользователь может не выбирать тип 'typeN', то 'заведомо_ложное_условие2' превращается в 'заведомо_истинное_условие'.
     
  10. macbeth9

    macbeth9 Активный пользователь

    С нами с:
    27 июн 2012
    Сообщения:
    13
    Симпатии:
    0
    Код получился такой

    Код (Text):
    1. $result_list = "SELECT `street`,`id`,`price`,`stars`,`borough`,`price_date` FROM `list` WHERE `city`=".(int)$_POST['city']." AND `country`='".$country."' AND (1=0";
    2.  
    3. $q1 = $q2 = $q3 = $q4 = $q5 = "";
    4. if($_POST['stars1'] == 1) $q1 = " OR `stars`=1";
    5. if($_POST['stars2'] == 2) $q2 = " OR `stars`=2";
    6. if($_POST['stars3'] == 3) $q3 = " OR `stars`=3";
    7. if($_POST['stars4'] == 4) $q4 = " OR `stars`=4";
    8. if($_POST['stars5'] == 5) $q5 = " OR `stars`=5";
    9. $result_list .= $q1 . $q2 . $q3 . $q4 . $q5 . ") AND (2=0";
    10.  
    11. $type1 = $type2 = $type3 = $type4 = $type5 = "";
    12. if($_POST['cottage'] == 'cottage') $type1 = " OR `type`='cottage'";
    13. if($_POST['apart'] == 'apartament') $type2 = " OR `type`='apartament'";
    14. if($_POST['villa'] == 'villa') $type3 = " OR `type`='villa'";
    15. if($_POST['castle'] == 'castle') $type4 = " OR `type`='castle'";
    16. if($_POST['house'] == 'house') $type5 = " OR `type`='house'";
    17. $result_list .= $type1 . $type2 . $type3 . $type4 . $type5 . ")";
    Он работает если например выбрать сразу stars и type, а вот если одно из них, то нет.
    Если одно выбираешь то запрос получается такой WHERE `city`=20944 AND `country`='RU' AND (1=0) AND (2=0 OR `type`='house')
     
  11. uorypm

    uorypm Активный пользователь

    С нами с:
    3 мар 2012
    Сообщения:
    98
    Симпатии:
    0
    Уважаемый macbeth9, читайте внимательно то, что Вам пишу:
    1.
    2.
    Вывод: Если же допустимо, что пользователь вообще ничего не выбирает, то везде 'заведомо_ложное_условие' превращается в 'заведомо_истинное_условие' (например в '1 = 1').
    Т.е.
     
  12. macbeth9

    macbeth9 Активный пользователь

    С нами с:
    27 июн 2012
    Сообщения:
    13
    Симпатии:
    0
    Большое спасибо, теперь я все понял и сделал остальное сам.