如何在php中实现多个搜索过滤器

时间:2019-02-09 13:11:15

标签: php mysql search filter

我正在尝试在php和mysql中实现过滤器以搜索数据库中的记录。...过滤器应该像是在6个过滤器中仅选择了两个过滤器一样,查询将对这两个过滤器执行“ AND”操作并从数据库和如果是三个,它将对这三个过滤器执行“与”运算。 一种实现方法是检查每个类似的过滤器。

if(isset($_GET['name'] && isset($_GET['city'])) { perform AND for these two};
elseif(isset($_GET['name'] && (isset($_GET['age'])) {perform AND for these three}.
and so on ...

但是问题是如果我有6个过滤器,那么我必须为其创建64个组合... 我在考虑是否有其他替代解决方案?

4 个答案:

答案 0 :(得分:1)

如果您的$_GET键与表中的列匹配,这可能会起作用:

$query = "SELECT * FROM table";

$filtered_get = array_filter($_GET); // removes empty values from $_GET

if (count($filtered_get)) { // not empty
    $query .= " WHERE";

    $keynames = array_keys($filtered_get); // make array of key names from $filtered_get

    foreach($filtered_get as $key => $value)
    {
       $query .= " $keynames[$key] = '$value'";  // $filtered_get keyname = $filtered_get['keyname'] value
       if (count($filtered_get) > 1 && (count($filtered_get) > $key)) { // more than one search filter, and not the last
          $query .= " AND";
       }
    }
}
$query .= ";"

$query =“从表中选择*名称='名称'AND城市='城市'AND年龄='年龄';”

我认为这可能可行,尽管此代码示例不包括针对SQL注入的清理,因此您可能应该添加一些内容来清理潜在的危险输入

已更新:添加了$filtered_get = array_filter($_GET);,以过滤掉$_GET数组中的所有空字段

答案 1 :(得分:0)

single if condition to check value is empty or not.for non-empty then mysql query is two between 'AND' operation.
$query = 'select * from info';
$where = ' Where';
$and = 'id = 1';
if(!empty($_GET['name'])){
  $and .= ' AND name="test"';
}
if(!empty($_GET['city'])){
  $and .= ' AND city="test"';
}
$q = $query.''.$where.''.$and;
make like this query is 'select & from info where id=1 AND name="test" AND city="test"';

答案 2 :(得分:0)

您可以为表单元素(例如filter-)使用前缀,因此项目看起来像filter-age,filter-name等。现在,假设您有一个类似

的函数
function buildFilters($input, $delimiter) {
    foreach ($input as $key => $value) {
        $filters = array();
        $filters[]="1=1";//default filter
        if (strpos($key, $prefix) === 0) {
            //add the filter to $filters via $filters[]=yourvalue
        }
    }
    return implode($delimiter, $filters);
}

然后您可以称呼它

$myFilters = buildFilters($_POST, " AND ");

答案 3 :(得分:0)

我尝试使用@tshimkus的答案。也许这是我设置阵列的方式或其他方法,但是在使它工作之前,我遇到了一些问题。

此行:

$query .= " $keynames[$key] = '$value'";

对我来说必须是:

$query .= " $key = '$value'";

我也没有得到最后一项有效的支票(如下所示)。

if (count($filtered_get) > 1 && (count($filtered_get) > $key)) { // more than one search filter, and not the last

最终使用了计数和

if($i!==$len){