当某些字段可能未填写时,按多个字段过滤数据库

时间:2017-05-19 21:09:22

标签: php mysql

所以我想构建一个过滤器功能,用户可以在表单页面上填写任意数量的输入。所以他们可能会留下一些过滤器。如何在数据库中仅搜索用户提交的值?我知道如何执行此操作的唯一方法是使用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个潜在组合。

提前感谢您的帮助。

2 个答案:

答案 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)
))