Построение SQL-запроса с использованием нескольких (необязательных) полей поиска - PullRequest
0 голосов
/ 22 сентября 2010

У меня есть форма, которая будет использоваться для поиска в таблице заявок в службу поддержки.

пользователь может искать из нескольких сложных необязательных полей.

  • Дата (до / от)
  • Статус заявки
  • Инженер
  • Контактный билет

Мне интересно, как лучше всего обращаться с дополнительными поисковыми фильтрами. Итак, у меня есть запрос, который принимает параметры от пользователя. Поэтому, если пользователь выполняет поиск, используя даты и даты и даты, запрос должен включать BETWEEN. Так что мне нужно написать другой запрос, если пользователь ищет только из. или другой запрос, когда пользователь не добавил параметры даты? Тогда что, если раскрывающийся список статуса пуст? Это другой запрос?

Любая помощь, чтобы прояснить это было бы здорово!

Джоунси

Ответы [ 4 ]

3 голосов
/ 22 сентября 2010

Создайте свой запрос по частям.Начните с того, что является постоянным в вашем запросе, и добавьте больше SQL в зависимости от того, какие дополнительные условия:

$query = "SELECT ...
  FROM ...
  WHERE [where conditions that are always going to be present]";

if (isset($_POST['date_from']) && isset($_POST['date_to']))
{
  $query .= ... // query code for dealing with dates
}

if (isset($_POST['status']))
{
  $query .= ... // deal with status
}

// etc.

// Once you have your query fully built, execute it
$result_set = mysql_query($query);

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

3 голосов
/ 22 сентября 2010

Трудно сказать, не зная, какой тип абстракции БД вы используете, но при условии, что вы пишете SQL вручную, это довольно просто, просто создайте разделы вашего предложения where отдельно для каждой переменной.(Предполагая, что ваши переменные уже экранированы / указаны).

$where_clause = array();
if (!empty($date_from)) {
    $where_clause[] = "table.date >= $date_from";
}
if (!empty($date_to)) {
    $where_clause[] = "table.date <= $date_to";
}
if (!empty($status)) {
    $where_clause[] = "status = $status";
}

$query = 'select * from table where ' . join(' and ', $where_clause);
1 голос
/ 04 августа 2017

Это элегантный способ, которым я много пользуюсь, и желание тоже поможет вам:

$q = 'SELECT * FROM Users';
$buildQ = array();

if (empty($idOrName) === false) {
    $buildQ[] = '(userid = "' . $idOrName . '" OR username LIKE "%' . $idOrName. '%")';
}

if (empty($nickname) === false) {
    $buildQ[] = 'nickname="' . $nickname . '"';
}

if (empty($salary) === false) {
    $buildQ[] = 'salary="' . $salary . '"';
}

// ... any other criterias like above if statements

if (count($buildQ) === 1) {
    $q .= ' WHERE ' . $buildQ[0];
} else if (count($buildQ) > 1) {
    $count = 0;
    foreach ($buildQ as $query) {
        if ($count === 0) {
            $q .= ' WHERE ' . $query;
        } else {
            $q .= ' AND ' . $query;
        }

        $count++;
    }
}
0 голосов
/ 22 сентября 2010

Я думаю, что было бы лучше, если бы вы генерировали запрос динамически во время выполнения, основываясь на том, какие поля заполнены. Таким образом, вы можете создать некоторый помощник, который добавляет определенные фрагменты запроса, если пропущена только одна дата, а другая пуста, или когда оба пропущены и так далее.

...