16 пунктов выбора в поиске в 1 команде Mysql. PHP

142
23 апреля 2022, 18:30

Коллеги, необходимо организовать поиск по 16 пунктам, не закидывайте камнями, я учусь как и все вы.

Понимаю что запрос идет методом $_GET в форме, также понимаю что нужно использовать AJAX в котором полный ноль, чтобы результаты поиска показывались без перезагрузки.

Команды Mysql понятны BETWEEN AND и другие, по отдельности их можно прописать к каждому пункту, а вот как сделать в 1 запросе к БД их все???

Все запросы перекидываются в суперглобальный массив $_GET ,а дальше? Используется сессия?

Подскажите в какую сторону идти, архитектурно понимаю что это довольно просто, но собрать части воедино пока не хватает навыков.

Форма:

<form action="" id="search.php" method= ""GET>
            <!--Марка-->
            <!---->
            <div class="FullMark">
                <h3>Марка</h3>
                <label>
                    <select id="full_mark" class="select2" name="mark">
                        <option value="0" selected>Все марки</option>
                        <?php if (isset($marks)): ?>
                            <?php foreach ($marks as $mark): ?>
                                <option value="<?=$mark['id']; ?>" <?= (isset($_GET['mark']) && ($_GET['mark'] == $mark['id'])) ? ' selected' : null; ?>><?=$mark['title']; ?></option>
                            <?php endforeach; ?>
                        <?php endif; ?>
                    </select>
                </label>
            </div>
            <!--Модель-->
            <!---->
            <div class="FullModel">
                <h3>Модель</h3>
                <label>
                    <select id="full_model" class="select2" name="model">
                        <option value="0" disabled selected>Выберите модель</option>
                    </select>
                </label>
            </div>
            <!--Город-->
            <!---->
            <div class="FullTown">
                <h3>Город</h3>
                <label>
                    <select name="town_sell" class="select2">
                        <option value="0" selected>Все города</option>
                        <?php if (isset($cities)): ?>
                            <?php foreach ($cities as $city): ?>
                                <option value="<?=$city['id']; ?>" <?= (isset($_GET['town_sell']) && ($_GET['town_sell'] == $city['id'])) ? ' selected' : null; ?>><?=$city['title']; ?></option>
                            <?php endforeach; ?>
                        <?php endif; ?>
                    </select>
                </label>
            </div>
            <!--Стоимость-->
            <!---->
            <div class="FullPrice">
                <h3>Цена</h3>
                <label for="Price">от </label><input type="number" id="Price" name="price_from" placeholder="100.000" min="0" value="<?= (isset($_GET['price_from'])) ? $_GET['price_from'] : null; ?>">
                <label for="Price2"> до </label><input type="number" id="Price2" name="price_to" placeholder="300.000" min="0" value="<?= (isset($_GET['price_to'])) ? $_GET['price_to'] : null; ?>">
            </div>
            <!--Количество владельцев-->
            <!---->
            <div class="FullOwners">
                <h3>Количество владельцев</h3>
                <label>
                    <select name="owners" class="select2">
                        <option value="0">Не имеет значения</option>
                        <option value="1" <?= (isset($_GET['owners']) && ($_GET['owners'] == 1)) ? ' selected' : null; ?>>0 владельцев/Новый</option>
                        <option value="2" <?= (isset($_GET['owners']) && ($_GET['owners'] == 2)) ? ' selected' : null; ?>>1</option>
                        <option value="3" <?= (isset($_GET['owners']) && ($_GET['owners'] == 3)) ? ' selected' : null; ?>>2</option>
                        <option value="4" <?= (isset($_GET['owners']) && ($_GET['owners'] == 4)) ? ' selected' : null; ?>>3</option>
                        <option value="5" <?= (isset($_GET['owners']) && ($_GET['owners'] == 5)) ? ' selected' : null; ?>>Более 3-х</option>
                    </select>
                </label>
            </div>
            <!--Пробег-->
            <!---->
            <div class="FullRun">
                <h3>Пробег</h3>
                <label for="Run">до </label><input type="text" id="Run" name="run" maxlength="9" placeholder="5000" min="0"  value="<?= (isset($_GET['run'])) ? $_GET['run'] : null; ?>"/> км.
            </div>
            <!--Бит или не бит-->
            <!---->
            <div class="FullNotBroken">
                <h3>Бит/Не бит</h3>
                <label>
                    <select name="not_broken" class="select2">
                        <option value="0">Не имеет значения</option>
                        <option value="1" <?= (isset($_GET['not_broken']) && ($_GET['not_broken'] == 1)) ? ' selected' : null; ?>>Не требует ремонта</option>
                        <option value="2" <?= (isset($_GET['not_broken']) && ($_GET['not_broken'] == 2)) ? ' selected' : null; ?>>Требует ремонта</option>
                    </select>
                </label>
            </div>
            <!--Год выпуска-->
            <!---->
            <div class="FullYear">
                <h3>Год выпуска</h3>
                <!---->
                <!--Год выпуска ОТ-->
                <!---->
                <label for="YearFrom">от </label>
                <select id="YearFrom" name="year_from" class="select2">
                    <option value="0">Не имеет значения</option>
                    <?php for ($i = date('Y'); $i >= 1900; $i--): ?>
                        <option value="<?=$i; ?>" <?= (isset($_GET['year_from']) && ($_GET['year_from'] == $i)) ? ' selected' : null; ?>><?=$i; ?></option>
                    <?php endfor; ?>
                </select>
                <!--Год выпуска ДО-->
                <!---->
                <label for="YearTo">до </label>
                <select id="YearTo" name="year_to" class="select2">
                    <option value="0">Не имеет значения</option>
                    <?php for ($i = date('Y'); $i >= 1900; $i--): ?>
                        <option value="<?=$i; ?>" <?= (isset($_GET['year_to']) && ($_GET['year_to'] == $i)) ? ' selected' : null; ?>><?=$i; ?></option>
                    <?php endfor; ?>
                </select>
            </div>
            <!--Тип кузова-->
            <!---->
            <div class="FullCarBody">
                <h3>Тип кузова</h3>
                <label>
                    <select name="car_body" class="select2">
                        <option value="0">Не имеет значения</option>
                        <option value="1" <?= (isset($_GET['car_body']) && ($_GET['car_body'] == 1)) ? ' selected' : null; ?>>Седан</option>
                        <option value="2" <?= (isset($_GET['car_body']) && ($_GET['car_body'] == 2)) ? ' selected' : null; ?>>Хэтчбэк</option>
                        <option value="3" <?= (isset($_GET['car_body']) && ($_GET['car_body'] == 3)) ? ' selected' : null; ?>>Универсал</option>
                        <option value="4" <?= (isset($_GET['car_body']) && ($_GET['car_body'] == 4)) ? ' selected' : null; ?>>Купе</option>
                        <option value="5" <?= (isset($_GET['car_body']) && ($_GET['car_body'] == 5)) ? ' selected' : null; ?>>Пикап</option>
                        <option value="6" <?= (isset($_GET['car_body']) && ($_GET['car_body'] == 6)) ? ' selected' : null; ?>>Лифтбэк</option>
                        <option value="7" <?= (isset($_GET['car_body']) && ($_GET['car_body'] == 7)) ? ' selected' : null; ?>>Кабриолет</option>
                        <option value="8" <?= (isset($_GET['car_body']) && ($_GET['car_body'] == 8)) ? ' selected' : null; ?>>Кроссовер</option>
                        <option value="9" <?= (isset($_GET['car_body']) && ($_GET['car_body'] == 9)) ? ' selected' : null; ?>>Внедорожник</option>
                        <option value="10" <?= (isset($_GET['car_body']) && ($_GET['car_body'] == 10)) ? ' selected' : null; ?>>Минивэн</option>
                        <option value="11" <?= (isset($_GET['car_body']) && ($_GET['car_body'] == 11)) ? ' selected' : null; ?>>Компактвэн</option>
                        <option value="12" <?= (isset($_GET['car_body']) && ($_GET['car_body'] == 12)) ? ' selected' : null; ?>>Родстер</option>
                        <option value="13" <?= (isset($_GET['car_body']) && ($_GET['car_body'] == 13)) ? ' selected' : null; ?>>Фургон</option>
                    </select>
                </label>
            </div>
            <!--Количество л.с.-->
            <!---->
            <div class="FullHorsePower">
                <h3>Количество л.с.</h3>
                <label for="HorsePower">до </label><input type="number" id="HorsePower" name="horse_power" placeholder="245" min="0"  value="<?= (isset($_GET['horse_power'])) ? $_GET['horse_power'] : null; ?>"> л.с.
            </div>
            <!--ПТС-->
            <!---->
            <div class="FullPTS">
                <h3>ПТС оригинал или дубликат.</h3>
                <label>
                    <select name="pts" class="select2">
                        <option value="0">Не имеет значения</option>
                        <option value="1" <?= (isset($_GET['pts']) && ($_GET['pts'] == 1)) ? ' selected' : null; ?>>Оригинал</option>
                        <option value="2" <?= (isset($_GET['pts']) && ($_GET['pts'] == 2)) ? ' selected' : null; ?>>Дубликат</option>
                    </select>
                </label>
            </div>
            <!----Цвет---->
            <!---->
            <div class="FullColor">
                <h3>Цвет</h3>
                <label>
                    <select name="color" class="select2">
                        <option value="0">Не имеет значения</option>
                        <option value="1" <?= (isset($_GET['color']) && ($_GET['color'] == 1)) ? ' selected' : null; ?>>Черный</option>
                        <option value="2" <?= (isset($_GET['color']) && ($_GET['color'] == 2)) ? ' selected' : null; ?>>Белый</option>
                        <option value="3" <?= (isset($_GET['color']) && ($_GET['color'] == 3)) ? ' selected' : null; ?>>Металлик</option>
                        <option value="4" <?= (isset($_GET['color']) && ($_GET['color'] == 4)) ? ' selected' : null; ?>>Коричневый</option>
                        <option value="5" <?= (isset($_GET['color']) && ($_GET['color'] == 5)) ? ' selected' : null; ?>>Серый</option>
                        <option value="6" <?= (isset($_GET['color']) && ($_GET['color'] == 6)) ? ' selected' : null; ?>>Желтый</option>
                        <option value="7" <?= (isset($_GET['color']) && ($_GET['color'] == 7)) ? ' selected' : null; ?>>Красный</option>
                        <option value="8" <?= (isset($_GET['color']) && ($_GET['color'] == 8)) ? ' selected' : null; ?>>Зеленый</option>
                        <option value="9" <?= (isset($_GET['color']) && ($_GET['color'] == 9)) ? ' selected' : null; ?>>Синий</option>
                        <option value="10" <?= (isset($_GET['color']) && ($_GET['color'] ==10 )) ? ' selected' : null; ?>>Серебристый</option>
                        <option value="11" <?= (isset($_GET['color']) && ($_GET['color'] == 11)) ? ' selected' : null; ?>>Бежевый</option>
                        <option value="12" <?= (isset($_GET['color']) && ($_GET['color'] == 12)) ? ' selected' : null; ?>>Другой</option>
                    </select>
                </label>
            </div>
            <!--Коробка передач-->
            <!---->
            <div class="FullAKPP">
                <h3>Коробка передач</h3>
                <label>
                    <select name="akpp" class="select2">
                        <option value="0">Не имеет значения</option>
                        <option value="1" <?= (isset($_GET['akpp']) && ($_GET['akpp'] == 1)) ? ' selected' : null; ?>>Механика</option>
                        <option value="2" <?= (isset($_GET['akpp']) && ($_GET['akpp'] == 2)) ? ' selected' : null; ?>>Автомат</option>
                        <option value="3" <?= (isset($_GET['akpp']) && ($_GET['akpp'] == 3)) ? ' selected' : null; ?>>Робот</option>
                        <option value="4" <?= (isset($_GET['akpp']) && ($_GET['akpp'] == 4)) ? ' selected' : null; ?>>Вариатор</option>
                    </select>
                </label>
            </div>
            <!--Привод-->
            <!---->
            <div class="FullDrive">
                <h3>Привод</h3>
                <label>
                    <select name="drive" class="select2">
                        <option value="0">Не имеет значения</option>
                        <option value="1" <?= (isset($_GET['drive']) && ($_GET['drive'] == 1)) ? ' selected' : null; ?>>Передний</option>
                        <option value="2" <?= (isset($_GET['drive']) && ($_GET['drive'] == 2)) ? ' selected' : null; ?>>Задний</option>
                        <option value="3" <?= (isset($_GET['drive']) && ($_GET['drive'] == 3)) ? ' selected' : null; ?>>Полный</option>
                    </select>
                </label>
            </div>
            <!--Тип топлива-->
            <!---->
            <div class="FullGasoline">
                <h3>Тип топлива</h3>
                <label>
                    <select name="gasoline" class="select2">
                        <option value="0">Не имеет значения</option>
                        <option value="1" <?= (isset($_GET['gasoline']) && ($_GET['gasoline'] == 1)) ? ' selected' : null; ?>>Бензин</option>
                        <option value="2" <?= (isset($_GET['gasoline']) && ($_GET['gasoline'] == 2)) ? ' selected' : null; ?>>Дизель</option>
                        <option value="3" <?= (isset($_GET['gasoline']) && ($_GET['gasoline'] == 3)) ? ' selected' : null; ?>>Гибрид</option>
                        <option value="4" <?= (isset($_GET['gasoline']) && ($_GET['gasoline'] == 4)) ? ' selected' : null; ?>>Электромобиль</option>
                    </select>
                </label>
            </div>
            <!---->
            <!--Продавец-->
            <!---->
            <div class="FullWhoSell">
                <h3>Продавец</h3>
                <label>
                    <select name="who_sell" class="select2">
                        <option value="0">Не имеет значения</option>
                        <option value="1" <?= (isset($_GET['who_sell']) && ($_GET['who_sell'] == 1)) ? ' selected' : null; ?>>Собственник</option>
                        <option value="2" <?= (isset($_GET['who_sell']) && ($_GET['who_sell'] == 2)) ? ' selected' : null; ?>>Автосалон</option>
                    </select>
                </label>
            </div>
            <!--Кнопка поиск-->
            <!---->
            <div>
                <button class="BlueButton" name="submit" value="search">Найти</button>
            </div>
        </form>
    </details>
</div>

Что нужно получить:

  1. Пользователь выставляет необходимые пункты, часть из них может оставаться пустой, нажимает поиск и ему выводится в цикле Foreach необходимые данные без перезагрузки страницы.

  2. Этот же пользователь может повторно в этой же форме выставить еще какие-то пункты и снова нажать поиск, хоть 50 раз подряд, меняться будет только вывод в цикле из того, что он выбрал.

Если нужно еще что-то дополнить из входных данных, напишите, я добавлю.

Answer 1
  1. Так как вы собираетесь отправлять данные с помощью ajax, вам не нужно в форме проверять isset($_GET['gasoline']) и пр. У вас же перезагрузки нет. Выбрали селект, нажали кнопку - данные поменялись. Более того - сама форма <form> тоже не нужна. Запрос к серверу будет формировать обработчик js.

Пусть упрощенно будут такие селекты:

<select name="models">
    <option value="model1">Model1</option>
    <option value="model2">Model2</option>
</select>
<select name="prices">
    <option value="price1">Price1</option>
    <option value="price2">Price2</option>
</select>
<input id="btn" type="button" value="go">
<div id="response_container"></div>
  1. Собственно, далее вам нужно создать этот js обработчик для кнопки Найти, который будет собирать данные с селектов (ваши 16 фильтров) и отправлять на сервер.
<script>
// Обработчик кнопки Найти. При клике - запускается функция runFilters()
let btn = document.getElementById('btn');
btn.addEventListener('click', runFilters);

function runFilters() {
    // Получим все <select>
    let selectElems = document.querySelectorAll('select');
    let fd = {};
    // достанем из них имя и значение, сохраним все в объекте "fd"
    selectElems.forEach(function (select) {
        fd[select.getAttribute('name')] = select.value;
    });
    // выполним запрос к серверу (методом POST)
    $.ajax({
        url: 'get.php',
        type: 'POST',
        data: fd,
        success: function (response) {
            $('#response_container').html(response);
        }
    });
}
</script>
  1. На сервере отдельный php скрипт будет принимать эти данные. Если отправляли get запрос, то в массиве $_GET там - 16 фильтров (или меньше, если не все выбраны). Вы их обрабатываете, собираете запрос к бд, выполняете, получаете массив с данными.

  2. Преобразуете массив в json (или сразу в html, как вам удобнее) и отправляете обратно.

<?php
// get.php
// Здесь - делаете все что нужно с данными. Отправляете запрос к бд и т.д.
// Сейчас для демонстрации просто обернем пришедшие данные в <pre>
$response = '<pre>'.print_r($_POST, true).'</pre>';
// и отдадим:
echo $response;
  1. Обработчик, созданный на шаге 2, принимает данные и меняет нужное содержимое
READ ALSO
Ежедневный буфер активности

Ежедневный буфер активности

Нужен советСовсем скоро планирую добавить на сайт модуль по сбору информации о активности пользователя и подсчёта этой активности

155
SQL query для поиска разницы значений

SQL query для поиска разницы значений

есть база данных вида:

234
Зависший процесс на ip адресе

Зависший процесс на ip адресе

Возникла следующая проблема — при опросе ip адресов, которые берутся с БД, на некоторых ip адресах зависает метод подключенияСуть следующая...

235
Группировка вывода дочерних разделов в родительские Mysql

Группировка вывода дочерних разделов в родительские Mysql

Имеются города city, автомойки wash и посты на них bfrs

115