Высокодинамичная фильтрация таблиц

У меня проблема с фильтрацией таблицы 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']]);
}

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

Заранее благодарю за любую помощь!

0

Решение

Почему бы не позволить 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();
0

Другие решения

Других решений пока нет …