Фильтр поиска на 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;
}
?>
Думаю, что с выполнением получившегося запроса и выводом результата проблем возникнуть не должно. Если это не так или в данном скрипте не всё понятно, то Вам тогда однозначно нужно сначала изучить это: http://srs.myrusakov.ru/php.
Как видите, сложные фильтры реализуются в PHP очень просто. Что касается "красивых" скриптов, где двигаются всякие ползунки и сразу меняется результат - это всё то же самое, только запросы отправляются не через форму, а через Ajax, а затем принимается ответ от сервера с результатом, который динамически выводится через чистый JavaScript, либо с использованием jQuery.
Вот по такому принципу делается любой фильтр поиска на PHP.
-
- Михаил Русаков
Комментарии (6):
Миша, а будут ли статьи про MongoDB? Очень надо. И, есть идея нового курса - асинхронный интернет-магазин на MongoDB и NodeJS! Будет очень поучительно, и это будет первый курс в интернете!
Ответить
Возможно в скорости и будет.
Ответить
будет ли урок по созданию фильтрация по парамметрам для каждой категории меню отдельное? все это динамическим путем?
Ответить
Добрый день! Вы описали метод, когда в базе вбиты все параметры по столбцам id /price /manufacturer /wi-fi / а, можно ли реализовать фильтрацию при помощи поиска? Если даны к примеру столбцы /id /price и /charakteristiks , а данные /manufacturer и /wi-fi / введены текстом в поле /charakteristiks. Спасибо!
Ответить
Здравствуйте! Как реализовать такой фильтр с с двумя select? Можете дать наводку?
Ответить
Добрый день всем. Вам в любом случае нужна будет фильтрация не только полей, но и еще фильтрация форм, ссылок URL и т.д. Я не давно тож искал подобное решение но для других целей и нашел статью в интернете где подробно описана функция фильтрации. Правда там на php решение. Здесь https://cryptoxer.ru/forum/url-php-help/ сказано, как это сделать, я дублировать не буду это лишнее. Можете сами подробно изучить статью и полезное для себя получить. Там написан рабочий код, берите и пользуйтесь в своем проекте.
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.