0

你好我喜欢为我的搜索引擎编写一个过滤器。我对不同的选择查询有一些问题。所以主要想法是我有一些带有复选框的输入字段,例如:

输入字段 a:[ _ ] 过滤器开/关:[ ]

输入字段 b:[ _ ] 过滤器开/关:[]

输入字段 c:[ _ ] 过滤器开/关:[]

为了设置查询,我为每个字段命名了查询:

if ($filter_a == true) {
        $filter_1 =" `a` LIKE '%$input_a%' ";
    }

if ($filter_b == true) {
        $filter_2 =" `b` LIKE '%$input_b%' ";
    }

if ($filter_c == true) {
        $filter_3 =" `c` LIKE '%$input_c%' ";
    }

因此,在启用过滤器的情况下,选择查询应该以特定方式更改,例如:

在启用 filter_a 的情况下:

$query = "SELECT `a`, `b`, `c` FROM `table` WHERE $filter_a";

在启用 filter_a AND filter_b 的情况下:

$query = "SELECT `a`, `b`, `c` FROM `table` WHERE $filter_a AND filter_b";

如果启用 filter_a AND filter_b AND filter_c:

$query = "SELECT `a`, `b`, `c` FROM `table` WHERE $filter_a AND filter_b AND filter_c";

我在向查询中添加“AND”时遇到问题。因此我集成了一个计数器来计算设置了多少过滤器:

$counter = 0;
...
if(!empty($_POST['input_a']) && (!empty($_POST['checkbox_filter_1'])) ){
        $filter++;
}
...

if ($counter == 2) {
$and1 = " AND ";
     $query = "SELECT `a`, `b`, `c` FROM `table` WHERE $filter_a $and1 filter_b";
}

所以主要问题是排列。到目前为止,我有 5 个过滤器,这意味着有 125 种可能性可供比较。

所以我的下一个想法是为每个查询创建一个数组并对其进行排序。

所以它应该看起来像:

$ordered_query = (
1-> `a` LIKE '%$input_a%',
2-> `b` LIKE '%$input_b%',
3-> `c` LIKE '%$input_c%');

这样我就可以将所有查询放在一个数组中。下一步应该是针对已设置或未设置的过滤器对它们进行排序。

因此,在启用 filter_3 和 filter_1 的情况下,它应该对数组键进行排序:

$ordered_query = ( 1-> input_a 2-> input_c );

并且查询应该在它们之间自动添加 AND。如果所有启用的过滤器之间必须有 2 个 AND。

如果有人可以帮助我,我真的很感激。

多谢。

4

2 回答 2

3

不要为零件设置一个单独$filter_1的、、$filter_2等变量,而是设置一个数组where

$where = array();
if ($filter_a == true) {
    $where[] =" `a` LIKE '%$input_a%' ";
}

if ($filter_b == true) {
    $where[] =" `b` LIKE '%$input_b%' ";
}

if ($filter_c == true) {
    $where[] =" `c` LIKE '%$input_c%' ";
}

$query = "SELECT `a`, `b`, `c` FROM `table`";
if ( !empty($where) ) {
  $query .= " WHERE " . implode(' AND ', $where);
}
于 2012-05-02T10:38:19.657 回答
1

您应该将所有条件放在一个数组中并使用函数implode

$conditions = array();
$conditions[] = " `a` LIKE '%$input_a%' ";
$conditions[] = " `b` LIKE '%$input_b%' ";
// ...
$query = "SELECT ... WHERE ".implode(" AND ", $conditions);
于 2012-05-02T10:37:58.170 回答