Фильтрация товаров по checkbox с отправкой запроса в базу данных
Реализация динамического фильтра товаров с использованием флажков (checkbox) - одна из ключевых задач интернет-магазинов. Пользователь отмечает нужные диапазоны, например 20-25 и 35-45, и система подгружает подходящие записи из базы данных. В этой статье мы разберём, как организовать такой механизм на стороне клиента и сервера.
Архитектура фильтрации: от клика до базы данных
Для корректной работы необходимо настроить обмен данными между интерфейсом пользователя и серверной частью. Основные этапы:
- Отслеживание события change на каждом чекбоксе
- Сбор выбранных значений в массив
- Отправка асинхронного запроса (AJAX) на сервер
- Обработка запроса и выборка товаров из БД
- Возврат результата и обновление страницы
Клиентская часть: JavaScript для сбора значений
Предположим, у вас есть чекбоксы с атрибутом data-range, содержащим диапазон (например, '35-50'). При изменении состояния любого чекбокса собираем все выбранные значения и отправляем на сервер:
document.querySelectorAll('input[type="checkbox"]').forEach(cb => {
cb.addEventListener('change', function() {
const selected = [];
document.querySelectorAll('input[type="checkbox"]:checked').forEach(c => {
selected.push(c.getAttribute('data-range'));
});
fetch('/filter', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({ranges: selected})
})
.then(response => response.json())
.then(data => {
// обновить список товаров на странице
});
});
});Серверная часть: обработка запроса на PHP
На сервере получаем массив выбранных диапазонов. Чтобы выбрать товары, размер которых попадает в любой из указанных интервалов, используем SQL-запрос с динамическим построением условий:
$ranges = json_decode(file_get_contents('php://input'), true)['ranges'];
$conditions = [];
foreach ($ranges as $range) {
list($min, $max) = explode('-', $range);
$conditions[] = "(size BETWEEN $min AND $max)";
}
$sql = "SELECT * FROM products WHERE " . implode(' OR ', $conditions);
$result = mysqli_query($conn, $sql);
// вернуть данные в JSONОсобенности работы с диапазонами в БД
Если размеры хранятся в виде строк (например, '35-50'), потребуется предварительная обработка. Рекомендуется хранить минимальное и максимальное значение в отдельных столбцах (size_min и size_max). Это упростит запросы и улучшит производительность. Пример структуры таблицы:
id- идентификатор товараname- названиеsize_min- минимальный размер (INT)size_max- максимальный размер (INT)
Тогда запрос будет выглядеть так: SELECT * FROM products WHERE (size_min <= ? AND size_max >= ?) OR ...
Оптимизация для множественных выборов
При одновременном выборе нескольких диапазонов важно избежать дублирования товаров. Используйте DISTINCT или группировку. Для ускорения работы добавьте индексы на поля size_min и size_max.
Пример работы фильтра на практике
Пользователь отмечает чекбоксы «20-25» и «35-45». При нажатии отправляется AJAX-запрос с массивом ['20-25', '35-45']. Сервер формирует условие (size BETWEEN 20 AND 25) OR (size BETWEEN 35 AND 45) и возвращает все товары, попадающие хотя бы в один из интервалов. На странице динамически обновляется каталог.
Заключение
Реализация фильтрации по чекбоксам требует согласованной работы фронтенда и бэкенда. Используя простые AJAX-запросы и грамотные SQL-условия, вы сможете быстро отбирать товары по любым диапазонам. Для масштабируемости храните размеры в нормализованном виде и не забывайте про индексацию базы данных.