Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте! Такая задача: разрабатываю автокаталог. Надо организовать расширенный поиск авто. Юзер выбирает Марку, Модель, Год выпуска, Двигатель и тд. Проблемы бы небыло, если бы не 1 НО, а именно:
не все поля обязательны для заполнения. Если он выберет все поля - то проблем нет - запрос будет типа SELECT ..... WHERE mark_id='$mark_id', model_id='$model_id', city_id='$city_id', price >='$price'.
Но вот что делать, если некоторые поля пустые? В моём случае пользователь ввёл только 1 поле - марку, и GET выглядет так:
http://site.ru/index.php?search=yes& … r_year_to=
Как видите< у всего кроме Марки, ID="". Это чтоже получается? Мне средствами скрипта надо проверять каждую переменную на пустоту и в зависимости от этого составлять отдельно WHERE? Куча IF ELSEIF получится, например:
if($mark_id != "") $where = "WHERE mark_id='$mark_id'";
if($model_id != "") $where = "WHERE model_id='$model_id'"
$query = "SELECT ...... FROM cars $where";
А если учесть сколько комбинаций из этих параметров (например - указана марка но неуказана цена или наоборот) - это штук 50 IF-ов получится. Дебилизм какой-то. Что-то мне подсказывает что я туплю. Помогите, плиз!
Неактивен
Тяжелый случай. Вам нужно учить основы построения приложений для веба.
1. Проверять переменные, которые пришли от пользователя надо по любому. Причем не только на пустоту. Иначе в переменной $mark_id я допишу UNION и выведу из вашей БД любые данные - логины/пароли пользователей и т.д.
2. Не надо писать if($mark_id != "") надо (if !empty($mark_id)), а до этого if (isset($mark_id))
3. Когда из многих переменных составляется условие для where, то лучше использовать массив:
$where = array(); if (isset($mark_id) && !empty($mark_id)) $where[] = sprintf("mark_id = '%s'", функция_обработки_данных_полученных_от_пользователя($mark_id)); if (isset($model_id) && !empty($model_id)) $where[] = sprintf("model_id = '%s'", функция_обработки_данных_полученных_от_пользователя($model_id)); $query = sprintf("SELECT * FROM Table WHERE %s", (count($where)?implode(' AND ', $where):"1");
А вообще, учите матчасть. Иначе такая дребедень получится.
Неактивен
Magzб, насчёт XSS, SQL-инъёкций я знаю, да и насчёт isset() и empty()... Я для простоты корявый код привёл. Однако, твоё решение меня порадовало, чуток переделаю и начну колдовать! Спасибо! :
Неактивен