Реализация запроса к базе данных с множественным условием where
Подскажите, пожалуйста, как правильно реализовать запрос к БД через PHP?
Допустим, имеется БД planets, и в ней столбцы такого типа:
- name: земля, меркурий, венера...
- размер: big, small, large
- температура: hot, cold
Все эти данные приходят с формы, и запрос:
Select * from Planet where размер = 'big' AND темепратура = 'hot'
Но, бывает такое, что в форме пропускают один из параметров намерено, дабы получить результат только по одному критерию:
Select * from Planet where размер = 'big' AND темепратура = ''
А если таких критериев (столбцов) будет больше, то как это реализовать на PHP?
if ($_POST['size'] = '') {
$sql = "Select * from planet where температура = $_POST['temperatura']";
} else {
"Select * from planet where размер = 'big' AND температура = $_POST['temperatura']"
}
Ответы (2 шт):
Суть примера кода ниже в том, чтобы показать, что такую задачу можно решить, собирая SQL-запрос согласно данным, которые поступают на сервер.
$sql = 'SELECT * FROM `planet` WHERE 1'; //Объявляем переменную, содержащую по умолчанию строку с SQL-запросом, выбирающим все строки из таблицы (не БД, а таблицы) planet
$whereAND = ''; //Объявляем пустую строку, содержащую дополнительные условия AND для SQL-запроса.
//Если пользователь указал, что хочет выбрать планеты по размеру (если в массиве $_POST содержится элемент с ключом size)
if (isset($_POST['size'])) {
$whereAND .= ' AND `size` = ' . $_POST['size']; //Добавляем в строку дополнительных условий условие выборки по размеру планеты
}
if (isset($_POST['temperature'])) {
$whereAND .= ' AND `temperature` = ' . $_POST['temperature'];
}
//и т.д.
$sql .= $sql . $whereAND;
P.S. Много if или же switch - выбирать Вам. Также стоит задуматься о безопасности SQL-запросов (не уверен, что у вас реальный проект, но безопасности место всегда найдётся).
Сначала опишите все параметры которые ожидают получить. Например, эти
$params = ['size', 'temperature', ];
Потом собираем то что реально пришло
$values = [];
foreach ($params as $param) {
if (array_key_exists($param, $_POST)) {
$values[] = $param . ' = ' . $_POST[$param];
}
}
Дополнительно, собранные значения можно "почистить"
$values = array_filter($values); // или с $callback где можно проверить значение
Далее собираем запрос
$sql = 'SELECT * FROM `planet` ' . implode(' and ' , $values);
ps. Как указано, не забывайте про инъекции и используйте подстановки!