Как реализовать несколько поисковых фильтров в php - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь внедрить фильтры в php и mysql для поиска записи в базе данных .... Фильтры должны быть такими, как если бы из 6 фильтров только два были выбраны, запрос будет выполнять операцию "И" для этих двух и извлекать данные из базы данных иесли три, то он выполнит операцию «И» для этих трех фильтров ..... один из способов реализовать это проверить каждый фильтр как.

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 голосов
/ 14 марта 2019

Я пытался использовать ответ от @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){
0 голосов
/ 09 февраля 2019

Это может сработать, если предположить, что ваши $_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 = "SELECT * FROM table" WHERE name = 'name' AND city = 'city'AND age = 'age'; "

Я думаю, что это может сработать, хотя этот пример кода не включает в себя очистку от внедрения SQL, поэтому вам, вероятно, следует добавить что-то для очистки потенциально опасного ввода

Обновлено : добавлено $filtered_get = array_filter($_GET); для фильтрации любых пустых полей из $_GET массив

0 голосов
/ 09 февраля 2019

Вы можете использовать префикс для элементов формы, например, 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 ");
0 голосов
/ 09 февраля 2019
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"';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...