Универсальный запрос.

TRV23RUS

Новичок
Универсальный запрос.

Хочу спросить, кто как думает, как лучше сделать запрос через php к базе если на скрипт приходит несколько переменных и те из которых пустые не должны учавствовать в запросе.
Т.е допустим имеется:
rooms = '3'
etazh = ''
type = 'Брежневка'

Надо что бы то поле где пусто вытягивало из базы всё что подходит по остальному запросу, а на свое значение не обращало внимание. Но смысл в том что при разном запросе это поле может быть разным.

Я вот подумал - может там где пусто присваивать '%'.
Соответственно получится select * from table where pole1='.$rooms.' and pole2='.$etazh.' and pole3='.$type.'
Соответственно там где пусто будет подсталвться '%'.
Как вы считаете это верный способ или есть что более подходящее?
 

lucas

Guest
Формируй нужный ("неуниверсальный") запрос в скрипте.
Не нужно извращаться в неподходящих для того местах.

Если хочется получить краткий код, почитай про тернарный оператор.
 

TRV23RUS

Новичок
А разве в скрипте будет короче?
Если много переменных - то получится по моем гораздо длиньше. Разве нет? А чем предложенный способ плох?
И было бы классно узнать где про этот оператор тернарный почитать..
 

TRV23RUS

Новичок
lucas
Сейчас пойду читать.. а чем идеологически неверен такой подход и что значит неопределенное поведение БД? Там вроде как всё определённо должно быть.
 

lucas

Guest
чем идеологически неверен такой подход
Хочешь выбрать по типу и этажности -- зачем упоминть в запросе кол-во комнат?

что значит неопределенное поведение БД
Есть вероятность, что, например, такой хитро***ый запрос не позволит использовать индексы и появятся тормоза.
 

TRV23RUS

Новичок
Lucas, а как этот оператор по англиийски будет? Я чо то не найду чего то похожего в мануале.
Чо то не думал я, что с этим такой напряг выйдет.
 

TRV23RUS

Новичок
О.. спасибо.. будем изучать...

-~{}~ 22.07.05 19:44:

Что то там про это выражение так мало написано, что я всё равно мало что понял. Кто нибудь объяснит как оно работает?

-~{}~ 22.07.05 22:37:

Блин... ничего неполучается..
Попробовал генерировать, показалось что можно там более менее коротко... Но похоже что только показалось..
Подскажите что нибудь?
Думаю использую я вот тот способ с '%'...
Сроки поджимают, надо доделывать..

-~{}~ 22.07.05 23:43:

Скажите - что должен отдать вот такой запрос?
select * from flat where id='%' AND operation='%' AND rooms='%' AND type='%' AND etazh='%' AND pl='%' AND price='%' AND hot='%'

Пробовал то же самое но без одинарных кавычек, один фих..
 

SelenIT

IT-лунатик :)
Такой запрос должен вернуть записи, где все перечисленные поля содержат строку '%'. Подозреваю, что таких строк не будет)

А вот вариант динамической генерации запроса:
PHP:
// массив допустимых имен полей
$fields = array ('id', 'operation', 'rooms', 'type', 'etazh', 'pl', 'price', 'hot');
// изначально строка запроса пуста
$query = '';
foreach ($fields as $f) {
   // если одноименная переменная передана в запросе и не пуста (не '', не ' ' и не 0)
   if (!empty($_GET[$f])) {
      // чистим данные от ненужных слешей, если это необходимо
      if (get_magic_quotes_gpc()) $_GET[$f] = stripslashes($_GET[$f]);
      // а вот и пример тернарного оператора
      // если запрос не пуст - продолжаем его, если нет - начинаем 
      $query .= ($query ? " AND " : "SELECT * FROM flat WHERE ");
      // подставляем в запрос сами данные, заодно экранируя их
      $query .= $f." = '".mysql_real_escape_string($_GET[$f])."'";
   }
}
// вывод запроса для контроля и отладки
echo $query;
На оптимальность не претендует, но работать должно.
 

TRV23RUS

Новичок
Фанат
Тот код, что дал SelenIT у меня не работает.
Фанат объясни как это можно сделать.
Я знаю - ты хорошо в этом разбираешься. Есть же какой то наиболее подходящий способ для решения такой задачи. Я делаю фильтр выборки. И разные переменные могут быть пустыми а могут и нет. Надо сгенерировать правиьный завпрос к базе. Поможешь?
 

Фанат

oncle terrible
Команда форума
я давал код много раз на это м форуме.
Но не для того, тобы его скопировали и запустили.
и потом разводили руками - "не работает"
а для того, чтобы посмотреть и понять, как оно работает.

вот тебе код.
ты его опять запустишь и скажешь - не работает.

PHP:
if ($_GET['operation']=='or') $operation = " or "; else $operation = " and ";
$w=array();
if (!empty($_GET['rooms'])) $w[]="rooms='".adds($_GET['rooms'])."'";
if (!empty($_GET['space'])) $w[]="space='".adds($_GET['space'])."'";
if (!empty($_GET['price'])) $w[]="rooms='".adds($_GET['price'])."'";

if (count($w)) $where="WHERE ".implode($w,$operation); else $where='';
$query="select * from table $where";
хмм. судя по названиям переменных, ты - либо тот самый бедолага, либо у всех торговцев недвижимостью одни и те же проблемы.
в смысле кадров
 

TRV23RUS

Новичок
Фанат
Ща попробую разобраться...
Без под..ок ты не можешь - это я знаю..
Но вот первый раз фильтр я пишу представь себе - не было раньше такой нужды :)
Так что если прорвемся - то не будет у торговцев недвижимостью больше проблем.. По крайней мере со мной :)

-~{}~ 24.07.05 18:46:

Фанат
Если выборка проходит исключительно через "и" без "или", то первую строчку можно сделать $operation=" and ".. судя по всему..
Это понятно.. И вообще впринципе всё понятно. Вот только adds - это имеется ввиду addslashes?

-~{}~ 24.07.05 18:49:

ВСЁ!!! Спасибо! Фанат тебе отдельное спасибо, хоть ты и "вредный", но зато очень умный :))
Всем спасибо - разобрался.. теперь буду использовать. Всё таки хорошо что есть такой форум - где старшие товарищи всегда не оставят в беде и помогут ;)
 
Сверху