Php 高度动态表过滤
我在根据用户输入筛选SQL表时遇到问题;我不太明白如何使它对我需要适应的输入范围保持健壮 本质上,从POST数据中提取的用户输入用于从包含过滤器参数的SQL表构建数组$filterarray。从每个选定表行将三列拉入数组;第1列是与“finaloutputs”SQL表中的列名相对应的字符串,第2列包含比较运算符,第3列是整数值。因此,如果以字符串的顺序返回,数组的每一行将构建一个选择过滤器,例如“column_x<10”或columm_y=6$filterarray可以有1到100+行,指向finaloutputs中的各个列,并使用任何比较运算符 下面这样的查询可以正常工作:Php 高度动态表过滤,php,mysqli,foreach,unset,array-filter,Php,Mysqli,Foreach,Unset,Array Filter,我在根据用户输入筛选SQL表时遇到问题;我不太明白如何使它对我需要适应的输入范围保持健壮 本质上,从POST数据中提取的用户输入用于从包含过滤器参数的SQL表构建数组$filterarray。从每个选定表行将三列拉入数组;第1列是与“finaloutputs”SQL表中的列名相对应的字符串,第2列包含比较运算符,第3列是整数值。因此,如果以字符串的顺序返回,数组的每一行将构建一个选择过滤器,例如“column_x
$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();
啊,当然。这确实应该奏效。我忘记了$sql的内容只是一个字符串。我敢肯定,新手犯了个错误。非常感谢,这正是我想要的!