[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выборка из БД
Evilsoul
есть таблица в БД из 3 столбцов и есть форма в которой можно задать запрос по 3 столбцам из предоставленных в тегах (<select></select>) и которые строго соответствуют данным базы.

как правильно сделать SQL запрос если юзер выбирает 1, 2 и 3 столбцы?
можно сделать так :
WHERE `year`='$year' AND `country`='$country' AND `standard`='$standard'
но если юзер выберет 1й столбец и 3тий в таком случаи запрос не выполнется ибо `country`= NULL

помогите пожалуйста.



Спустя 7 минут, 46 секунд (19.02.2010 - 13:37) DedMorozzz написал(а):
ну поставь OR вместо AND если правильно тя понял...

Спустя 6 минут, 46 секунд (19.02.2010 - 13:43) Evilsoul написал(а):
при одинаковом запросе

будет выбиратся или или или:

2000 | Австрія | Угода
1997 | Австрія | Угода
1997 | Арменія | Угода
1997 | Бельгія | Угода
1993 | Германія | Угода
1995 | Великобританія | Угода
2006 | Боснія | Угода
1994 | Болгарія | Угода
1992 | Білорусія | Угода
1993 | Грузія | Угода
1996 | Греція | Угода
ну и тд. все не буду вылаживать а то большой список будет %)

а нада так:
2004 | Норвегія | Угода
2004 | Норвегія | Угода

Спустя 1 минута, 31 секунда (19.02.2010 - 13:45) Evilsoul написал(а):
грубо говоря сделать фильтр по 3м, 2м, и одному критериям.

Спустя 7 минут, 30 секунд (19.02.2010 - 13:52) Gabriel написал(а):
Evilsoul
$sql ="начало запроса";
if ( !empty( $year ) $sql .= " продолжение запроса если выбран год";

и тд и тп (если я правильно понял)

Спустя 5 минут, 58 секунд (19.02.2010 - 13:58) sergeiss написал(а):
Цитата (Evilsoul @ 19.02.2010 - 14:45)
грубо говоря сделать фильтр по 3м, 2м, и одному критериям.

А кто или что мешает? И как ты собираешься использовать эти критерии? Чтобы они были одновременно, или сначала по одному критерию, потом по-другому?

PS. Мне кажется, что я не совсем понял твою задачу smile.gif

Спустя 4 минуты, 40 секунд (19.02.2010 - 14:03) Evilsoul написал(а):
наверное ты правильно меня понял, вот только не задача в таком случаи мне нужно проIFить любой из вариантов (номера таблиц) 1, 1+2, 1+2+3, 1+3, 2+3, 2, и 3 выходит 7 ифов с разными запросами большой избыток кода мне такое не по душе, вредный я smile.gif.

я вот думаю, может есть вариант в запросе SQL если значение NULL то вывести весь столбец.

Спустя 7 минут, 14 секунд (19.02.2010 - 14:10) sergeiss написал(а):
Gabriel правильно сказал smile.gif Точнее, идея правильная.

Итак, пусть мы имеем N полей в форме (f1, f2, f3, ....., fN).
Тогда:
$where_array=array();
if( !empty( $_POST['f1'] ) ) $where_array[]=$_POST['f1'].....; // тут еще надо добавить защиту от SQL-инъекции - сам думай!
if( !empty( $_POST['f2'] ) ) $where_array[]=$_POST['f2'].....; // и тут защита нужна
....
if( !empty( $_POST['fN'] ) ) $where_array[]=$_POST['fN'].....; // и тут защита нужна тоже

$where=implode( ' AND ', $where_array);

И дальше используй полученное выражение smile.gif В него будут включены только те поля, для которых указаны значения.
Учти, что я под многоточиями подразумеваю, что надо не просто поля указывать, а выражения, с ними связанные. Да еще надо проверить поля на наличие только пробелов в них. Думай, как это сделать smile.gif

Для большого количества полей можно цикл организовать, для 3-х полей без цикла будет проще.

Спустя 4 минуты, 33 секунды (19.02.2010 - 14:15) Evilsoul написал(а):
интересно, сейчас попробую, спасибо всем.
З.Ы. но еще не окончательно smile.gif

Спустя 13 минут, 35 секунд (19.02.2010 - 14:28) Gabriel написал(а):
sergeiss
ну идея правильная ет радуеть smile.gif

Спустя 2 часа, 32 минуты, 53 секунды (19.02.2010 - 17:01) Evilsoul написал(а):
все вышло, всем большое спасибо за помощь, ещё одна проблема в кодировке была, пока дошёл до этого думал с ума сойду smile.gif

Спустя 11 минут, 34 секунды (19.02.2010 - 17:13) sergeiss написал(а):
Evilsoul -ты выложи тут результат. Посмотрим все вместе, подумаем, может, еще что полезное подскажем smile.gif

Спустя 2 дня, 17 часов, 9 минут, 15 секунд (22.02.2010 - 10:22) Evilsoul написал(а):
        $year       = !empty($_POST['year'])        ? htmlspecialchars($_POST['year'])      : NULL;
$country = !empty($_POST['country']) ? htmlspecialchars($_POST['country']) : NULL;
$standard = !empty($_POST['standard']) ? htmlspecialchars($_POST['standard']) : NULL;

if (isset($_POST['ok']))
{
$where_array=array();

if(!empty($year)) $where_array[]="`year` = '" . $year . "'";
if(!empty($country)) $where_array[]="`country` = '" . $country . "'";
if(!empty($standard)) $where_array[]="`standard` = '" . $standard . "'";

$where=implode( ' AND ', $where_array);

if(!empty($where))
{
$res = mysql_query("SELECT * FROM `standard_base` WHERE " . $where) or die(mysql_error());

if($num=mysql_num_rows($res))
{
echo '<h2>Найдено документов: <font color="red">' .$num. '</h2></font>';

while($row = mysql_fetch_assoc($res))
{
echo $row['id'] . ' | ';
echo $row['year'] . ' | ';
echo $row['country'] . ' | ';
echo $row['standard'] . ' | ';
echo $row['fname'] . '<br>';
}
}
}

else
echo '<p class="attention">Нужно выбрать хотя бы один критерий для поиска</p>';
}


собственно вот и все smile.gif
нужно ещё вывод отредактировать и добавить сообщение если не найдено ни одного результата.

Спустя 18 минут, 32 секунды (22.02.2010 - 10:41) Evilsoul написал(а):
$num = mysql_num_rows($res);

if($num > 0)
{
echo '<h2>Знайдено документів: <font color="red">' .$num. '</h2></font>';

while($row = mysql_fetch_assoc($res))
{
echo $row['id'] . ' | ';
echo $row['year'] . ' | ';
echo $row['country'] . ' | ';
echo $row['standard'] . ' | ';
echo $row['fname'] . '<br>';
}
}

else
echo 'Не найдено ни одного документа';


ну и вот добавил предупреждение если по запросу не найдено ни одного документа.

Спустя 6 минут, 15 секунд (22.02.2010 - 10:47) sergeiss написал(а):
Да и нормально, вобщем-то smile.gif

Небольшое примечание - зачем несколько echo подряд? Можно всё это сделать в одном echo, одной строкой.

И вот это "or die(mysql_error())" хорошо для отладки. На реальном сайте надо делать какую-то специальную обработку. Иначе юзер будет видеть структуру данных.

Спустя 3 минуты, 48 секунд (22.02.2010 - 10:51) Evilsoul написал(а):
Да, можно одной строкой (мне так удобнее) а вообще я это все запишу в одну переменную и потом её выведу где нужно будет.
Да, как говорил Твин логировать ошибки нужно %).

Спасибо за помощь и за советы.


_____________
Кто хочет, ищет возможности, кто не хочет - причины. /_ К. Маркс
Истенно велик тот человек который сумел овладеть своим временем. /_Гесиод VIII-VII вв. до Р. Х.
Медлительный непрерывно борится с бедами всю жизнь. /_Гесиод VIII-VII вв. до Р. Х.
Для того что бы увидеть радугу нужно пережить дождь.
Женщины: Хочется чего-то красного но синего.
Быстрый ответ:

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