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

Wicked

Новичок
с помощью одного статического запроса:
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) {}
 

Wicked

Новичок
Fortop
тебе потроллить захотелось? или ты действительно не понимаешь, как это можно свернуть в цикл, если приспичило?
 

Fortop

Новичок
Wicked
Я хочу посмотреть на свернутый Ваш вариант.
Для меня он мягко говоря неудобоварим.

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

Wicked

Новичок
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);
 

musicant

Новичок
Автор оригинала: Вурдалак
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=''
Где ошибка?
 

dimagolov

Новичок
musicant, нужно читать ман по используемым ф-ям. и читать то, что тебе советуют.
 

musicant

Новичок
dimagolov
То, что посоветовал Wicked наверно правильно и современно, но не понятно.
Подскажите хотя бы где в мане искать инфу про "?" и ":" (в каком разделе?)
 

musicant

Новичок
Спасибо, это сильно сократило ( и упростило) код

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);
 

musicant

Новичок
Еще вопрос по теме...

Перед выводом на экран результатов поиска у меня есть (например) $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

TDD infected
Команда форума
ну а ты сам-то как думаешь?
самостоятельнее нужно быть, хоть чуток, ну ёмаё.
 

musicant

Новичок
zerkms
первый медленнее, второй отжирает кучу памяти.
А что лучше можно узнать наверно только из опыта (которого я и набираюсь)
 

Wicked

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

musicant

Новичок
Мда...вопрос действительно получился глупым.
Добавил еще несколько LEFT JOIN к основному запросу и все решилось само собой.
 
Сверху