[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Поиск на сайте
zsaz
надо сделать поиск на сайте, допустим по 2 критериям...
но если пользователь не заполняет одно поле, то поиск должен осуществляться по 1 критерию... через IF не вариант, т.к. полей может быть много......
т.е. надо сделать так, чтобы, если пользователь ничего не ввел в поле, то поиск как бы не учитывал этот критерий
SELECT * FROM vipusk WHERE fam='$fam' and name='$name'
при таком запросе обязательно надо вводить 2 переменные, чтобы он искал... а надо сделать, чтобы можно было при одной переменной осуществлять выборку....



Спустя 1 час, 38 минут, 48 секунд (30.09.2008 - 05:21) kirik написал(а):
Идея такая, вопрос в доработке

Код
$where[] = isset($fam) ? "`fam` = '$fam'" : null;
$where[] = isset($name) ? "`name` = '$name'" : null;

$where = array_values($where);

if(count($where) > 1)
    $where = implode(' and ', $where);
else
    $where = $where[0];

$query = mysql_query('SELECT * FROM `vipusk` WHERE '.$where);

Спустя 44 минуты, 10 секунд (30.09.2008 - 06:05) Vaska написал(а):
Может просто использовать библиотечку какую? Например почитайте тут http://dklab.ru/lib/DbSimple/
с ней ребенок разберется за 30 минут, там есть и решение вашего вопроса

Спустя 2 часа, 31 минута, 21 секунда (30.09.2008 - 08:37) sergeiss написал(а):
А я вообще не понял, в чем тут проблема?
Надо просто сначала создать переменную, в которую записываем условие. Пусть это будет $where, а поля ввода зовутся $f1, $f2, $f3.
1. Проверяем, какова длина $f1. Если она =0, то идем к следующей переменной.
2. Если длина $f1 не нулевая, то добавляем условие: $where .= " f1= '$f1' "
3. Далее идем к проверке следующей переменной. То есть, переходим к п.1, используя $f2.

Дополнительное условие: если на шаге 2 длина $where больше 0, то перед добавкой условия, связанного с переменной, надо добавить $where .= " and "

Короче говоря, я тут расписал весь алгоритм smile.gif Кто мешает реализовать его? При этом только лучше делать имена такие, чтобы их можно было в цикле использовать (через переменные переменные).

Спустя 5 часов, 3 минуты, 32 секунды (30.09.2008 - 13:40) zsaz написал(а):
Всем спасибо...
Сделал немного по своему, но ваши идеи понравились, что-то даже взял на заметку....

$query = "SELECT * FROM vipusk WHERE ";


if (!$mail=="")
$query = $query."mail='$mail' and ";

if (!$tel=="")
$query = $query."tel='$tel' and ";

if (!$icq=="")
$query = $query."icq='$icq' and ";

if (!$dop=="")
$query = $query."dop='$dop' and ";

if (!$facultet=="")
$query = $query."facultet='$facultet' ";

$result = mysql_query($query);
$myrow = mysql_fetch_array($result);


вот моя вырезка из кода... может конечно и не самый идеальный вариант...


Спустя 57 минут, 39 секунд (30.09.2008 - 14:38) sergeiss написал(а):
У тебя в коде есть "грабли". Серьезные.
В частности, если не будет выполнено условие if (!$facultet==""), то тогда у тебя от предыдущей строки в конце запроса останется "and ". А это приведет к ошибке.
То же относится и к невыполнению предыдущих условий. Ты можешь в конце запроса получить "and ".

Спустя 11 минут, 7 секунд (30.09.2008 - 14:49) zsaz написал(а):
Цитата(sergeiss @ 30.9.2008, 11:38) [snapback]49719[/snapback]
У тебя в коде есть "грабли". Серьезные.
В частности, если не будет выполнено условие if (!$facultet==""), то тогда у тебя от предыдущей строки в конце запроса останется "and ". А это приведет к ошибке.
То же относится и к невыполнению предыдущих условий. Ты можешь в конце запроса получить "and ".


я думал над этим вопросом, но теперь понял что плохо думал:)
тогда можно сделать так

if (!$facultet=="")
$query = $query."facultet='$facultet' ";
else
удалить последние 5 символов из переменной $query (пока не знаю как это на пхп пишется, может подскажите???)


а если ничего не выбрано, то в конце можно произвести сравнение
if ($query=="SELECT * FROM vipusk W")
echo "нет критерия для поиски";

Спустя 55 минут, 23 секунды (30.09.2008 - 15:44) sergeiss написал(а):
Можно проще сделать... Проще и нагляднее. Надо только работать не с целым запросом, а с его частью. Кстати, и проверки у тебя какие-то странные...

Вот смотри. Вводим переменную $where, для создания условия.

$where="";

далее начинаем проверки, с учетом того, что могут быть введены пустые строки (одни только пробелы):

if ( strlen( trim($mail) ) > 0 )
$where = $where."mail='$mail' ";

if ( strlen( trim($tel) ) > 0 )
{
if( strlen($where) > 0 ) $where = $where.' and ';

$where = $where."tel='$tel'";
}

if... // ну и далее все остальные проверки, сделанные аналогично

В конце, когда $where создано, используем его в создании запроса

$query = "SELECT * FROM vipusk WHERE $where";

Спустя 4 часа, 41 минута, 50 секунд (30.09.2008 - 20:26) kirik написал(а):
еще раз

Код
$fam = trim($fam);
$where[] = empty($fam) ? null : "`fam` = '$fam'";
$name = trim($name);
$where[] = empty($name) ? null : "`name` = '$name'";

$where = array_values($where);

if(count($where) > 1)
    $where = implode(' and ', $where);
else
    $where = $where[0];

$query = mysql_query('SELECT * FROM `vipusk` WHERE '.$where);

Спустя 31 минута, 14 секунд (30.09.2008 - 20:57) sergeiss написал(а):
kirik - интересная мысль smile.gif Я так не додумался. А должно же работать, наверное smile.gif

Вот только зачем $where = array_values($where); - я не понял. Вроде как, ты и так массив организуешь в начале?

Спустя 6 часов, 1 минута, 13 секунд (1.10.2008 - 02:59) kirik написал(а):
sergeiss, ага, массив.. а $where = array_values($where); нужно для того чтобы отсеять пустые значения массива..тоесть если например какое-то условие не совпало, и в элемент массива записался null, то после имплода этот null может сыграть злую шутку в запросе.. может получиться что-то типа этого - ..WHERE `fam` = 'fam' and and ...


_____________
Быстрый ответ:

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