Эта тема на forum.dklab.ru


Alex00: Поиск по базе данных
Есть каталог автомобилей (БД MySQL: наименования некоторых столбцов: kyzov, max_speed, time, power,
drive).
Поиск по данной БД осуществляется по пяти параметрам:
- Тип кузова,
- Максимальная скорость,
- Время разгона,
- Мощность,
- Тип привода.
Значения данных параметров выбираются при помощи формы (используется тэг <select>).
Вот фрагмент формы:
<select name="kyzov" size="1">
<option selected>Тип кузова</option>
<option>универсал</option>
<option>седан</option>
<option>джип</option>
</select>
В данной фратменте форме по умолчанию стоит значение "Тип кузова".
Вы имеете возможность выбирать произвоильные параметры, то есть, например, выбрали только значения
параметров "Тип кузова" и "Мощность".

ВОПРОС: как при написании SQL-запроса (например, "select*from katalog where kyzov='$kyzov' and
max_speed='$max_speed' and time='$time' and power='$power' and drive='$drive'")
предусмотреть ситуации, когда выбраны значения не всех пяти параметров, то есть значения параметров
"Тип кузова" и "Мощность" выбраны из заранее созданного списка (например, универсал, седан и т.д.),
а значения остальных параметров остаются равными тем, которые стоят по умолчанию (например, "Тип
кузова" и т.д.). Ведь при обработка SQL-запроса, если значение $kyzov будет равно "Тип кузова" (по
умолчанию), то в БД поля с таким значением найдено не будет.
А надо, чтобы переменные, равные значениям по умолчанию, игнорировались при обработке запроса, а
поиск велся по переменным, значения которых не равны значениям по умолчанию.
7.3.:
Для option value проставьте и все.
Dmitri R. S.:
Можно "склеить" запрос из кусков, например так:
<?
$query="select * from katalog where ";
$begin=0; //контрольная переменная - проверяет, надо ли писать "and" - по умолчанию нет
if($kuzov){ //если есть переменная - всё в норме
$query.="kuzov='$kuzov' ";
$begin=1; //теперь в следующих кусках надо "and"
}
if($max_speed){
if($begin==1) $query.="and "; //проверяем переменную
$query.="max_speed='$max_speed'";
$begin=1; //устанавливаем переменную
}
if($time){ //и т.д.
if($begin==1) $query.="and ";
$query.="time='$time'";
$begin=1;
}
...
?>
Дмитрий Котеров:
Тот же кусок, только лучше читаемый:

<?
$expr = array("1");
if (@$kuzov) $expr[] = "kuzov='$kuzov' ";
if (@$max_speed) $expr[] = "max_speed='$max_speed'";
if (@$time) $expr[] = "time='$time'";
// ...
$query="select * from katalog where ".join(" and ", $expr);
?>

Сергей Потехин:
Дмитрий Котеров:
Если использовать ваш код, то каким образом можно использовать оператор LIKE на пример в поле про кузов, или любое другое?
С Уважением Сергей!
Dmitri R. S.:
Сергей Потехин:
RTFM!
http://dev.mysql.com/doc/mysql/ru/
Сергей Потехин:
Dmitri R. S.:
Да знаю, как LIKE работает и как с ним работать! ;) Мне не понятно как его использовать в конкретном коде, приведенным Дмитрием Котеровым. Пожалуйста, читайте сообщения внимательней.
Если использовать Ваш код, то ...
С уважением Сергей!
Maus:
if (@$kuzov) $expr[] = "kuzov LIKE '%{$kuzov}%' ";
а вот нужны ли фигурные скобки? Если было бы $kuzov[$i] - на 90% уверен, что нужны...
Дмитрий Котеров:
Даже в этом случае, кажется, не нужны. Вернее, необязательны. Но лучше поставить, читается так лучше.

Эта тема на forum.dklab.ru