高度动态的表过滤

时间:2015-03-06 04:22:24

标签: php mysqli foreach unset array-filter

我在根据用户输入过滤SQL表时遇到问题;我无法弄清楚如何使其适应我需要适应的输入范围。

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

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

$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']]); 
}

我意识到我的第一个例子是基于过滤器为真的包括,第二个例子是基于真实过滤器的排除。我真的不在乎我使用哪个 - 我可以交换比较运算符以适应 - 我只是在寻找有效的代码!

提前感谢您的帮助!

1 个答案:

答案 0 :(得分: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();