我在根据用户输入过滤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']]);
}
我意识到我的第一个例子是基于过滤器为真的包括,第二个例子是基于真实过滤器的排除。我真的不在乎我使用哪个 - 我可以交换比较运算符以适应 - 我只是在寻找有效的代码!
提前感谢您的帮助!
答案 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();