[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Поиск по базе
SunSet
Делаю свой примитивный поисковик по базе. Сам запрос будет формироваться от трех выпадающих менюшек + текстовое поле. То есть чтоб можно было выбрать, например, страну - город - район и при это дополнительно искать еще по заданному слову "метро, например".
Что лучше использовать для запроса? То юзает народ и LIKE %%, и AGAINST MATCH. В чем их преимущества и недостатки? (можно ссылку на инфу, если есть)



Спустя 11 минут, 7 секунд (27.08.2009 - 15:20) Gabriel написал(а):
почитай авось пригодиться push me

Спустя 10 часов, 24 минуты, 15 секунд (28.08.2009 - 01:45) SunSet написал(а):
Подскажите, допустимо ли использование if else в таком виде:

PHP
if (...) {...;}
if (...) {...;}
if (...) {...;}
if (...) {...;}
else {...}


Просто последний блок else не срабатывает когда должен, а if'ы все работают.

Спустя 18 минут, 15 секунд (28.08.2009 - 02:03) DeeKeiD написал(а):
юзай
PHP
if { }
elseif {}
elseif {}
else {}

Спустя 7 минут, 41 секунда (28.08.2009 - 02:11) SunSet написал(а):
DeeKeiD
Всеравно не работает sad.gif То есть работают все, кроме else.
У для поиска пять вариантов через elseif перебрано, например, если в выпадающей менюшке выбрано 1, а в остальных ничего - значит искать по SELECT * FROM nnn WHERE perem = $perem. Так вот работают все, кроме последнего, по умолчанию который должен выводить все из базы

Спустя 46 минут, 35 секунд (28.08.2009 - 02:57) DeeKeiD написал(а):
покажи код

Спустя 36 минут, 39 секунд (28.08.2009 - 03:34) SunSet написал(а):
DeeKeiD



Свернутый текст
PHP
if (isset($_POST['submit_s'])) {$submit_s = $_POST['submit_s'];}

if (isset($_POST['country_id'])) {$country_id = $_POST['country_id'];}

if (isset($_POST['region_id'])) {$region_id = $_POST['region_id'];}

if (isset($_POST['city_id'])) {$city_id = $_POST['city_id'];}

if (isset($_POST['search'])){$search = $_POST['search'];}




if (!isset($submit_s) OR empty($submit_s)) {$submit_s =0;}

if (!isset($country_id) OR empty($country_id)) {$country_id =0;}

if (!isset($region_id) OR empty($region_id)) {$region_id =0;}

if (!isset($city_id) OR empty($city_id)) {$city_id =0;}

if (!isset($search) OR empty($search)) {$search =0;}

echo "$submit_s<br>";
echo "$country_id<br>";
echo "$region_id<br>";
echo "$city_id<br>";
echo "$search<br>"; 



if 
($country_id > 0 AND $region_id == 0 AND $city_id == 0 AND $search == 0)
    {
    $xfirst = mysql_query ("SELECT * FROM hotels WHERE country_id = '$country_id'");
    $first = mysql_fetch_array($xfirst); 
    do 
{
    printf ("%s, %s<br><br><br>",$first["title"],$first["text"],$r);
    }
    while ($first = mysql_fetch_array($xfirst));
    }



    elseif ($country_id > 0 AND $region_id > 0 AND $city_id == 0 AND $search == 0)
    {
    $xsecond = mysql_query ("SELECT * FROM hotels WHERE country_id = '$country_id' AND region_id = '$region_id'");
    $second = mysql_fetch_array($xsecond); 
    do 
{
    printf ("%s, %s<br><br><br>",$second["title"],$second["text"],$r);
    }
    while ($second = mysql_fetch_array($xsecond));
    }



    elseif ($country_id > 0 AND $region_id >0 AND $city_id > 0 AND $search == 0)
    {
    $xthird = mysql_query ("SELECT * FROM hotels WHERE country_id = '$country_id' AND region_id = '$region_id' AND city_id = '$city_id'");
    $third = mysql_fetch_array($xthird); 
    do 
{
    printf ("%s, %s<br><br><br>",$third["title"],$third["text"],$r);
    }
    while ($third = mysql_fetch_array($xthird));
    }




    elseif ($country_id > 0 AND $region_id > 0 AND $city_id > 0 AND $search > 0)
    {
    $xfourth = mysql_query ("SELECT * FROM hotels WHERE country_id = '$country_id' AND region_id = '$region_id' AND city_id = '$city_id AND MATCH(text) AGAINST('$search')");
    $fourth = mysql_fetch_array($xfourth); 
    do 
{
    printf ("%s, %s<br><br><br>",$fourth["title"],$fourth["text"],$r);
    }
    while ($fourth = mysql_fetch_array($xfourth));
    }




    elseif ($country_id == 0 AND $region_id == 0 AND $city_id == 0 AND strlen($search) > 0)
    {
    $xfifth = mysql_query ("SELECT * FROM hotels WHERE text LIKE '%$search%'");
    $fifth = mysql_fetch_array($xfifth); 
    do 
{
    printf ("%s, %s<br><br><br>",$fifth["title"],$fifth["text"],$r);
    }
    while ($fifth = mysql_fetch_array($xfifth));
    }



    else {
    $xelse = mysql_query ("SELECT * FROM hotels");
    $else = mysql_fetch_array($xelse); 
    do 
{
    printf ("%s, %s<br><br><br>",$else["title"],$else["text"],$r);
    }
    while ($else = mysql_fetch_array($xelse));
    }

Написано все примитивно, знаю, но мне лишь бы работало. Потом уже буду от этого отталкиваться и переделывать покрасивее.
С файла index.php передаются 5 переменных, они выше видны, но поиск только по четырем производится. У меня поиск в виде выпадающих селектов и поля для ввода текста. МОжно искать либо только по $country_id, либо по $country_id + $region_id, по $country_id + $region_id + $city_id, только по полю $search или же по всем сразу. А если ничего не задано то вывести тупо все из базы. Вот последний пункт, как ни странно, не работает. Перепробовал много всего unsure.gif

Спустя 1 час, 23 минуты, 8 секунд (28.08.2009 - 04:57) DeeKeiD написал(а):
хм попробуй
PHP
else {
    
$xelse mysql_query ("SELECT * FROM hotels");
    
$else mysql_fetch_array($xelse); 
    do {
    
printf ("%s, %s<br><br><br>",$else["title"],$else["text"],$r);
    }
    while (
$else mysql_fetch_array($xelse));
    }

заменить
PHP
elseif {
    
$xelse mysql_query ("SELECT * FROM hotels");
    
$else mysql_fetch_array($xelse); 
    do {
    
printf ("%s, %s<br><br><br>",$else["title"],$else["text"],$r);
    }
    while (
$else mysql_fetch_array($xelse));
    }

и в конец
PHP
else { echo 'выберите критерии поиска'; }

Спустя 3 часа, 39 минут, 58 секунд (28.08.2009 - 08:37) SunSet написал(а):
DeeKeiD

Parse error: syntax error, unexpected '{', expecting '(' in Z:\home\q\www\blocks\search\ob.php on line 97

Указывает на эту строчку "elseif {", что в предпоследнем блоке находится. Там же арументы какието в скобках указать нужно, как понимаю, вследствии чего пхп будет выбирать SELECT * FROM hotels.

Спустя 3 часа, 6 минут, 27 секунд (28.08.2009 - 11:43) SunSet написал(а):
Мдя.. никто не подскажет user posted image

Спустя 3 часа, 28 минут, 56 секунд (28.08.2009 - 15:12) Nikitian написал(а):
elseif подразумевает условие и делается в виде
PHP
....
elseif(
условие){действие}

вам тут надо использовать простой else:
PHP
if(тра-та-та)
{
тру-ту-ту
}
elseif(
тра-та-та)
{
тру-ту-ту
}
elseif(
тра-та-та)
{
тру-ту-ту
}
else(
тра-та-та)
{
тру-ту-ту
}

Спустя 2 часа, 17 минут, 48 секунд (28.08.2009 - 17:30) SunSet написал(а):
Nikitian
Кое что доделал, стало чуть лучше, но вопрос теперь в другом. Почему условие

PHP
elseif ($country_id AND $region_id AND $city_id AND strlen($search) > 0)
    {
    
$xfourth mysql_query ("SELECT * FROM hotels WHERE MATCH (text) AGAINST ('$search') AND country_id = '$country_id' AND region_id = '$region_id' AND city_id = '$city_id");

не хочет работать? То есть поиск производится по трем первым переменным $country_id, $region_id и $city_id в независимости что там в четвертой (тестовое поле). Вот если выбрать страна - регион - город и затем вписать в тестовое поле чтото несуществющее в базе, то выводит выбранный город, а не какуюто ошибку.

Спустя 2 часа, 40 минут, 57 секунд (28.08.2009 - 20:11) SunSet написал(а):
Чтото не фартит мне.. вторую неделю уже перед трудовыми выходными нерешаемое для себя нахожу blink.gif

Спустя 22 минуты, 12 секунд (28.08.2009 - 20:33) Гость_hara написал(а):
Не бывает так что бы else вдруг перестал работать

вообще не смущает что один и тот же код повторяется 10 раз ?

почему не построить запрос а потом его выполнить отдельно?

начальный запрос "SELECT * FROM hotels"
затем if($region_id > 0) {добавляем к запросу это условие}

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


Спустя 9 минут, 3 секунды (28.08.2009 - 20:42) SunSet написал(а):
Гость_hara
else работает уже, некотрые elseif не хотят. А про построение запроса - понимаю и соглашусь что моя железобетонная конструкция дурацкая, но мне сейчас не до "простоты чтения" и проверок когда даже мой примитив не работает так как надо blink.gif
А про проблему повторюсь - при выборе Страны N, региона S, города K, и вводе в текстовое поле несуществующего слова то выводит инфу с ячеек N, S, K но на введенное слово не реагирует, что вписал его что нет, ищет только по селектам.

Спустя 55 минут, 21 секунда (28.08.2009 - 21:38) Nikitian написал(а):
Профилируйте код, ищите где переменные пропадают

Спустя 12 минут, 56 секунд (28.08.2009 - 21:51) SunSet написал(а):
Nikitian
Вместо Post поставил Get чтоб видеть что в строке оказывается. Все вроде правильно, только скрипт чудным образом всеравно находит что не нужно)

/search/ob.php?country_id=1&region_id=1&city_id=1&search=any&submit_s=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA
По этим параметрам в таблице нету слова "any". Почему он находит и выводит всю строку? В таблице вообще нету английских слов blink.gif

Спустя 4 минуты, 14 секунд (28.08.2009 - 21:55) Nikitian написал(а):
Смотрите какой запрос идёт в мускуль. Что-то мне подсказывает, что как увидите запрос - всё станет ясно

Спустя 24 минуты, 40 секунд (28.08.2009 - 22:19) SunSet написал(а):
Nikitian

Цитата
Что-то мне подсказывает, что как увидите запрос - всё станет ясно


Сяду еще раз просмотрю, только мне чтото подсказывает что прийдется от текстового поля отказаться.. unsure.gif

Спустя 6 минут, 32 секунды (28.08.2009 - 22:26) Nikitian написал(а):
Кстати, если что - полнотекстовый поиск в innoDB не работает - у вас случайно не этот тип таблиц?

Спустя 8 минут, 25 секунд (28.08.2009 - 22:34) SunSet написал(а):
Nikitian
Поскольку я не знаю что такое innoDB значит у меня не этот тип таблиц smile.gif Я и через MATCH AGAINST пробовал, результат работы скрипта тот же.

Спустя 14 минут, 21 секунда (28.08.2009 - 22:49) Nikitian написал(а):
Покажите запросы и что находят по ним - так будет правильнее искать ошибку

Спустя 19 минут, 22 секунды (28.08.2009 - 23:08) SunSet написал(а):
Nikitian

/search/ob.php?country_id=1&region_id=1&city_id=1&search=any&submit_s=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA

Удалил со скрипта все "ненужное". Оставил только один if блок поиска именно по трем переменным + текстовое поле (ну и else, чтоб выводило все если ничего не выбрано), а именно:

Свернутый текст
PHP
if ($country_id AND $region_id AND $city_id AND strlen($search) > 0)
    {
    
$xfourth mysql_query ("SELECT * FROM hotels WHERE text LIKE '%$search%' AND country_id = '$country_id' AND region_id = '$region_id' AND city_id = '$city_id'");
    
$fourth mysql_fetch_array($xfourth); 
    do {
    
printf ("%s, %s<br><br><br>",$fourth["title"],$fourth["text"],$r);
    }
    while (
$fourth mysql_fetch_array($xfourth));
    }


Свернутый текст
PHP
else {
    
$xelse mysql_query ("SELECT * FROM hotels");
    
$else mysql_fetch_array($xelse); 
    do {
    
printf ("%s, %s<br><br><br>",$else["title"],$else["text"],$r);
    }
    while (
$else mysql_fetch_array($xelse));
    }


Работает, если ввести несуществующее слово, ничего не выводит по запросу. А как сделать чтоб выводило из else, чтоб если неверные параметры поиска или ничего не найдено то вывести все что есть из базы? SELECT * FROM hotels
Просто ж ничего не выводит, поскольку даже несуществуещее слово удовлетворяет запрос ($search > 0) то и блок else не задействуется.

Спустя 6 минут, 22 секунды (28.08.2009 - 23:14) SunSet написал(а):
Чтото подсказывает, что в подсчете колличества строк кроется ответ.. num_rows > 0 (от найденого) то выводить тото. Правда не соображу куда это прихимичить blink.gif

Спустя 1 минута, 38 секунд (28.08.2009 - 23:16) glock18 написал(а):
SQL
`text`

Спустя 6 минут, 23 секунды (28.08.2009 - 23:22) Nikitian написал(а):
PHP
do {
    
printf ("%s, %s<br><br><br>",$else["title"],$else["text"],$r);
    }
    while (
$else mysql_fetch_array($xelse));

В корне неверная запись! Уже не первый раз такое вижу: откуда? В данном коде вы сперва выводите переменную, а уже потом ей присваиваете значение выбранной строки. Таким образом у вас сперва выводится пустая строка. Используйте конструкцию:
PHP
while($else mysql_fetch_array($xelse))
{
printf ("%s, %s<br><br><br>",$else["title"],$else["text"],$r);
}

Далее: очень надеюсь, что переменные ($country_id, $region_id, $city_id, $search) - это уже обработанные данные из формы, где всё, что надо экранировано и преобразовано. покажите сформированную строку
PHP
echo "SELECT * FROM hotels WHERE text LIKE '%$search%' AND country_id = '$country_id' AND region_id = '$region_id' AND city_id = '$city_id'"

Так же покажите что выдаёт ваша база при запросе
SQL
show create table hotels

Спустя 10 минут, 23 секунды (28.08.2009 - 23:33) SunSet написал(а):
glock18
Синтаксис - это, конечно, хорошо, но тут не то нужно sad.gif


Свернутый текст
user posted image


Такая картинка, если не находит введенное слово. Как бы все правильно, наличие запятой указывает на то что нужный if сработал, только ему нечего вытянуть из базы. Как вот сделать чтоб если ничего не найдено то выводило все blink.gif


Nikitian
Пустая строка хотя б говорит о том что конкретный блок выполнился, но ничего не вытянул. переделаю пото обязательно.

Переменные не обработаны. $country_id, $region_id, $city_id - напрямую из базы (строка INT). Поэтому в число, наверно, нету смысла преобразовывать еще раз. А как по-другому все проверить без понятия. Только вот такая проверка у всех этих переменных

PHP
if (isset($_GET['search'])) {$search $_GET['search'];}
else {
$search 0;}


Повторюсь, что уже как и надо - при вводе несуществующего слова ничего не вытягивается из таблицы, теперь прошу обьяснить как сделать чтоб вместо пустоты чтото выводилось если ничего не найдено?


Цитата
show create table hotels
про это немного не понял.. blink.gif

Спустя 5 минут, 3 секунды (28.08.2009 - 23:38) SunSet написал(а):
Вот файл-обработчик целиком. Выкладывать страничку, с которой прилетают из формы значения, наверно, нету смысла, так как тут пустые валуи заменяются на ноль в любом случаее.
Свернутый текст
PHP
<?php 
include ("connect.php"); 

if (isset(
$_GET['submit_s'])) {$submit_s $_GET['submit_s'];}
else {
$submit_s 0;}

if (isset(
$_GET['country_id'])) {$country_id $_GET['country_id'];}
else {
$country_id 0;}

if (isset(
$_GET['region_id'])) {$region_id $_GET['region_id'];}
else {
$region_id 0;}

if (isset(
$_GET['city_id'])) {$city_id $_GET['city_id'];}
else {
$city_id 0;}

if (isset(
$_GET['search'])) {$search $_GET['search'];}
else {
$search 0;}




echo 
"$submit_s<br>";
echo 
"$country_id<br>";
echo 
"$region_id<br>";
echo 
"$city_id<br>";
echo 
"$search<br>"






    if (
$country_id AND $region_id AND $city_id AND strlen($search) > 0)
    {
    
$xfourth mysql_query ("SELECT * FROM hotels WHERE `text` LIKE '%$search%' AND country_id = '$country_id' AND region_id = '$region_id' AND city_id = '$city_id'");
    
$fourth mysql_fetch_array($xfourth); 
    do {
    
printf ("%s, %s<br><br><br>",$fourth["title"],$fourth["text"],$r);
    }
    while (
$fourth mysql_fetch_array($xfourth));
    }



    else {
    
$xelse mysql_query ("SELECT * FROM hotels");
    
$else mysql_fetch_array($xelse); 
    do {
    
printf ("%s, %s<br><br><br>",$else["title"],$else["text"],$r);
    }
    while (
$else mysql_fetch_array($xelse));
    }


Спустя 8 минут, 43 секунды (28.08.2009 - 23:47) Gabriel написал(а):
Цитата
Поскольку я не знаю что такое innoDB значит у меня не этот тип таблиц  Я и через MATCH AGAINST пробовал, результат работы скрипта тот же.

иннодб ето тип таблицы по ней хоть 3жды лопни полнотекстовый поиск непостроиш ибо фултекстиндех в ней не ставиться, а ставиться он в MYisam на поля текст и варчар.

Спустя 5 минут, 13 секунд (28.08.2009 - 23:52) SunSet написал(а):
Gabriel
То что с Денвером ставится на пару, не innoDB же? Но меня это меньше всего сейчас волнует. По одному слову ищет ведь.

Спустя 10 минут, 46 секунд (29.08.2009 - 00:03) Nikitian написал(а):
Ошибки, предупреждения, напоминания отключены?

сделайте после запроса if(!$xfourth)echo mysql_error();

И всё-таки дождёмся вывода сформированного sql-запроса? Очень хочется посмотреть что у вас там собирается для мускуля

Спустя 11 минут, 45 секунд (29.08.2009 - 00:14) SunSet написал(а):
Цитата
И всё-таки дождёмся вывода сформированного sql-запроса? Очень хочется посмотреть что у вас там собирается для мускуля


Я чуть не понимаю что от меня требуется, потому и не знаю что ответить) blink.gif

На это if(!$xfourth)echo mysql_error(); никак не реагирует. Ни ошибки, ничего.

Цитата
Ошибки, предупреждения, напоминания отключены?

Вообще, сообщения об ошибках выводятся если такие есть. Никаких настроек не менял, поэтому все по дефолту при установке Денвера.

Спустя 2 минуты, 45 секунд (29.08.2009 - 00:17) Nikitian написал(а):
PHP
echo "SELECT * FROM hotels WHERE text LIKE '%$search%' AND country_id = '$country_id' AND region_id = '$region_id' AND city_id = '$city_id'";

Спустя 4 минуты, 22 секунды (29.08.2009 - 00:21) SunSet написал(а):
Nikitian
SQL
SELECT * FROM hotels WHERE text LIKE '%sss%' AND country_id = '1' AND region_id = '1' AND city_id = '1'

Спустя 56 минут, 37 секунд (29.08.2009 - 01:18) Nikitian написал(а):
Запрос нормальный и должен возвращать то, что нужно. Что возвращает и что по-вашему он должен возвращать?
Покажите примеры данных в базе, удовлетворяющие этому запросу.

Спустя 2 часа, 4 минуты, 44 секунды (29.08.2009 - 03:23) SunSet написал(а):
Nikitian
Хотел бы чтобы в ситуации, когда по запросу ничего не может вытянуть с таблицы производился запрос вида SELECT * FROM hotels и выводилась полностью вся таблица вместо пустого места как сейчас. Как такого добиться?

Спустя 6 часов, 50 минут, 26 секунд (29.08.2009 - 10:13) Nikitian написал(а):
Копирую ваш код с небольшими изменениями логики:
PHP
<?php 
include ("connect.php"); 

if (isset(
$_GET['submit_s'])) {$submit_s $_GET['submit_s'];}
else {
$submit_s 0;}

if (isset(
$_GET['country_id'])) {$country_id $_GET['country_id'];}
else {
$country_id 0;}

if (isset(
$_GET['region_id'])) {$region_id $_GET['region_id'];}
else {
$region_id 0;}

if (isset(
$_GET['city_id'])) {$city_id $_GET['city_id'];}
else {
$city_id 0;}

if (isset(
$_GET['search'])) {$search $_GET['search'];}
else {
$search 0;}




echo 
"$submit_s<br>";
echo 
"$country_id<br>";
echo 
"$region_id<br>";
echo 
"$city_id<br>";
echo 
"$search<br>"






    if (
$country_id AND $region_id AND $city_id AND strlen($search) > 0)
    {
    
$xfourth mysql_query ("SELECT * FROM hotels WHERE `text` LIKE '%$search%' AND country_id = '$country_id' AND region_id = '$region_id' AND city_id = '$city_id'");
    
$fourth mysql_fetch_array($xfourth); 
    do {
    
printf ("%s, %s<br><br><br>",$fourth["title"],$fourth["text"],$r);
    }
    while (
$fourth mysql_fetch_array($xfourth));
    }



    if(!
$xfourth || mysql_num_rows($xfourth)==0) {
    
$xelse mysql_query ("SELECT * FROM hotels");
    
$else mysql_fetch_array($xelse); 
    do {
    
printf ("%s, %s<br><br><br>",$else["title"],$else["text"],$r);
    }
    while (
$else mysql_fetch_array($xelse));
    }

Спустя 6 часов, 3 минуты, 9 секунд (29.08.2009 - 16:16) SunSet написал(а):
Nikitian
Большое спасибо, сейчас работает как нужно. Может, чуть позже про пару мелочей спрошу user posted image

Спустя 1 час, 16 минут, 23 секунды (29.08.2009 - 17:33) SunSet написал(а):
Nikitian
Другая проблема вот.. сейчас, при работе верхнего кода все нормально. Но мне нужно через if определить еще и другие варианты работы скрипта, например, когда $country_id = 1, а остальные по 0. То есть когда пользователь выбрал критерий поиска только по стране. И получается что
PHP
if(!$xfourth || mysql_num_rows($xfourth)==0)
выводит сообщение(я) для вот этого блока, а не то что искал юзер. Как бы запрос в виде country_id=1&region_id=0&city_id=0&search=0 устраивает два варианта if - и нужный, и не нужный.

Спустя 1 час, 45 минут (29.08.2009 - 19:18) ИНСИ написал(а):
попробуй немного по другому, примерно вот так, если что, то там легко потом доправить, просто даю пример, который более проще =))

PHP
$field = array('submit_s','country_id','region_id','city_id','search');
    for($i = 0, $c = count($field); $i < $c; $i++) { 
        if
(isset($_POST[$field[$i]])) $$field[$i] = mysql_real_escape_string(stripslashes($_POST[$field[$i]])); 
    
}
    
    $where 
= array();

    if($country_id != '') { $where[] = "country_id = '{$country_id}'"; }
    if($region_id != '') { $where[] = "region_id = '{$region_id}'"; }
    if($city_id != '') { $where[] = "city_id = '{$city_id}'"; }
    if($search != '') { $where[] = "`text` LIKE '%{$search}%'"; }
         
    foreach 
($where as &$cond) { $cond = '(' . $cond . ')'; }
    if(sizeof($where) == 0) {
        //тут что надо, если никакой параметр не указан
    } 
    else 
{
        $res = "WHERE " . implode(' AND ', $where); 
    
}

Спустя 1 час, 14 минут, 34 секунды (29.08.2009 - 20:32) SunSet написал(а):
welbox2
В каком месте тут "более проще"? laugh.gif Выглядит конечно намного привлекательнее моих стараний, но трудно разобраться что за что отвечает и как работает.

Спустя 36 минут, 36 секунд (29.08.2009 - 21:09) ИНСИ написал(а):
SunSet

тут создаем переменные, из $_POST[]
PHP
$field = array('submit_s','country_id','region_id','city_id','search');
    for(
$i 0$c count($field); $i $c$i++) { 
        if(isset(
$_POST[$field[$i]])) $$field[$i] = mysql_real_escape_string(stripslashes($_POST[$field[$i]])); 
    }



создаем массив
PHP
$where = array();


если переменная не пуста, то заносим в массив "часть" запроса, который далее будет использован в mysql_query
PHP
if($country_id != '') { $where[] = "country_id = '{$country_id}'"; }
    if(
$region_id != '') { $where[] = "region_id = '{$region_id}'"; }
    if(
$city_id != '') { $where[] = "city_id = '{$city_id}'"; }
    if(
$search != '') { $where[] = "`text` LIKE '%{$search}%'"; }


создаем сам запрос, из тех переменные, которые были заполнены. мне кажется это намного проще, не только "привлекательнее" но и не "китайский" способ =))
PHP
foreach ($where as &$cond) { $cond '(' $cond ')'; }
    if(
sizeof($where) == 0) {
        
//тут что надо, если никакой параметр не указан
    

    else {
        
$res "WHERE " implode(' AND '$where); 
    }


просто дальше, чтобы добавить новое поле, надо лишь добавить 1 строчку =))

Спустя 7 минут, 19 секунд (29.08.2009 - 21:16) twin написал(а):
Расстреливать за такой код надо.

Спустя 5 минут, 55 секунд (29.08.2009 - 21:22) SunSet написал(а):
welbox2
Для меня трудно, но пробую понять. А где же сам запрос "SELECT table"? И $res - с нее потом вытягивать значения для printf? И коим образом? blink.gif

Спустя 1 минута, 56 секунд (29.08.2009 - 21:24) SunSet написал(а):
twin
Так за мой индусский вообще танком давить нужно)) со всеми do while там..

Спустя 9 минут, 39 секунд (29.08.2009 - 21:34) twin написал(а):
Из огня да в полымя... Не нужно вникать в это безобразие. Это не просто индусский код, а вообще абра кадабра какая то.
Nikitian написал алгоритм для одного действия. Если нужно разбить на условия, то нужно просто изменить логику. А то, что выше, отношения к вопросу вообще не имеет.

Спустя 11 минут, 18 секунд (29.08.2009 - 21:45) SunSet написал(а):
twin
Так трудно сообразить, как сделать без многоэтажности и чтоб работало. У меня ведь изначально было в виде:
PHP
if ($country_id AND $region_id AND $city_id AND strlen($search) > 0)
то делаем то-то. Опять еще один if ,но уже условие меняется, и так несколько. А в конце выводилось общее, если там не находило чтото то выводило полностью все из базы. Если б не $search то уже б сам сделал, а так с текстовым полем и не допойму.. blink.gif

Получается, нужно просчитать для 7 вариантов исхода.
1. $country_id > 0 AND $region_id == 0 AND $city_id == 0 AND strlen($search) == 0
2. $country_id > 0 AND $region_id > 0 AND $city_id == 0 AND strlen($search) == 0
3. $country_id > 0 AND $region_id > 0 AND $city_id > 0 AND strlen($search) == 0
4. $country_id > 0 AND $region_id > 0 AND $city_id > 0 AND strlen($search) > 0
5. $country_id > 0 AND $region_id > 0 AND $city_id == 0 AND strlen($search) > 0
6. $country_id == 0 AND $region_id == 0 AND $city_id == 0 AND strlen($search) > 0 ( и сюда же если по этому условию ничего не нашло то вывести сообщение)
7. else ... SELECT * FROM table

Как тут без индусописания обойтись? unsure.gif

Спустя 7 минут, 51 секунда (29.08.2009 - 21:53) ИНСИ написал(а):
я предложил нормальный вариант, вот, готовое =)))
PHP
$field = array('submit_s','country_id','region_id','city_id','search');
    for($i = 0, $c = count($field); $i < $c; $i++) { 
        if
(isset($_POST[$field[$i]])) $$field[$i] = mysql_real_escape_string(stripslashes($_POST[$field[$i]])); 
    
}
    
    $where 
= array();

    if($country_id != '') { $where[] = "country_id = '{$country_id}'"; }
    if($region_id != '') { $where[] = "region_id = '{$region_id}'"; }
    if($city_id != '') { $where[] = "city_id = '{$city_id}'"; }
    if($search != '') { $where[] = "`text` LIKE '%{$search}%'"; }
         
    foreach 
($where as &$cond) { $cond = '(' . $cond . ')'; }
    if(sizeof($where) == 0) {
       echo 'Вы не заполнили поля. Поиск не дал результатов';
    } 
    else 
{
        $res = mysql_query("SELECT * FROM hotels WHERE ".implode(' AND ', $where)." ");
        $row = mysql_fetch_array($res);
        while($row = mysql_fetch_array($res)) {
            echo $row['title'].' '.$row['text'].'<br><br><br>';
        }
    }

Спустя 8 минут, 9 секунд (29.08.2009 - 22:01) twin написал(а):
PHP
<?php

include 
("connect.php"); 


$submit_s 
= isset($_GET['submit_s'])? true:false;
$country_id = isset($_GET['country_id'])?$_GET['country_id']:NULL;
$region_id = isset($_GET['region_id'])?$_GET['region_id']:NULL;
$city_id = isset($_GET['city_id'])?$_GET['city_id']:NULL;
$search = isset($_GET['search'])?$_GET['search']:NULL;



echo "$country_id<br>";
echo "$region_id<br>";
echo "$city_id<br>";
echo "$search<br>"; 




if($submit_s)
{

$where = array();

if(
$country_id) 
$where
[] = "`$country_id` = ". (int)$country_id ;

if(
$region_id) 
$where
[] = "`$region_id` = ". (int)$region_id ;

if(
$city_id) 
$where
[] = "`$city_id` = ". (int)$city_id ;

if(
$search) 
$where
[] = "`text` LIKE '%". mysql_real_escape_string($search) ."%'";


    $where = (count($where) > 0)? 'WHERE ' .implode(' AND ',$where):NULL;


    $result = mysql_query ("SELECT * 
                            FROM `hotels` 
                            "
. $where
                            
);
    while (
$row mysql_fetch_assoc($result)) 
    echo 
$row["title"] .','$row["text"] . "<br><br><br>\n";
    
}

Спустя 53 секунды (29.08.2009 - 22:02) twin написал(а):
Цитата
я предложил нормальный вариант, вот, готовое =)))

NO KOMMENT

Спустя 5 минут, 37 секунд (29.08.2009 - 22:08) SunSet написал(а):
twin
Parse error: syntax error, unexpected '(', expecting ',' or ';' in Z:\home\q\www\blocks\search\ob.php on line 51
а именно
PHP
echo $fourth["title"] .','$fourth["text"] . "<br><br><br>\n"  (%s, %s,,,$r);





welbox2
Попробовал. Ничего не выводит, даже ошибок нету blink.gif

Спустя 2 минуты, 26 секунд (29.08.2009 - 22:10) twin написал(а):
Я не писал готового скрипта. Хотя сейчас поправил. Я просто попытался тут на месте привести в божеский вид. Принцип смотри, остальное сам дотягивай.

Спустя 8 минут, 57 секунд (29.08.2009 - 22:19) SunSet написал(а):
twin
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in Z:\home\q\www\blocks\search\ob.php on line 49


PHP
while ($row mysql_fetch_assoc($result))


Доработать то да, только в запрос попадает не то что нужно, наверно. unsure.gif

Спустя 3 минуты, 41 секунда (29.08.2009 - 22:23) ИНСИ написал(а):
замени это
PHP
$res = mysql_query("SELECT * FROM hotels WHERE ".implode(' AND ', $where)." ");

на
PHP
$res = mysql_query("SELECT * FROM hotels WHERE ".implode(' AND ', $where)." ") or die(mysql_error());
        }


что выводит?

Спустя 1 минута, 24 секунды (29.08.2009 - 22:24) ИНСИ написал(а):
и если можно выложить форму пожалуйста...

Спустя 2 минуты, 32 секунды (29.08.2009 - 22:27) SunSet написал(а):
welbox2
Форму не выложу, потому что она с нескольких файлов собирается. Там три селекта, 2 из которых подгружаются в зависимости что в первом.

Сейчас проверю предыдущий вариант.

Спустя 6 минут, 7 секунд (29.08.2009 - 22:33) SunSet написал(а):
welbox2
Тоже не работает, но.. если в текстовое поле ввести пробел, то находит коечто smile.gif Когда country_id = 1 и $search = пробел, то выводит содержимое страны. Остальное ниче ни бум-бум.

Спустя 36 минут, 44 секунды (29.08.2009 - 23:09) twin написал(а):
Как же хочется на всем готовом... Совсем подумать лень.
Держи, болезный)))
PHP
<?php

include ("connect.php"); 


$submit_s = isset($_GET['submit_s'])? true:false;
$country_id = isset($_GET['country_id'])?$_GET['country_id']:NULL;
$region_id = isset($_GET['region_id'])?$_GET['region_id']:NULL;
$city_id = isset($_GET['city_id'])?$_GET['city_id']:NULL;
$search = isset($_GET['search'])?$_GET['search']:NULL;


if(
$submit_s)
{

$where = array();

if(
$country_id
$where[] = "`country_id` = ". (int)$country_id ;

if(
$region_id
$where[] = "`region_id` = ". (int)$region_id ;

if(
$city_id
$where[] = "`city_id` = ". (int)$city_id ;

if(
$search
$where[] = "`text` LIKE '%"mysql_real_escape_string($search) ."%'";


    
$where = (count($where) > 0)? 'WHERE ' .implode(' AND ',$where):NULL;


       
$result mysql_query("SELECT * 
                            FROM `hotels` 
                            "
$where
                            
);
    while (
$row mysql_fetch_assoc($result)) 
    echo 
$row["title"] .','$row["text"] . "<br><br><br>\n";
    
}    
?>    
<form action="?" method="GET" >
<input name="country_id" type="text" /><br />
<input name="region_id" type="text" /><br />
<input name="city_id" type="text" /><br />
<input name="search" type="text" /><br />
<input name="submit_s" type="submit" />
</form>

Спустя 18 минут, 14 секунд (29.08.2009 - 23:28) SunSet написал(а):
twin
Спасибо еще раз. Попозже постараюсь пристыковать одно к другому

Спустя 18 часов, 53 минуты, 24 секунды (30.08.2009 - 18:21) SunSet написал(а):
twin
Просмотрел, потетстил.. Было 2 минуса - при незаполненых полях не выводило все из таблицы (SELECT *) но это исправил через else. А второе, то что изначально хотел сделать, так и не придумал.. Вот когда ввести в четвертое поле и придать $search значение какоето там "dsadafaf", то при НЕ нахождении в базе чего либо чтоб выводило через echo "Ничего не найдено". А то сейчас вовсе ничего не происходит, и else не срабатывает. Пробовал через num_rows чтото прикрутить, но не получилось unsure.gif

Спустя 2 часа, 48 минут, 22 секунды (30.08.2009 - 21:09) SunSet написал(а):
Какимто чудом сам доделал, даже работает laugh.gif
Спасибо всем кто отписывался в этом топе user posted image


_____________
... и помните! Каким бы ни был PHP, главное - чтобы он был защищенным! :) (PHP с Анфисой Чеховой)
Быстрый ответ:

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