2012-05-02 3 views
0

привет, я хочу закодировать фильтр для своей поисковой системы. У меня есть некоторые проблемы с различными выборами. поэтому основная идея заключается в том, что у меня есть некоторые inputfields с флажками, как:сортировка массива и добавление AND к запросу

InputField в: [_] фильтр вкл/выкл: []

InputField б: [_] фильтр вкл/выкл: []

InputField с: [_] фильтр вкл/выкл: []

установить запрос я назвал запрос для каждого поля:

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 И filter_b И filter_c:

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

У меня возникли проблемы с добавлением «И» к запросам. therfor я интегрировал счетчик, который подсчитывает, сколько фильтров установлено:

$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); 

и запрос должен automaticallyadd и между ними. в случае всех разрешенных фильтров между ними должно быть 2 AND.

если есть кто-то, кто мог бы помочь мне, я действительно был бы признателен.

спасибо большое.

ответ

1

Вы должны поместить все условия в массиве и использования функции implode:

$conditions = array(); 
$conditions[] = " `a` LIKE '%$input_a%' "; 
$conditions[] = " `b` LIKE '%$input_b%' "; 
// ... 
$query = "SELECT ... WHERE ".implode(" AND ", $conditions); 
+1

хороший разработчик будет предвидеть случай, когда все условия были пусты –

+0

Да, и это будет очевидно, когда кто-то попытается использовать его с пустым массивом. Кроме того, во многих случаях запрос содержит некоторое условие, поэтому он становится «SELECT ... WHERE condition AND» .implode (...) '. В этом случае вам не нужно проверять пустоту. Я просто ответил на то, что было задано. –

+0

хорошо, проблем нет. ответьте на то, что было задано –

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); 
} 
Смежные вопросы