Помогите с поиском по БД в php

Обсуждение серверного программирования.

Модераторы: Duncon, Yurich

paradigma
Сообщения: 10
Зарегистрирован: 14 фев 2010, 21:32
Откуда: Chelyabinsk, Russia

Дело в том, что мне нужно реализовать поиск по 11 критериям из БД. Вообще пользователь выбирает нужные ему критерии нажимает кнопку поиск и соответственно получает результат...Я написала код, но вроде все правильно, а не работает( :( Я формирую в коде в переменной $result сам запрос...Подскажите, где у меня ошибка пожалуйста.

// реализация поиска


$result = mysql_query ("SELECT id_d, id_re, city, street,
num_h, floor_h, floor, id_bal,
id_to, id_h, id_ser, id_dec, id_est,
date, price, memo, num_ag, reg_vl,
type_b, type_t, type_h, type_s, type_e,
type_o, id_oper, type_d, id_dec

FROM t_estate, demand, t_decor,
t_house, t_oper, agency, region,
t_balcony, t_tobath, t_series

WHERE region.id = demand.id_re
AND t_estate.id = demand.id_est
AND t_decor.id = demand.id_dec
AND t_house.id = demand.id_h
AND t_oper.id = demand.id_oper
AND t_balcony.id = demand.id_bal
AND t_tobath.id = demand.id_to
AND t_series.id = demand.id_ser

if ($reg_vl != 0) {$result .= 'AND id_re ='.$reg_vl. ' ';}
if ($street != 0) {$result .= 'AND street ='.$street. ' ';}
if ($type_e != 0) {$result .= 'AND id_est ='.$type_e. ' ';}
if ($floor != 0) {$result .= 'AND floor ='.$floor. ' ';}
if ($type_b != 0) {$result .= 'AND id_bal ='.$type_b. ' ';}
if ($type_t != 0) {$result .= 'AND id_to ='.$type_t. ' ';}
if ($type_h != 0) {$result .= 'AND id_h ='.$type_h. ' ';}
if ($type_s != 0) {$result .= 'AND id_ser ='.$type_s. ' ';}
if ($type_d != 0) {$result .= 'AND id_dec ='.$type_d. ' ';}
if ($type_o != 0) {$result .= 'AND id_oper ='.$type_o. ' ';}

", $db);

if (!$result)
{
echo "Запрос на выборку данных из базы не прошел. Напишите об этом администратору paradigma2007@rambler.ru.

<strong>Код ошибки:</strong>";
exit (mysql_error ());
}
if (mysql_num_rows($result) > 0)
{
$myrow = mysql_fetch_array ($result);
do
{
printf ("
<table width='610' align='center'>
<tr>
<td width='100'><p class = 'main7'>%s</p></td>
<td width='160'><p class = 'main7'>%s</p></td>
<td width='150'><p class = 'main7'>%s</p></td>
<td width='100'><p class = 'main7'>%s</p></td>
<td width='100' valign='top'><p ><div id='coolmenu'><a href = 'view_pod.php?pod=%s'>подробнее</a></div></p></td>
</tr>
</table>
",$myrow["date"],$myrow["city"],$myrow["type_e"],$myrow["price"], $myrow["id_d"]);
}
while ($myrow = mysql_fetch_array ($result));
}

?>
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

if ($reg_vl != 0) {$result .= 'AND id_re ='.$reg_vl. ' ';}
А не demand.id_re? Аналогично по всем остальным условиям.
И цикл я бы посоветовал делать не с послеусловием, а с предусловием:
while ($myrow=mysql_fetch_assoc($result)) # Именно assoc, а не array - mysql_fetch_array возвращает не ассоциативный массив, а нумерованный
printf ".....";
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
paradigma
Сообщения: 10
Зарегистрирован: 14 фев 2010, 21:32
Откуда: Chelyabinsk, Russia

У меня выдает ошибку такого вида
Parse error: syntax error, unexpected T_CONCAT_EQUAL, expecting '}' in z:\home\localhost\www\estate\search.php on line 75

if ($reg_vl != 0) {$result .= 'AND demand.id_re ='.$reg_vl. ' ';} (линия 75)
if ($street != 0) {$result .= 'AND street ='.$street. ' ';}
if ($type_e != 0) {$result .= 'AND demand.id_est ='.$type_e. ' ';}
if ($floor != 0) {$result .= 'AND floor ='.$floor. ' ';}
if ($type_b != 0) {$result .= 'AND demand.id_bal ='.$type_b. ' ';}
if ($type_t != 0) {$result .= 'AND demand.id_to ='.$type_t. ' ';}
if ($type_h != 0) {$result .= 'AND demand.id_h ='.$type_h. ' ';}
if ($type_s != 0) {$result .= 'AND demand.id_ser ='.$type_s. ' ';}
if ($type_d != 0) {$result .= 'AND demand.id_dec ='.$type_d. ' ';}
if ($type_o != 0) {$result .= 'AND demand.id_oper ='.$type_o. ' ';}
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

...
AND t_series.id = demand.id_ser
# У вас не закрыт запрос.
if ($reg_vl != 0) {$result .= 'AND id_re ='.$reg_vl. ' ';}

У вас не закрыта строка запроса. Забыли кавычки, закрыть скобку, точку с запятой.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
paradigma
Сообщения: 10
Зарегистрирован: 14 фев 2010, 21:32
Откуда: Chelyabinsk, Russia

у меня запрос закрывается после всех
if
.....
if

", $db);
то есть сначала нужно закрыть запрос, а после делать проверки?
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Надо сначала сформировать текст со всеми проверками, а потом делать запрос.
$result="SELECT id_d, id_re, city, street,
..... и т.д.
AND t_series.id = demand.id_ser ";

if ($reg_vl != 0) {$result .= 'AND demand.id_re ='.$reg_vl. ' ';}
... и т.д.

$result=mysql_query($result);

Либо вставками в виде тернарных выражений
$result=mysql_query("select ...
and t_series.id=demand.id_ser ".
($reg_vl? 'AND id_re ='.$reg_vl. ' ':"").
($street? 'AND street ='.$street. ' ':"").
...
, $db);
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
paradigma
Сообщения: 10
Зарегистрирован: 14 фев 2010, 21:32
Откуда: Chelyabinsk, Russia

Исправила я все ошибки...
Вот что получила
<?php

// реализация поиска
$sql = "SELECT id_d, id_re, city, street,
num_h, floor_h, floor, id_bal,
id_to, id_h, id_ser, id_dec, id_est,
date, price, memo, num_ag, reg_vl,
type_b, type_t, type_h, type_s, type_e,
type_o, id_oper, type_d, id_dec

FROM t_estate, demand, t_decor,
t_house, t_oper, agency, region,
t_balcony, t_tobath, t_series

WHERE region.id = demand.id_re
AND t_estate.id = demand.id_est
AND t_decor.id = demand.id_dec
AND t_house.id = demand.id_h
AND t_oper.id = demand.id_oper
AND t_balcony.id = demand.id_bal
AND t_tobath.id = demand.id_to
AND t_series.id = demand.id_ser";

if ($reg_vl != 0) {$sql .= 'AND demand.id_re ='.$reg_vl. ' ';}
if ($street != 0) {$sql .= 'AND street ='.$street. ' ';}
if ($type_e != 0) {$sql .= 'AND demand.id_est ='.$type_e. ' ';}
if ($floor != 0) {$sql .= 'AND floor ='.$floor. ' ';}
if ($type_b != 0) {$sql .= 'AND demand.id_bal ='.$type_b. ' ';}
if ($type_t != 0) {$sql .= 'AND demand.id_to ='.$type_t. ' ';}
if ($type_h != 0) {$sql .= 'AND demand.id_h ='.$type_h. ' ';}
if ($type_s != 0) {$sql .= 'AND demand.id_ser ='.$type_s. ' ';}
if ($type_d != 0) {$sql .= 'AND demand.id_dec ='.$type_d. ' ';}
if ($type_o != 0) {$sql .= 'AND demand.id_oper ='.$type_o. ' ';}


$result = mysql_query ($sql, $db);

if (!$result)
{
echo "Запрос на выборку данных из базы не прошел. Напишите об этом администратору paradigma2007@rambler.ru.

<strong>Код ошибки:</strong>";
exit (mysql_error ());
}

if (mysql_num_rows($result) > 0)
{
$myrow = mysql_fetch_array ($result);
do
{
printf ("
<table width='610' align='center'>
<tr>
<td width='100'><p class = 'main7'>%s</p></td>
<td width='160'><p class = 'main7'>%s</p></td>
<td width='150'><p class = 'main7'>%s</p></td>
<td width='100'><p class = 'main7'>%s</p></td>
<td width='100' valign='top'><p ><div id='coolmenu'><a href = 'view_pod.php?pod=%s'>подробнее</a></div></p></td>
</tr>
</table>
",$myrow["date"],$myrow["city"],$myrow["type_e"],$myrow["price"], $myrow["id_d"]);
}
while ($myrow = mysql_fetch_array($result));
}

?>
И теперь у меня выдается ошибка
Запрос на выборку данных из базы не прошел. Напишите об этом администратору paradigma2007@rambler.ru.
Код ошибки:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'demand.id_re =4' at line 19

то есть доходит до проверки
if (!$result)
и все
видимо опять неправильно результат сформирован или еще что-то
не могу понять...

подскажите плиз
lastgoblin
Сообщения: 2
Зарегистрирован: 19 фев 2010, 15:10

проблема с пробелом. получается запрос: "AND t_series.id = demand.id_serAND".
Я предлагаю, при добавлении условий поиска с использованием if, ставить пробел в начале строки.
получиться должно:
if ($reg_vl != 0) {$sql .= ' AND demand.id_re ='.$reg_vl;}
if ($street != 0) {$sql .= ' AND street ='.$street;}
и т.д.
paradigma
Сообщения: 10
Зарегистрирован: 14 фев 2010, 21:32
Откуда: Chelyabinsk, Russia

заработало))) только теперь он мне 10 раз выводи одну строку....странно
lastgoblin
Сообщения: 2
Зарегистрирован: 19 фев 2010, 15:10

предлагаю сделать вывод получившегося запроса. после выполнить запрос в каком-нибудь клиенте для БД, и посмотреть результат.
Ответить