Меня иногда просят рассказать, как делаются сложные фильтры поиска . Например, как он сделан на том же Яндекс.Маркете , где может быть сотня различных параметров отбора товаров? В этом материале я расскажу, как такое делается, ведь тут нет абсолютно ничего сложного. Всё это делается по единому принципу, о котором чи...

Фильтр поиска на PHP

Меня иногда просят рассказать, как делаются сложные фильтры поиска. Например, как он сделан на том же Яндекс.Маркете, где может быть сотня различных параметров отбора товаров? В этом материале я расскажу, как такое делается, ведь тут нет абсолютно ничего сложного. Всё это делается по единому принципу, о котором читайте дальше.

Для начала должна быть таблица, по которой будет идти поиск. Пусть это будет упрощённая таблица для ноутбуков:

  • id - уникальный идентификатор.
  • price - цена.
  • manufacturer - производитель.
  • wi-fi - наличие Wi-Fi.

Теперь разберём форму поиска:

<form name="form" action="" method="post">
  <table>
    <tr>
      <td>Цена от:</td>
      <td><input type="text" name="price_start" /> рублей</td>
    </tr>
    <tr>
      <td>Цена до:</td>
      <td><input type="text" name="price_end" /> рублей</td>
    </tr>
    <tr>
      <td colspan="2">Производитель</td>
    </tr>
    <tr>
      <td>Apple</td>
      <td>
        <input type="checkbox" name="manufacturers[]" value="1" />
      </td>
    </tr>
    <tr>
      <td>Acer</td>
      <td>
        <input type="checkbox" name="manufacturers[]" value="2" />
      </td>
    </tr>
    <tr>
      <td>ASUS</td>
      <td>
        <input type="checkbox" name="manufacturers[]" value="3" />
      </td>
    </tr>
    <tr>
      <td>Наличие Wi-Fi:</td>
      <td>
        <input type="checkbox" name="wifi" />
      </td>
    </tr>
    <tr>
      <td colspan="2">
        <input type="submit" name="filter" value="Подобрать ноутбуки" />
      </td>
    </tr>
  </table>
</form>

Думаю, здесь, всё прозрачно. Единственное, что обратите внимание на manufacturers[]. Квадратные скобки означают, что в скрипт попадёт массив со всеми значениями, выбранными пользователем. Чтобы лучше это понять, просто выведите print_r($_POST), тогда Вы всё поймёте.

Теперь разберём скрипт. В целях упрощения скрипта я не стал его усложнять скриптами, отвечающими за безопасность, и ограничился функцией htmlspecialchars(). Однако, в реальности, обязательно надо проверять всё, что приходит от пользователя, используя, например, регулярные выражения и/или встроенные функции проверки переменных на их значение.

Главная задача скрипта - "собрать" SQL-запрос на основе того, что пришло от пользователя:

<?php
  function addWhere($where, $add, $and = true) {
    if ($where) {
      if ($and) $where .= " AND $add";
      else $where .= " OR $add";
    }
    else $where = $add;
    return $where;
  }
  if (!empty($_POST["filter"])) {
    $where = "";
    if ($_POST["price_start"]) $where = addWhere($where, "`price` >= '".htmlspecialchars($_POST["price_start"]))."'";
    if ($_POST["price_end"]) $where = addWhere($where, "`price` <= '".htmlspecialchars($_POST["price_end"]))."'";
    if ($_POST["manufacturers"]) $where = addWhere($where, "`manufacturer` IN (".htmlspecialchars(implode(",", $_POST["manufacturers"])).")");
    if ($_POST["wifi"]) $where = addWhere($where, "`wifi` = '1'");
    $sql = "SELECT * FROM `my_table`";
    if ($where) $sql .= " WHERE $where";
    echo $sql;
  }
?>

Как видите, сложные фильтры реализуются в PHP очень просто. Что касается "красивых" скриптов, где двигаются всякие ползунки и сразу меняется результат - это всё то же самое, только запросы отправляются не через форму, а через Ajax, а затем принимается ответ от сервера с результатом, который динамически выводится через чистый JavaScript, либо с использованием jQuery.

Вот по такому принципу делается любой фильтр поиска на PHP.