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



Спустя 6 минут, 16 секунд (28.01.2009 - 11:24) kirik написал(а):
Цитата (alex666 @ 28.01.2009 - 03:17)
Мне средствами скрипта надо проверять каждую переменную на пустоту и в зависимости от этого составлять отдельно WHERE?

Ага.. По-другому никак.
Могу предложить вариант по-проще -

PHP
$query[] = !empty($_GET['mark_id']) ? "`mark_id` = '{$_GET['mark_id']}'" null//проверяем на пустоту переменную
// тут миллион таких проверок

$query implode(' OR 'array_filter($query)); // убиваем пустые элементы массива, и соединяем их в строчку через OR

$result mysql_query("SELECT .. WHERE {$query}");


Если для каждого поля будут разные варианты (OR/AND) то все зависит от ваших нужд smile.gif

Спустя 5 минут, 28 секунд (28.01.2009 - 11:29) sergeiss написал(а):
Тут без ИФоф не обойтись. Но лучше так сделать: формируешь полный список параметров (без слова WHERE!!!), и только потом вставляешь его в условие. Сравни со своим вариантом:
PHP
$where="";
if(
$mark_id != "")
{  
   if( 
strlen($where) > $where .= ' and ';
   
$where .= "mark_id='$mark_id' ";
}
if(
$model_id != ""
{
   if( 
strlen($where) > $where .= ' and ';
   
$where " model_id='$model_id' ";
}
$query="select .... from .... where $where";

Добавку ' and ' к списку условий можно оформить как функцию, чтобы и удобнее было писать, и универсальнее.

PS. И опять kirik опредил unsure.gif ...

Спустя 9 минут, 29 секунд (28.01.2009 - 11:39) twin написал(а):
Есть еще проще вариант, передавйте данные массивом, а в запросе разбирайте его на ключ-значение.

Спустя 5 минут, 40 секунд (28.01.2009 - 11:44) alex666 написал(а):
А, всё, спасибо народ, вроде разобрался! ТЕМА ЗАКРЫТА! smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.