как правильно сделать 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 | Норвегія | Угода
будет выбиратся или или или:
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. Мне кажется, что я не совсем понял твою задачу
Спустя 4 минуты, 40 секунд (19.02.2010 - 14:03) Evilsoul написал(а):
наверное ты правильно меня понял, вот только не задача в таком случаи мне нужно проIFить любой из вариантов (номера таблиц) 1, 1+2, 1+2+3, 1+3, 2+3, 2, и 3 выходит 7 ифов с разными запросами большой избыток кода мне такое не по душе, вредный я .
я вот думаю, может есть вариант в запросе SQL если значение NULL то вывести весь столбец.
я вот думаю, может есть вариант в запросе SQL если значение NULL то вывести весь столбец.
Спустя 7 минут, 14 секунд (19.02.2010 - 14:10) sergeiss написал(а):
Gabriel правильно сказал Точнее, идея правильная.
Итак, пусть мы имеем N полей в форме (f1, f2, f3, ....., fN).
Тогда:
И дальше используй полученное выражение В него будут включены только те поля, для которых указаны значения.
Учти, что я под многоточиями подразумеваю, что надо не просто поля указывать, а выражения, с ними связанные. Да еще надо проверить поля на наличие только пробелов в них. Думай, как это сделать
Для большого количества полей можно цикл организовать, для 3-х полей без цикла будет проще.
Итак, пусть мы имеем 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);
И дальше используй полученное выражение В него будут включены только те поля, для которых указаны значения.
Учти, что я под многоточиями подразумеваю, что надо не просто поля указывать, а выражения, с ними связанные. Да еще надо проверить поля на наличие только пробелов в них. Думай, как это сделать
Для большого количества полей можно цикл организовать, для 3-х полей без цикла будет проще.
Спустя 4 минуты, 33 секунды (19.02.2010 - 14:15) Evilsoul написал(а):
интересно, сейчас попробую, спасибо всем.
З.Ы. но еще не окончательно
З.Ы. но еще не окончательно
Спустя 13 минут, 35 секунд (19.02.2010 - 14:28) Gabriel написал(а):
sergeiss
ну идея правильная ет радуеть
ну идея правильная ет радуеть
Спустя 2 часа, 32 минуты, 53 секунды (19.02.2010 - 17:01) Evilsoul написал(а):
все вышло, всем большое спасибо за помощь, ещё одна проблема в кодировке была, пока дошёл до этого думал с ума сойду
Спустя 11 минут, 34 секунды (19.02.2010 - 17:13) sergeiss написал(а):
Evilsoul -ты выложи тут результат. Посмотрим все вместе, подумаем, может, еще что полезное подскажем
Спустя 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>';
}
собственно вот и все
нужно ещё вывод отредактировать и добавить сообщение если не найдено ни одного результата.
Спустя 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 написал(а):
Да и нормально, вобщем-то
Небольшое примечание - зачем несколько echo подряд? Можно всё это сделать в одном echo, одной строкой.
И вот это "or die(mysql_error())" хорошо для отладки. На реальном сайте надо делать какую-то специальную обработку. Иначе юзер будет видеть структуру данных.
Небольшое примечание - зачем несколько echo подряд? Можно всё это сделать в одном echo, одной строкой.
И вот это "or die(mysql_error())" хорошо для отладки. На реальном сайте надо делать какую-то специальную обработку. Иначе юзер будет видеть структуру данных.
Спустя 3 минуты, 48 секунд (22.02.2010 - 10:51) Evilsoul написал(а):
Да, можно одной строкой (мне так удобнее) а вообще я это все запишу в одну переменную и потом её выведу где нужно будет.
Да, как говорил Твин логировать ошибки нужно %).
Спасибо за помощь и за советы.
Да, как говорил Твин логировать ошибки нужно %).
Спасибо за помощь и за советы.
_____________
Кто хочет, ищет возможности, кто не хочет - причины. /_ К. Маркс
Истенно велик тот человек который сумел овладеть своим временем. /_Гесиод VIII-VII вв. до Р. Х.
Медлительный непрерывно борится с бедами всю жизнь. /_Гесиод VIII-VII вв. до Р. Х.
Для того что бы увидеть радугу нужно пережить дождь.
Женщины: Хочется чего-то красного но синего.