Как реализовать фильтрацию товаров в каталоге через 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 шт):

Автор решения: zmrz

Это не сортировка, а фильтрация.

Можно сделать быстро, грязно и небезопасно

<?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 то вообще сократить бинды запросов.

→ Ссылка