2015-03-06 7 views
0

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

Ааа, конечно. Это действительно должно работать. Я забыл, что содержимое $ sql - это просто строка. Ошибка у новичков, я уверен. Большое спасибо, это именно то, что я искал! – Wavelength