Как сделать запрос c условиями в зависимости от значения переменных

форма с отображением данных из таблицы и фильтрацией

Нужно сделать так чтобы в таблицу загружались данные в зависимости от выбранных значений в <select>-ах

если в каком-то из <select>-ов значение не выбрано значит оно не используется в условии

данные из <select>-ов передаются в переменные так:

$ovdrb = $_POST['ovdrb'];
$sub = $_POST['subdivision'];
$type = $_POST['type'];
$manufacture = $_POST['manufacture'];
$model = $_POST['model'];

Имеется таблица в БД spravtech c именами столбцов id_ovdrb,id_subdivision, id_type, manufacture, model.

хотелось бы что-то вроде этого : SELECT * FROM spravtech WHERE id_ovdrb = $ovdrb AND id_subdivision = $sub AND type = $type, но если в переменной $type нет значения, значит оно в условие не включается и отображаются все записи по предыдущему условию, а так бы отображалось с ним и только с конкретным типом указанным в переменной $type


Ответы (1 шт):

Автор решения: Mike

Типовой универсальный вариант разбора POST, в случае если в sql запросе нужны только равенства:

  $where = array();
  $param = array();
  // Используем массив возможных параметров с их именами в POST и в базе данных
  foreach(["ovdrb" => "id_ovdrb", "sub" => "id_subdivision", "type" => "type"]
          as $local => $db_name) {
      if(isset($_POST[$local])) {
          $where[] = $db_name . '=?';
          $param[] = $_POST[$local];
      }
  }
  $sql = "SELECT * FROM spravtech";
  if(count($where)) {
      $sql = $sql . ' WHERE ' . implode(' AND ', $where);
  }
  // При использовании PDO вызывается так
  $query = $db->prepare($sql);
  $query->execute($param);

На выходе получаем запрос на подобии SELECT * FROM spravtech WHERE id_ovdrb = ? AND id_subdivision = ? AND type = ? и массив параметров, который можно сразу передать на вход PDO execute или выполнить по нему bind_param для mysqli. В случае использования не только равенств но и других выражений вроде проверок на больше/меньше или like то можно и не делать универсальный цикл, а по очереди писать условия вроде

if(isset($_POST['abc'])) {
    $where[] = "abc_field like ?";
    $param[] = "%".$_POST['abc']."%";
}

Главное заполнить массив с условиями для запроса и массив параметров для выполнения синхронно, в одинаковом порядке.

→ Ссылка