所以我想构建一个过滤器功能,用户可以在表单页面上填写任意数量的输入。所以他们可能会留下一些过滤器。如何在数据库中仅搜索用户提交的值?我知道如何执行此操作的唯一方法是使用if语句的大量集合来解释他们填写的每种可能的表单组合,例如:
<?php
if(isset($max) && isset($min) && isset($rank)) {
mysqli_query($connect, "SELECT * FROM books WHERE ...")
} else if (isset($max) && (isset($min))) {
// so on and so forth
}
现在上面的代码看起来可以管理,如果我只有3个过滤器,但在这种情况下我有一个相当大的过滤器列表,我只需要在用户提交的东西时应用它们。总而言之,我认为有不同过滤器的30个潜在组合。
提前感谢您的帮助。
答案 0 :(得分:0)
您可以逐个构造查询字符串。首先你设置:
$s = "SELECT * FROM books WHERE 1 ";
然后在你写的每个过滤器上:
if(isset(...)) {
$s .= " AND myfield = $myvalue ";
}
最后你可以追加:
$s .= " ORDER BY somewhat;";
当然应该进行一些转义或更好地使用mysqli_查询。
在WHERE
之后放置条件“1”可以帮助您在每个行中使用AND
运算符,这是否是第一个活动条件。如果while
数据结构合理,您可以将条件放在POST
循环中。您可以将HTML输入文件命名为“filter [1]”,“filter [2]”等等,然后您可以使用循环对它们进行迭代。
答案 1 :(得分:0)
行动要点
所以
$possibleValuesKeys = ['min', 'max', 'rank', ...];
$values = array_filter(array_intersect_key($_POST, array_flip($possibleValuesKeys)));
$sql = 'SELECT * FROM table WHERE ' . implode(' AND ', array_map(
function ($v, $k) { return sprintf("%s = '%s' ", $k, $v); },
$values,
array_keys($values)
))