Как сделать запрос 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 шт):
Типовой универсальный вариант разбора 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']."%";
}
Главное заполнить массив с условиями для запроса и массив параметров для выполнения синхронно, в одинаковом порядке.
