SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 28.01.2009 10:51:36

alexander666
Участник
Зарегистрирован: 28.01.2009
Сообщений: 7

Поиск по базе с переменными полями

Здравствуйте! Такая задача: разрабатываю автокаталог. Надо организовать расширенный поиск авто. Юзер выбирает Марку, Модель, Год выпуска, Двигатель и тд. Проблемы бы небыло, если бы не 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-ов получится. Дебилизм какой-то. Что-то мне подсказывает что я туплю. Помогите, плиз!

Неактивен

 

#2 28.01.2009 11:37:57

Magz
Гуру
Откуда: Москва
Зарегистрирован: 18.09.2007
Сообщений: 112

Re: Поиск по базе с переменными полями

Тяжелый случай. Вам нужно учить основы построения приложений для веба.
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");

А вообще, учите матчасть. Иначе такая дребедень получится.

Неактивен

 

#3 28.01.2009 11:43:37

alexander666
Участник
Зарегистрирован: 28.01.2009
Сообщений: 7

Re: Поиск по базе с переменными полями

Magzб, насчёт XSS, SQL-инъёкций я знаю, да и насчёт isset() и empty()... Я для простоты корявый код привёл. Однако, твоё решение меня порадовало, чуток переделаю и начну колдовать! Спасибо! :smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson