помогите сделать грамотный запрос

с помощью одного статического запроса:
select ... where
(field1 = ? or ?)
and
(field2 = ? or ?)
and
...
далее плэйсхолдеры заполняются в следующем порядке: array($value1, is_null($value1), $value2, is_null($value2), ...)

-~{}~ 18.02.10 20:02:

собстно, пока объяснял другу, все целиком и написал (но не дебажил):

PHP:
$name        = isset($_POST['name'])        ? $_POST['name']        : null;
$description = isset($_POST['description']) ? $_POST['description'] : null;
$lalala      = isset($_POST['lalala'])      ? $_POST['lalala']      : null;

$dbh = new PDO('mysql:host=localhost', 'user', 'pass');
$stmt = $dbh->prepare("SELECT * FROM table_name where (name = ? or ?) and (description = ? or ?) and (lalala = ? or ?)");
$stmt->execute(array($name, is_null($name), $description, is_null($description), $lalala, is_null($lalala)));
foreach($stmt->fetchAll() as $row) {}
 
Fortop
тебе потроллить захотелось? или ты действительно не понимаешь, как это можно свернуть в цикл, если приспичило?
 
Wicked
Я хочу посмотреть на свернутый Ваш вариант.
Для меня он мягко говоря неудобоварим.

Но возможно я просто "непонимаю" вот этой глупости
array($name, is_null($name),
Вы ведь с этим работали и готовый код наверняка есть.
 
Fortop
нет, готового кода нету, потому что эту задачу мне не доводилось решать уже года 4.

не всякий код, который ты не понимаешь, есть глупость ) это особенность реализации, чтобы не использовать именованные параметры.

для многочисленных параметров (хран. в массиве $fields в виде array('field' => null, ...)) это будет выглядеть как-то так:
PHP:
$values = array_intersect_key($_POST, $fields) + $fields;
$stmt = $dbh->prepare("SELECT * FROM table_name where (name = :name or :name is null) and (description = :description or :description is null) and ..."); // можно склеивать в цикле, причем без всяких if'ов и без данных - запрос всегда один и тот же
$stmt->execute($values);
 
Автор оригинала: Вурдалак
PHP:
$where_clause = empty($conditionList) ? '' : 'WHERE ' . implode(' AND ', $conditionList);
PHP:
$conditionList=array();
if(isset($_GET['hotel'])!=""){
	$hotel=$_GET['hotel'];
	$conditionList[]="Hotel_id='$hotel'";
} 
if(isset($_GET['nights'])!=""){
        $nights=$_GET['nights'];
	$conditionList[]="nights='$nights'";
}
$where= empty($conditionList) ? '' : 'WHERE ' . implode(' AND ', $conditionList);
print $where;

В ответ получаю WHERE Hotel_id='' AND nights=''
Где ошибка?
 
musicant, нужно читать ман по используемым ф-ям. и читать то, что тебе советуют.
 
dimagolov
То, что посоветовал Wicked наверно правильно и современно, но не понятно.
Подскажите хотя бы где в мане искать инфу про "?" и ":" (в каком разделе?)
 
Спасибо, это сильно сократило ( и упростило) код

PHP:
$conditionList=array();
$nights="nights='".$_GET['nights']."'";
$conditionList[]=empty($_GET['nights']) ? null : $nights;

$roomcat="roomCategory_id='".$_GET['roomcat']."'";
$conditionList[]= empty($_GET['roomcat']) ? null : $roomcat;

$conditionList=array_filter($conditionList);
$where= empty($conditionList) ? '' : 'WHERE ' . implode(' AND ', $conditionList);
 
Еще вопрос по теме...

Перед выводом на экран результатов поиска у меня есть (например) $Hotel_id, $Board_id, $Tour_id - а мне нужны $Hotel_name, $Board_name и т.д. которые лежат в других таблицах базы.
Как я понял есть два способа:

1.
PHP:
SELECT name FROM Hotel WHERE id='$Hotel_id'
    SELECT name FROM Tour WHERE id='$Tour_id'
и т.д.
2. заранее сбросить в массивы полные списки отелей(а их очень много), туров и всего остального и искать по массивам.

Какой способ предпочтительней? Или может есть еще способы?
 
ну а ты сам-то как думаешь?
самостоятельнее нужно быть, хоть чуток, ну ёмаё.
 
zerkms
первый медленнее, второй отжирает кучу памяти.
А что лучше можно узнать наверно только из опыта (которого я и набираюсь)
 
Перед выводом на экран результатов поиска у меня есть (например) $Hotel_id, $Board_id, $Tour_id - а мне нужны $Hotel_name, $Board_name и т.д. которые лежат в других таблицах базы.
откуда берутся эти *_id? сколько всего требуется узнать имён отелей, туров, и т.д. для вывода результатов поиска?
 
Мда...вопрос действительно получился глупым.
Добавил еще несколько LEFT JOIN к основному запросу и все решилось само собой.
 
Сверху