Как реализовать фильтрацию товаров в каталоге через form на PHP?
Имеется определённый каталог, который нужно фильтровать по категориям: CRM, Бухгалтерия, Документооборот и Розница. Сами товары выводятся из БД, где и прописана их категория. Как мне сделать так, чтобы при выборе категории, например, CRM, и нажатии кнопки "Отсортировать" у меня оставались только те карточки товара, которые имеют категорию CRM?
HTML/PHP:
<?php
require_once 'php/inc/Connect.php';
$query = "SELECT * FROM `products`";
$result = mysqli_query($connect, $query);
?>
<!-- Форма для сортировки каталога -->
<form class="form-type" action='' method='post'>
<select class="form-type-select" name='select'>
<option value='crm-type'>1C: CRM</option>
<option value='buh-type'>1C: Бухгалтерия</option>
<option value='docs-type'>1C: Документооборот</option>
<option value='sell-type'>1C: Розница</option>
</select>
<input class="form-type-button" type='submit' name='submit' value='Отсортировать'>
</form>
<div class="div_container">
<?php
while($row = mysqli_fetch_array($result))
{ ?>
<!-- Карточка товара -->
<div class="tovars">
<div class="card">
<div class="image">
<img class="p-image" src="<?=$row['p_image']?>" alt="">
</div>
<div class="name">
<p class="p-name"><?=$row['p_name']?></p>
</div>
<div class="description">
<p class="p-description"><?=$row['p_description']?></p>
</div>
<div class="price">
<p class="p-price"><?=$row['p_price']?>.00 ₽</p>
</div>
<div class="to-basket">
<input type="submit" name="add-to-card" class="to-basket" value="В корзину">
</div>
</div>
</div>
<?php } ?>
</div>
SQL
CREATE TABLE `products` (
`id` int(255) NOT NULL,
`p_type` varchar(255) NOT NULL,
`p_name` varchar(255) NOT NULL,
`p_description` varchar(255) NOT NULL,
`p_price` varchar(255) NOT NULL,
`p_image` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Ответы (1 шт):
Это не сортировка, а фильтрация.
Можно сделать быстро, грязно и небезопасно
<?php
require_once 'php/inc/Connect.php';
$query = "SELECT * FROM `products`";
if(isset($_REQUEST['select']) {
$query .= " WHERE p_type = '%s'";
$query = sprintf("SELECT CountryCode FROM City WHERE name='%s'", mysqli_real_escape_string($_REQUEST['select']));
}
$result = mysqli_query($connect, $query);
?>
Можно сделать с заделом на будущее, если будет расширится пул фильтров
<?php
require_once 'php/inc/Connect.php';
$query = "SELECT * FROM `products`";
$types = '';
$values = [];
$result = mysqli_query($connect, $query);
if(isset($_REQUEST['select']) {
$query .= ' WHERE p_type = ?';
$types .= 's';
$values[] = $_REQUEST['select'];
}
$stmt = mysqli_prepare($connect, $query);
if(!empty($values)) {
$mysqli_stmt_bind_param($stmt, $types, ...$values);
}
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
?>
В обоих случаях просто заменяем первые пять строк на указанные.
По хорошему, неплохо было бы перекатить подключение к бд с процедурного на объектный, а если версия пыхи от 8.1 то вообще сократить бинды запросов.