У меня проблема с фильтрацией таблицы SQL на основе пользовательского ввода; Я не могу понять, как сделать его устойчивым к диапазону входных данных, которые мне нужны.
По сути, пользовательский ввод, извлеченный из данных POST, используется для построения массива ($ filterarray) из таблицы SQL, содержащей параметры фильтра. Три столбца вытягиваются в массив из каждой выбранной строки таблицы; столбец 1 — это строка, соответствующая имени столбца в таблице SQL ‘finaloutputs’, столбец 2 содержит оператор сравнения, третий столбец — целочисленное значение. Таким образом, если возвращается в виде строки, каждая строка массива создает фильтр выбора, например «column_x». < 10 «или» columm_y = 6 «. $ filterarray может содержать от 1 до 100+ строк, указывая на различные столбцы в finaloutputs и используя любой оператор сравнения.
Запрос, подобный приведенному ниже, работает нормально:
$cf1 = wombats
$cf2 = “=”
$cf3 = 0
$result = $DBLink->query("SELECT id FROM finaloutputs WHERE $cf1 $cf2 $cf3");
Но это просто ввод одного набора переменных напрямую. Как я могу сделать это по существу с целым массивом параметров? Код должен работать под оператором «и»; возвращаемые результаты должны удовлетворять ВСЕМ фильтрам.
Кажется, что это должно как-то быть возможно с комбинацией «foreach» и «array_filter» или «unset». Я не могу определить, как на самом деле это сделать.
Например, что-то вроде этого (но это работает …):
//$filterarray contains in each row:
// string matching a column in finaloutputs table ('cf1')
// comparator ('cf2')
// value ('cf3')
$result = $DBLink->query("SELECT * FROM finaloutputs");
$resultarray = $result->fetch_assoc();
foreach ($filterarray as $row){
unset($resultarray[WHERE $row['cf1'] . $row['cf2'] . $row['cf3']]);
}
Я понимаю, что мой первый пример в том числе основанный на истинности фильтра, второй пример исключая на основе истинного фильтра. Мне действительно все равно, какой я использую — я могу поменять операторы сравнения, чтобы удовлетворить — я просто ищу эффективный код!
Заранее благодарю за любую помощь!
Почему бы не позволить SQL фильтровать данные, чтобы вы получили желаемый результат?
Это должно работать:
$sql = 'select * FROM finaloutputs WHERE TRUE';
foreach ($filterarray as $row){
$sql .= ' AND ' . $row['cf1'] . $row['cf2'] . $row['cf3'];
}
$resultarray = $DBLink->query($sql)->fetch_assoc();
Других решений пока нет …