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および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%');

すべてのクエリが1つの配列に含まれるようにします。次のステップは、設定されているかどうかに関係なく、それらを注文することです。

したがって、filter_3とfilter_1を有効にする場合は、配列キーを並べ替える必要があります。

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

クエリはそれらの間にANDを自動的に追加する必要があります。すべての有効なフィルターの場合、間に2つのANDが必要です。

私を助けてくれる人がいたら、本当にありがたいです。

どうもありがとう。

4

2 に答える 2

3

、 などの変数を個別$filter_1に設定しないでください。ただし、パーツに対して 1 つの配列を設定してください。$filter_2where

$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 に答える