Каков наилучший способ условного добавления значений флажка в запрос PHP MySQLi вместе с соответствующими OR?

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

Извините, это не самый чистый код, но я надеюсь, вы сможете его понять. У меня есть 4 параметра GET (P, O, N, C).

Эти параметры GET являются результатом установки флажков и либо имеют значение ON, либо не будут передаваться в строке URL.

Если флажок установлен, мне нужно добавить к SQL-запросу вместе с ИЛИ после него - если последующий параметр GET также включен (чтобы избежать ненужного ИЛИ в конце).

Я предполагаю, что ответом на это будет сохранение параметров GET в массиве и цикл while для каждого из них?

$select = "SELECT * FROM cif_schedules WHERE tiploc_code = '$t'";
$select .= " AND (";
if ($_GET['w'] == "on"){$select .= "cif_schedules.CIF_stp_indicator = 'P' ";}
if ($_GET['o'] == "on" && ($_GET['w'] == "on")){$select . = " or ";};
if ($_GET['o'] == "on"){$select .= "cif_schedules.CIF_stp_indicator = 'O' ";}
if ($_GET['s'] == "on" && ($_GET['o'] == "on" || $_GET['w'] == "on")){$select . = " or ";};
if ($_GET['s'] == "on"){$select .= "cif_schedules.CIF_stp_indicator = 'N' ";}
if ($_GET['c'] == "on" && ($_GET['s'] == "on" || $_GET['o'] == "on" || $_GET['w'] == "on")){$select . = " or ";};
if ($_GET['c'] == "on"){$select .= "cif_schedules.CIF_stp_indicator = 'C' ";}
$select .= ")";
$select .= " AND deleted >= '$maxdate' AND created <= '$maxdate'";

Я дезинфицирую ввод пользователя, поэтому не беспокойтесь о безопасности и т. д. Спасибо

не беспокойтесь о безопасности и т. д. Хорошо, если у вас ничего нет в $_GET тогда? ваш запрос должен выглядеть как SELECT * FROM table WHERE (cif_schedule_locations.tiploc_code = '$t') И () И....
devpro 18.07.2019 10:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я бы сделал массив преобразования, который переводит входное значение в значение в БД. Пройдитесь по этому массиву и создайте запрос.

Что-то вроде этого:

// FormValue => DbValue
$conversions = ['w' => 'P', 'o' => 'O', 's' => 'N', 'c' => 'C'];
$ors = [];

foreach($conversions as $input => $value) {
    // Check if $input is in $_GET and if its value is 'on'
    if (isset($_GET[$input]) && $_GET[$input] == 'on') {
        // Push in $ors
        $ors[] = "cif_schedules.CIF_stp_indicator = '{$value}'";
    }
}

Таким образом, вы получите все OR в массиве $ors, которые вам просто нужно взорвать и добавить в $select при необходимости:

$select = "SELECT * FROM cif_schedules WHERE tiploc_code = '$t'";
// Check if there are some OR
if (!empty($ors)) {
    // Add the ORs to the query
    $select.= ' AND ('.implode(' OR ', $ors).')';
}
$select .= " AND deleted >= '$maxdate' AND created <= '$maxdate'";

Другие вопросы по теме