Я ищу некоторые предложения о том, как я могу превратить этот беспорядочный код во что-то более чистое и эффективное.
Извините, это не самый чистый код, но я надеюсь, вы сможете его понять. У меня есть 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'";
Я дезинфицирую ввод пользователя, поэтому не беспокойтесь о безопасности и т. д. Спасибо






Я бы сделал массив преобразования, который переводит входное значение в значение в БД. Пройдитесь по этому массиву и создайте запрос.
Что-то вроде этого:
// 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'";
$_GETтогда? ваш запрос должен выглядеть как SELECT * FROM table WHERE (cif_schedule_locations.tiploc_code = '$t') И () И....