高度动态的表筛选


Highly Dynamic Table Filtering

我在根据用户输入过滤 SQL 表时遇到问题;我不太清楚如何使其对我需要适应的输入范围具有鲁棒性。

本质上,从 POST 数据中提取的用户输入用于从包含过滤器参数的 SQL 表构建数组 ($filterarray)。 从每个选定的表行拉入数组中的三列;第 1 列是对应于"finaloutputs"SQL 表中列名的字符串,第 2 列包含比较运算符,第三列是整数值。 因此,如果按字符串顺序返回,数组的每一行都会构建一个选择筛选器,例如"column_x <10"或"columm_y = 6"。 $filterarray可以有 1 到 100+ 行之间的任何行,指向 finaloutput 中的各种列,并使用任何比较运算符。

如下所示的查询工作正常:

$cf1 = wombats
$cf2 = “=”
$cf3 = 0
$result = $DBLink->query("SELECT id FROM finaloutputs WHERE $cf1 $cf2 $cf3");

但这只是直接注入一组变量。 我如何使用一整套参数来做到这一点? 代码需要在"and"样式的运算符下工作;返回的结果必须满足所有筛选器。

似乎这应该以某种方式可以通过"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();