[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Поиск по базе
Oliver Varnce
Всем привет!


Возник вопрос, уточняю я совсем еще в пыхе сырой.


Есть у меня таблица:

id | name | number | logo |

есть форма поиска

Номер ID:
Имя:
номер:

ну и собсно "Поиск"

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

желательно по существу постить, с примерами. Буду примного благодарен за помощь.



Спустя 6 часов, 25 минут, 5 секунд (26.05.2011 - 02:07) ueo написал(а):
попробуй так:
[<?
mysql_connect("localhost","","");
mysql_select_db("namebaaza");
$rez=mysql_query("SELECT * FROM table WHERE id='$id" OR name='$name' OR number='$number'");
while($row=mysql_fetch_array($rez))
{
echo $row['id'], $row['name'], $row['number'];
}
?>]

Спустя 35 минут, 43 секунды (26.05.2011 - 02:42) inpost написал(а):
$search = array();

if(!empty($_POST['id']))
$search[] = "`id` = ".(int)$_POST['id'];

$search = implode(' AND ',$search);


Коротко, ясно, остальное по аналогии, потом в запрос подставляешь переменную

Спустя 5 часов, 56 минут, 1 секунда (26.05.2011 - 08:38) linker написал(а):
Хоть бы сообщение ТС почитали, прежде чем советы давать и код писать :) Примерно так
if (empty($_POST['id']) || empty($_POST['name']) || empty($_POST['num']))
die('Вы не всё ввели').

// а тут поиск

Спустя 1 час, 16 минут, 45 секунд (26.05.2011 - 09:55) Oliver Varnce написал(а):
дело в том что как раз этого не должно быть. Должно искать даже если не все поля заполнены

Спустя 3 минуты, 20 секунд (26.05.2011 - 09:59) Michael написал(а):
Oliver Varnce, вставляй сюда твой код из закрытой темы. Тут продолжим.

Спустя 18 минут, 26 секунд (26.05.2011 - 10:17) Oliver Varnce написал(а):
<?

//@ $db = mysql_connect("localhost",'root','');
@ $db = mysql_connect("localhost",'root','');
if (!$db) {echo "ERROR: Failed to connect database"; exit;}
mysql_select_db('vip_'.$LANG);
mysql_query('SET NAMES cp1251');

//создаем массив полей, которые могут использоваться в запросе, собственно это и есть основной элемент универсальности
$_columns = array('id'=>'all',
'street'=>NULL,
'price1'=>NULL,
'price2'=>NULL,
'rooms1'=>NULL,
'rooms2'=>NULL,
'floor1'=>NULL,
'floor2'=>NULL,
'date1'=>NULL,
'date2'=>NULL);
$query_filter = '';//кусок запроса с условиями
$query_filter_array = array();
//собственно проверяем отправили ли форму
if ($_POST['submit']){
//смотрим что у нас пришло с поста
foreach($_columns as $key=>$value){
if(isset($_POST[$key])){
$query_filter_array[] = '`'.$_POST[$key]. '` LIKE \''.$_POST[$key].'\'';
}
}
}

//проверяем было ли что-то заполнено
//если да то разбираем массив

if(!empty($query_filter_array)){
$query_filter = " WHERE ".implode(' AND ', $query_filter_array);
}

//дальше собираем весь запрос и выполняем
$Query = mysql_query($tQuery.$query_filter);

if (!$db) {
echo "Error: couldnt connect";
exit;
}

echo "найдено: $Query";

?>






пытаюсь запустить листинг только по одному запросу id

Спустя 37 секунд (26.05.2011 - 10:18) Oliver Varnce написал(а):
я понимаю что я накосячил чтото с запросом и выводом результатов, но не могу сообразить как правильно...

Спустя 6 минут, 14 секунд (26.05.2011 - 10:24) linker написал(а):
Пропустил частицу не.

$Query = mysql_query($tQuery.$query_filter);
не нашёл определения $tQuery, где она начинается? Далее тут же присваиваешь результат $Query, а проверяешь почему-то
if (!$db) {
echo "Error: couldnt connect";
exit;
}
зачем двойная проверка здесь и в начале кода?

Спустя 1 минута, 50 секунд (26.05.2011 - 10:26) Michael написал(а):
В $tQuery надо прописать текст запроса, который будет до WHERE, т.е.:
SELECT * FROM name_table
,
а потом выводи, во что формируются твои
print $tQuery.$query_filter;

и смотри какие тексты запросов создаются

p.s. Оформляй код тегами форматирования

Спустя 19 минут (26.05.2011 - 10:45) Oliver Varnce написал(а):
Попрошу чуть-чуть по подробнее. можете кодом показать?

Спустя 2 минуты, 41 секунда (26.05.2011 - 10:47) linker написал(а):
Перед
$Query = mysql_query($tQuery.$query_filter);
напиши
die($tQuery.$query_filter);
и полюбуйся свои запросом, а заодно и нам покажи.

Спустя 1 минута, 2 секунды (26.05.2011 - 10:48) Michael написал(а):
$tQuery = 'SELECT * FROM name_table ';

(где name_table - имя твоей таблицы)
Прописываешь "начало sql-запроса". Тот твой код сформирует тебе $query_filter - "хвост" запроса. А на выполнение отправляется соединенный запрос: mysql_query($tQuery.$query_filter);

Спустя 3 минуты, 40 секунд (26.05.2011 - 10:52) Oliver Varnce написал(а):
<?

//@ $db = mysql_connect("localhost",'root','');
@ $db = mysql_connect("localhost",'root','');
if (!$db) {echo "ERROR: Failed to connect database"; exit;}
mysql_select_db('vipagent_'.$LANG);
mysql_query('SET NAMES cp1251');

//создаем массив полей, которые могут использоваться в запросе, собственно это и есть основной элемент универсальности
$_columns = array('id'=>'$id',
'street'=>NULL,
'price1'=>NULL,
'price2'=>NULL,
'rooms1'=>NULL,
'rooms2'=>NULL,
'floor1'=>NULL,
'floor2'=>NULL,
'date1'=>NULL,
'date2'=>NULL);
$query_filter = '';//кусок запроса с условиями
$query_filter_array = array();
//собственно проверяем отправили ли форму
if ($_POST['submit']){
//смотрим что у нас пришло с поста
foreach($_columns as $key=>$value){
if(isset($_POST[$key])){
$query_filter_array[] = '`'.$_POST[$key]. '` LIKE \''.$_POST[$key].'\'';
}
}
}

//проверяем было ли что-то заполнено
//если да то разбираем массив

if(!empty($query_filter_array)){
$query_filter = " WHERE ".implode(' AND ', $query_filter_array);
}

$tQuery = mysql_query (SELECT * FROM real WHERE $id = id);

die($tQuery.$query_filter);

//дальше собираем весь запрос и выполняем
$Query = mysql_query($tQuery.$query_filter);


print $tQuery.$query_filter;

?>



чтот я никак не могу понять


[MOD]Оформляй код тегами: кнопка php, на панельке выше окна редактора.Michael[/EX]

Спустя 4 минуты, 11 секунд (26.05.2011 - 10:56) Michael написал(а):
Цитата
$tQuery = mysql_query (SELECT * FROM real WHERE $id = id);

Я, что - разве так написал делать?...

Спустя 1 минута, 37 секунд (26.05.2011 - 10:58) Oliver Varnce написал(а):
во так надо?

$tQuery ='SELECT * FROM real';

Спустя 3 минуты, 5 секунд (26.05.2011 - 11:01) Michael написал(а):
да, а точнее:
$tQuery ='SELECT * FROM `real`';


Спустя 7 минут, 37 секунд (26.05.2011 - 11:09) Oliver Varnce написал(а):
чтото не добавляет хвост...

пишет при проверке запроса
SELECT * FROM `real`



вот листинг
<?

//@ $db = mysql_connect("localhost",'root','');
@ $db = mysql_connect("localhost",'root','');
if (!$db) {echo "ERROR: Failed to connect database"; exit;}
mysql_select_db('vipagent_'.$LANG);
mysql_query('SET NAMES cp1251');

//создаем массив полей, которые могут использоваться в запросе, собственно это и есть основной элемент универсальности
$_columns = array('id'=>'$id',
'street'=>'$street',
'price1'=>NULL,
'price2'=>NULL,
'rooms1'=>NULL,
'rooms2'=>NULL,
'floor1'=>NULL,
'floor2'=>NULL,
'date1'=>NULL,
'date2'=>NULL);
$query_filter = '';//кусок запроса с условиями
$query_filter_array = array();
//собственно проверяем отправили ли форму
if ($_POST['submit']){
//смотрим что у нас пришло с поста
foreach($_columns as $key=>$value){
if(isset($_POST[$key])){
$query_filter_array[] = '`'.$_POST[$key]. '` LIKE \''.$_POST[$key].'\'';
}
}
}

//проверяем было ли что-то заполнено
//если да то разбираем массив

if(!empty($query_filter_array)){
$query_filter = " WHERE ".implode(' AND ', $query_filter_array);
}

$tQuery ='SELECT * FROM `real`';


//дальше собираем весь запрос и выполняем
$Query = mysql_query($tQuery.$query_filter);


print $tQuery.$query_filter; // проверка сложенного запроса


?>

Спустя 3 минуты, 41 секунда (26.05.2011 - 11:12) Michael написал(а):
html с формой показывай теперь

Спустя 13 минут, 4 секунды (26.05.2011 - 11:25) Oliver Varnce написал(а):
<form method="POST" action="/ru/search.php" id='frm' name='frm'>
<table
cellpadding="0" cellspacing="0" summary="Форма поиска">
<td
class="control">

<div
style="position: relative;"><input name="id" type="text" id="code" class="right key" />   
<input type="submit" class="submit" id="search" value="Поиск" /><input type="button" onclick="resetIT()" name="reset" class="submit right" value="Сброс" />
</div>

<p>
&nbsp</p>
<div></div>
</td>
</tr>
<tr
class="ruler">
<tr
class="bottom">
<td
class="l" colspan="2"> </td>
</tr>
</table>
</form>
</div></div>

Спустя 9 минут, 1 секунда (26.05.2011 - 11:34) Oliver Varnce написал(а):
я в конце кода написал
print $tQuery.$query_filter; // проверка сложенного запроса
как мне посоветовали. на сколько я понимаю должно было показать весь запрос. а мне показало только значение $tQuery а $query_filter гдето потерялся

Спустя 1 час, 51 минута, 35 секунд (26.05.2011 - 13:26) Michael написал(а):
В примере предполагалось, что ты ищешь по разным полям. Сам ведь писал:
Цитата (Oliver Varnce)
как мне сформировать код, чтобы при вводе не всех полей осуществлялся поиск,

И эти поля - указываешь в форме.
Т.е., ты пишешь:
$_columns = array('id'=>'$id',
'street'=>'$street',
'price1'=>NULL,
'price2'=>NULL,
'rooms1'=>NULL,
'rooms2'=>NULL,
'floor1'=>NULL,
'floor2'=>NULL,
'date1'=>NULL,
'date2'=>NULL);

значит для каждого значения поискового столбца должно быть поле в форме.
А где? Вижу только name="id"

Спустя 1 час, 42 минуты, 18 секунд (26.05.2011 - 15:08) Oliver Varnce написал(а):
ну как формировать массивы я знаю, они указаны у меня. Но сейчас я хочу запустить хотябы по одному запросу.

Спустя 39 секунд (26.05.2011 - 15:09) Oliver Varnce написал(а):
во что у меня
$_columns = array('id'=>'$id',
'street'=>'$street',
'price1'=>'$price',
'price2'=>'$price2',
'rooms1'=>'$rooms1',
'rooms2'=>'$rooms2',
'floor1'=>'$floor1',
'floor2'=>'$floor2',
'date1'=>'$date2',
'date2'=>'$date2');

Спустя 2 минуты, 50 секунд (26.05.2011 - 15:12) Oliver Varnce написал(а):
тут я заметил одно но....

$query_filter = ' ';//кусок запроса с условиями


что мне вписать сюда?

с условием того что там где параметр например price1 и price2 - это искать с ценой от-до. тоесть выбрать из базы все строки которые соответствуют от-до.

Спустя 2 дня, 17 часов, 5 минут, 38 секунд (29.05.2011 - 08:17) Oliver Varnce написал(а):
Народ, ну кто мне сможет помочь?

Спустя 3 часа, 17 минут, 58 секунд (29.05.2011 - 11:35) T1grOK написал(а):
Цитата (Oliver Varnce @ 26.05.2011 - 12:12)
тут я заметил одно но....

$query_filter = ' ';//кусок запроса с условиями


что мне вписать сюда?

Ничего не надо вписывать. Это объявление переменной.

Спустя 10 минут, 26 секунд (29.05.2011 - 11:46) T1grOK написал(а):
Цитата (Oliver Varnce @ 26.05.2011 - 12:09)
во что у меня
$_columns = array('id'=>'$id',
'street'=>'$street',
'price1'=>'$price',
'price2'=>'$price2',
'rooms1'=>'$rooms1',
'rooms2'=>'$rooms2',
'floor1'=>'$floor1',
'floor2'=>'$floor2',
'date1'=>'$date2',
'date2'=>'$date2');

1) '$id' - одинарные кавычки, значит подставляться переменная не будет. Это строка.
2) И вообще, в данном массиве учавствует только ключ, значения не нужны.

Спустя 1 день, 4 часа, 1 минута, 56 секунд (30.05.2011 - 15:48) Oliver Varnce написал(а):
фуф, запутался совсем((

Спустя 1 день, 20 часов, 20 минут, 22 секунды (1.06.2011 - 12:08) Oliver Varnce написал(а):
в форме видно только айди, потому что формы вообще две. одна будет искать только по id, а вторая будет искать по все параметрам.

Спустя 5 часов, 16 минут, 10 секунд (1.06.2011 - 17:24) Oliver Varnce написал(а):
Народ ну кто мне поможет? я вообще не могу понять как мне произвести поиск по критериям!!

Спустя 1 день, 21 час, 28 минут, 35 секунд (3.06.2011 - 14:53) Oliver Varnce написал(а):
Не работает чтото этот универсальный поиск((

Спустя 2 часа, 2 минуты, 18 секунд (3.06.2011 - 16:55) Oliver Varnce написал(а):
Где я накосячил?


<?

@ $db = mysql_connect("localhost",'root','');
if (!$db) {echo "ERROR: Failed to connect database"; exit;}
mysql_select_db('vipagent_'.$LANG);
mysql_query('SET NAMES cp1251');

//создаем массив полей, которые могут использоваться в запросе
$_columns = array('code'=>NULL,'street'=>NULL,'price1'=>NULL,'price2'=>NULL,'rooms1'=>NULL,'rooms2'=>NULL,'floor1'=>NULL,'floor2'=>NULL,'date1'=>NULL,'date2'=>NULL);
$query_filter = '';
$query_filter_array = array();
// проверяем отправили ли форму
//смотрим что у нас пришло с поста

if ($_POST['submit']){

foreach($_columns as $key=>$value){
if(isset($_POST[$key])){
$query_filter_array[] = '`'.$_POST[$key]. '` LIKE \''.$_POST[$key].'\'';
}
}
}

//проверяем было ли что-то заполнено
//если да то разбираем массив

if(!empty($query_filter_array)){
$query_filter = " WHERE ".implode(' AND ', $query_filter_array);
}

$tQuery ='SELECT * FROM realty';

$test = $tQuery.$query_filter;
echo $test; // проверка сложенного запроса
//собираем весь запрос и выполняем

$result = mysql_query($test);
if (!$result) print ("failed\n");

WHILE ($row = mysql_fetch_row($result))
$number = mysql_numrows($result);
if (!$number) print("failed 2 \n");
$i = 0;


PRINT "<font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"-2\">
<b>There are
$number users found</b></font><p>";
PRINT "<table cellpadding=5>";
PRINT " <TR bgcolor=#000066> <td><font face=\"Verdana,
Arial,Helvetica, sans-serif
\" size=\"-2\" color=white><b>Street
</b></font></td>"
;

WHILE ($i < $number):
$street = mysql_result($street, $i,"street");

if ($i%2 == 0) {
PRINT "<tr bgcolor=#E8E8E8>
<td><font face=
\"Verdana, Arial, Helvetica,
sans-serif
\" size=\"-2\"> $street</font></td>
"
;
} else {
PRINT "<tr bgcolor=#cccccc>
<td><font face=
\"Verdana, Arial, Helvetica,
sans-serif
\" size=\"-2\"> $street</font></td>
"
;
}
$i++;
ENDWHILE;
PRINT "</table>";









?>

Спустя 14 минут, 14 секунд (3.06.2011 - 17:09) Oliver Varnce написал(а):
когда я вывожу проверку запроса мне почемуто выводит вот такое:

SELECT * FROM realty WHERE `dm123` LIKE 'dm123'failed


а по идее должно вот такое выводить:
SELECT * FROM realty WHERE code LIKE 'dm123'


тоесть я в форму с именем code ввожу dm123

Спустя 16 часов, 38 минут, 21 секунда (4.06.2011 - 09:48) Oliver Varnce написал(а):
да, и еще вопрос, как мне быть с тем что мне нужно искать по цене от-до? как это реализовуется, заранее спасибо

Спустя 10 минут, 22 секунды (4.06.2011 - 09:58) Игорь_Vasinsky написал(а):
SELECT * FROM `realty` WHERE `code` LIKE '%dm123%'

Цитата
по цене от-до?

почитатй про BETWEEN вроде у MySQL ;)


Спустя 14 минут, 50 секунд (4.06.2011 - 10:13) Oliver Varnce написал(а):
нене, сейчас я пробую запустить только вводя один запрос. тоесть я ввел в поле поиска с именем code значение dm123. но у меня еще есть в форме поле по цене (от-до) (но это я забегаю наперед) я не могу понять, почему скрипт при введенном одном значении вводит после WHERE значение ключа code, а не сам ключ?


P.S.
Спасибо за совет про битвин, почитаю)

Спустя 5 минут, 47 секунд (4.06.2011 - 10:19) Игорь_Vasinsky написал(а):
Цитата
в поле поиска с именем code значение dm123.

это input с name=code???? или столбец в БД blink.gif

Спустя 5 минут, 42 секунды (4.06.2011 - 10:24) Oliver Varnce написал(а):
и инпут и столбец,
тоесть есть input с name="code", и столбец в базе точно тка же назван (чтобы не путаться).

Спустя 14 минут, 48 секунд (4.06.2011 - 10:39) Игорь_Vasinsky написал(а):
убери @, ты же вывод ошибок подавляешь.
Цитата
@ $db = mysql_connect("localhost",'root','');


в PMA в SQL введи

SELECT * FROM `realty` WHERE `code` LIKE 'dm123'

что возращает?

Спустя 25 минут, 1 секунда (4.06.2011 - 11:04) Oliver Varnce написал(а):
Все отлично возвращеает через пхп майадмин, две строки где столбец code cоостветстввует запросу

Спустя 7 минут, 2 секунды (4.06.2011 - 11:11) Игорь_Vasinsky написал(а):
Вот здесь:
Цитата
$tQuery ='SELECT * FROM realty';

$test = $tQuery.$query_filter;
echo $test; // проверка сложенного запроса
//собираем весь запрос и выполняем
$result = mysql_query($test);
if (!$result) print ("failed\n");


Пропиши ручками вместо переменной $tQuery.$query_filter;

Спустя 13 минут, 5 секунд (4.06.2011 - 11:24) Oliver Varnce написал(а):
Ничего не поменялось sad.gif

Спустя 17 минут, 26 секунд (4.06.2011 - 11:42) Oliver Varnce написал(а):
Так, ну с одним разобрался
Вот это:

foreach($_columns as $key=>$value){
if(isset($_POST[$key])){
$query_filter_array[] = '`'.$_POST[$key]. '` LIKE \''.$_POST[$key].'\'';
}
}
}


Заменить нужно на вот это:
foreach($_columns as $key=>$value){
if(isset($_POST[$key])){
$query_filter_array[] = '`'.$key. '` LIKE \''.mysql_real_escape_string($_POST[$key]).'\'';
}
}
}


При проверке запроса (echo $test;) запрос выдает уже правильно, но с базы инфу не тянет почемуто((

Спустя 23 минуты, 36 секунд (4.06.2011 - 12:05) Игорь_Vasinsky написал(а):
А у тя в базу вообще что нибудь уходит?

Цитата
$_POST[$key]

$_POST['$key']

Спустя 33 минуты, 25 секунд (4.06.2011 - 12:39) Oliver Varnce написал(а):
а как мне это проверить? из массива выбрать ключ? и отобразить его значение?

Спустя 18 минут, 2 секунды (4.06.2011 - 12:57) Игорь_Vasinsky написал(а):
сделай так:

echo isset($_POST[$key]) ? $_POST[$key] : null;

Спустя 1 час, 13 минут, 5 секунд (4.06.2011 - 14:10) Oliver Varnce написал(а):
Ничего не отображает( Значит значение переменной не передается в базу. что же делать? подскажите?

Спустя 5 минут, 13 секунд (4.06.2011 - 14:15) Игорь_Vasinsky написал(а):
Элементарно, у тя ошибка в синтаксисе, делай щас так:

echo isset($_POST['$key']) ? $_POST['$key'] : null;

Спустя 5 минут, 26 секунд (4.06.2011 - 14:21) Oliver Varnce написал(а):
тоже ничего не отображает( кроме слова failed которое есть в условии

вот код, чтобы не рыться

<?

$db = mysql_connect("localhost",'root','');
if (!$db) {echo "ERROR: Failed to connect database"; exit;}
mysql_select_db('vipagent_'.$LANG);
mysql_query('SET NAMES cp1251');

//создаем массив полей, которые могут использоваться в запросе
$_columns = array('code'=>NULL,
'street'=>NULL,
'price1'=>NULL,
'price2'=>NULL,
'rooms1'=>NULL,
'rooms2'=>NULL,
'floor1'=>NULL,
'floor2'=>NULL,
'date1'=>NULL,
'date2'=>NULL);
$query_filter = '';
$query_filter_array = array();
// проверяем отправили ли форму
//смотрим что у нас пришло с поста

if ($_POST['submit']){

foreach($_columns as $key=>$value){
if(isset($_POST[$key])){
$query_filter_array[] = '`'.$key. '` LIKE \''.mysql_real_escape_string($_POST[$key]).'\'';
}
}
}



//проверяем было ли что-то заполнено
//если да то разбираем массив

if(!empty($query_filter_array)){
$query_filter = " WHERE ".implode(' AND ', $query_filter_array);
}

$tQuery ='SELECT * FROM `realty`';

$test = $tQuery.$query_filter;


//отладка
//echo $test; // проверка сложенного запроса

echo isset($_POST['$key']) ? $_POST['$key'] : null;//отладка
//собираем весь запрос и выполняем


$result = mysql_query($test);
if (!$result) print ("failed\n");

Спустя 3 минуты, 36 секунд (4.06.2011 - 14:24) Игорь_Vasinsky написал(а):
у тя Input name='key' ?
Вывод должен быть после отправки данных через форму.

попробуй var dump($_POST); вроде...

Спустя 14 минут, 10 секунд (4.06.2011 - 14:38) Oliver Varnce написал(а):
не получается ничего(( input name="code"

Спустя 4 минуты, 33 секунды (4.06.2011 - 14:43) Игорь_Vasinsky написал(а):
в начале кода:
error_reporting(E_ALL);

может

if ($_POST['submit']){

заменить на
if (isset($_POST['submit'])){

Спустя 9 минут, 30 секунд (4.06.2011 - 14:52) Oliver Varnce написал(а):
Спасибо большое, я и не додумался поставить максимальный уровень контроля ошибок, и узнал в чем проблемма, оказывается изначальная проблемма в mysql_select_db я задал префикс таблицы через $LANG а не прописал как его присвоить из куков)) но все равно при исполнении скрипта пишет вот что:

Warning: mysql_result() expects parameter 1 to be resource, null given in Z:\home\mysite.com\www\ru\search.php on line 67

line 67 это:


$street = mysql_result($street, $i,"street");


хотя и нашло три результата у которых столбец code совпадает с запросом.

Спустя 17 минут, 6 секунд (4.06.2011 - 15:09) Игорь_Vasinsky написал(а):
блин.. из головы вылетело название ситуации. (рекурсия вроде)

Цитата
$street = mysql_result($street, $i,"street");


вообщем мне кажется ты переменную внутри самой себя используешь, говорит что 1 параметр ($street) - нулевой.

МОжет попробывать другое название переменной
$streetNew = mysql_result($street, $i,"street");

хз

Спустя 55 минут, 1 секунда (4.06.2011 - 16:04) Oliver Varnce написал(а):
да, похоже на то, щас будет ковырять) спасибо!

Спустя 10 дней, 3 часа, 40 минут, 59 секунд (14.06.2011 - 19:45) Oliver Varnce написал(а):
Не хочет складывать запрос хоть ты лопни(((
подскажите где косяк?
$_columns = array('real_code'=>NULL,
'street'=>NULL,
'price1'=>NULL,
'price2'=>NULL,
'rooms1'=>NULL,
'rooms2'=>NULL,
'floor1'=>NULL,
'floor2'=>NULL,
'date1'=>NULL,
'date2'=>NULL);

$query_filter = '';
$query_filter_array = array();
// проверяем отправили ли форму
//смотрим что у нас пришло с поста

if (isset($_POST['submit'])){

foreach($_columns as $key=>$value){
if(isset($_POST[$key])){
$query_filter_array[] = "`'.$key. '` LIKE \''.mysql_real_escape_string($_POST[$key]).'\'";
}
}
}



//проверяем было ли что-то заполнено
//если да то разбираем массив

if(!empty($query_filter_array)){
$query_filter = " WHERE " . implode(' AND ', $query_filter_array);
}

$tQuery ='SELECT * FROM `realty`';

$test = $tQuery.$query_filter;
//var_dump($query_filter);

//отладка

echo $test; // проверка сложенного запроса
echo isset($_POST['$key']) ? $_POST['$key'] : null;//отладка
echo isset($_POST[$key]) ? $_POST[$key] : null;
echo mysql_errno() . ": " . mysql_error() . "\n";

//собираем весь запрос и выполняем
$result = mysql_query($test) or die('Query failed: ' . mysql_error());
//sif (!$result) print ("failed\n");

$n=mysql_num_rows($result);
$logo = '<img src ="/uploads/realty/';


echo '<table>';
while($arr = mysql_fetch_assoc($result))
{
echo '<tr>'
. '<td>'.$logo . $arr['logo'] . '">' .'</td>'
. '<td>'. $arr['region'] .'</td>'
. '<td>'. $arr['rooms'] .'</td>'
. '</tr>';
}
echo '</table>';

Спустя 24 минуты, 8 секунд (14.06.2011 - 20:10) Oliver Varnce написал(а):
почему оно с такой формой не хочет работать, а вытягивает все записи с таблицы?

<form method="POST" action="/{LANG}/search/" id='frm' name='frm'>

<table
cellpadding="0" cellspacing="0" summary="Форма поиска">
<tr
class="main">
<td
class="geo">
<p>
Районы Харькова:</p>
<div><a
style="border: 0;" href="javascript:;" onclick="mapToggle();"><img src="/{LANG}/images/form_map.gif" width="20" height="20" alt="Карта" /><span id="geoSelection">Выбрано все районы</span></a></div>
<input
name="region" id="region" type="hidden" value="1"/>

<!--[if IE]>
<iframe frameBorder="0" scrolling="no"></iframe>
<![endif]-->

<div id="map" class="kharkov" style="display: none;">
<button
class="submit" type="button" onclick="mapSubmit(); return false;">Выбрать</button><button type="button" onclick="mapItemReset();">Сброс</button>
<p
class="a1002248">
<a
id="a1002248" class="mass">Червонозаводский</a><br />

</p>
<p
class="a1002242">
<a
id="a1002242" class="mass">Фрунзенский</a><br />

</p>
<p
class="a1002241">

</p>
<p
class="a1002243">
<a
id="a1002243" class="mass">Московский</a><br />

</p>
<p
class="a1002247">
<a
id="a1002247" class="mass">Орджоникидзевский</a><br />

</p>
<p
class="a1002249">
<a
id="a1002249" class="mass">Коминтерновский</a><br />

</p>
<p
class="a1002250">
<a
id="a1002250" class="mass">Дзержинский</a><br />

</p>
<p
class="a1003198">
<a
id="a1003198" class="mass">Ленинский</a><br />

</p>
<p
class="a1002246">
<a
id="a1002246" class="mass">Октябрский</a><br />

</p>
<p
class="a1002253">
<a
id="a1002253" class="mass">Киевский</a><br />

</p>
</div>

<p>
Улицы:</p>
<div>
<input
type="text" class="ac_input" autocomplete="off" value="" maxlength="200" id="streetlst" name="street"/>
<!--input type="text" id="p_StreetName" name="p_StreetName" value="" /-->
</div>


<p><strong>
Цена</strong> <dfn>(от — до)</dfn>:</p>
<div><input
type="text" name="price" class="short key" value="" /><input name="price2" type="text" class="short key" value="" /><dfn> у.о.</dfn></div> </td>
<td>
<p>
Комнат <dfn>(от — до)</dfn>:</p>
<div><input
name="room1" type="text" class="short" value="" /><input name="room2" type="text" class="short" value="" /></div>
<p>
Этаж <dfn>(от — до)</dfn>:</p>
<div><input
name="floor1" type="text" class="short" value="" /><input name="floor2" type="text" class="short" value="" /></div></td>
<td
class="control">
<p>
Дата внесения <dfn>(от — до)</dfn>:</p>
<div>
<input
name="date1" id="date1" type="text" class="short" value="" style="margin-right:2px !important;"/>
<input
id="date2" name="date2" type="text" class="short" value="" style="margin-right:2px !important;margin-left:4px !important;"/>
</div>

<p>
 </p>
<div
style="position: relative;">Или введите код:<br \>
<input
name="real_code" type="text" id="real_code" class="ac_input" />
</div>

<p>
 </p>
<div><input
type="submit" class="submit" id="search" value="Поиск" /><input type="button" onclick="resetIT()" name="reset" class="submit right" value="Сброс" /></div> </td>
</tr>
<tr
class="ruler">
<td
colspan="2"> </td>

<tr
class="bottom">
<td
class="l" colspan="2"> </td>
<td
class="r"> </td>
</tr>
</table>
</form>

Спустя 15 часов, 32 минуты, 42 секунды (15.06.2011 - 11:42) Oliver Varnce написал(а):
Заметил одну беду, не передается с посту информация. Кто может подсказать почему?

Спустя 1 час, 38 минут, 10 секунд (15.06.2011 - 13:20) Oliver Varnce написал(а):
Да, во еще при формировании запроса по нескольким критериям, например real_code и street, причем заполнено поле только street, формирует запрос:
SELECT * FROM `realty` WHERE `real_code` LIKE ' ' AND `street` LIKE 'Попова'


а должно же быть так:
SELECT * FROM `realty` WHERE  AND `street` LIKE 'Попова'


Спустя 1 час, 28 минут, 34 секунды (15.06.2011 - 14:49) Игорь_Vasinsky написал(а):
Чтобы посмотреть что выходит с формы, в коде обработчика добавь строку:
var_dump($_POST);

- получишь содержание массива POST
если твоих данных там нет - значит косяки в форме

Спустя 3 часа, 30 минут, 49 секунд (15.06.2011 - 18:20) Oliver Varnce написал(а):
вот что показывает


 
array(11) { ["region"]=> string(1) "1" ["street"]=> string(6) "попова" ["price"]=> string(0) "" ["price2"]=> string(0) "" ["room1"]=> string(0) "" ["room2"]=> string(0) "" ["floor1"]=> string(0) "" ["floor2"]=> string(0) "" ["date1"]=> string(0) "" ["date2"]=> string(0) "" ["real_code"]=> string(0) "" } SELECT * FROM `realty`

Спустя 5 минут, 15 секунд (15.06.2011 - 18:25) Oliver Varnce написал(а):
Основная проблемма в том, что незаполненные поля оно тоже включает в массив и выдает их пустыми, понятно, что база начинает ругаться. Тут наверное нужно условие делать, вот только не могу понять как его сделать. Тоесть мне нужно чтобы в поисковый запрос попадали только те поля которые заполненны.

Спустя 8 минут, 25 секунд (15.06.2011 - 18:33) Игорь_Vasinsky написал(а):
вобщето БД ругаться буд если у столбца стоит not null

заменяй пусте значения на NULL (но в БД у столбцов - если стоит NOT NULL - убери)
$var = isset($_POST['input']) ? $_POST['input'] : "NULL";
терь в базу запишеться NULL ;)

Спустя 2 минуты, 36 секунд (15.06.2011 - 18:36) sharki написал(а):
Игорь_Vasinsky
помоему строку "NULL" запишет, а не истинное NULL, если строка, то NULL не будет считаться нулом smile.gif

Спустя 1 минута, 5 секунд (15.06.2011 - 18:37) Игорь_Vasinsky написал(а):
я поправил.

Спустя 49 секунд (15.06.2011 - 18:38) sharki написал(а):
Игорь_Vasinsky
Да оставил бы , только кавычки бы убрал
$var = isset($_POST['input']) ? $_POST['input'] : NULL;

Спустя 1 час, 11 минут, 55 секунд (15.06.2011 - 19:50) Игорь_Vasinsky написал(а):
ну эт подразумевлось wink.gif

Спустя 14 минут, 12 секунд (15.06.2011 - 20:04) Oliver Varnce написал(а):
почему может быть такое, если я использую форму где только один инпут, все ищет клево. а вот в форме со всеми параметрами, запрос формируеться только так:
SELECT * FROM `realty`
и все, хвост не добавляет...

Спустя 10 минут, 18 секунд (15.06.2011 - 20:14) Игорь_Vasinsky написал(а):
запрос формируешь ты, а не php и не html

Давайка внятно изложи ситуацию.

Спустя 14 часов, 7 минут, 37 секунд (16.06.2011 - 10:22) Oliver Varnce написал(а):
вот код поисковика:
$_columns = array('real_code'=>NULL,
'street'=>NULL,
'price1'=>NULL,
'price2'=>NULL,
'rooms1'=>NULL,
'rooms2'=>NULL,
'floor1'=>NULL,
'floor2'=>NULL,
'date1'=>NULL,
'date2'=>NULL);

$query_filter = '';
$query_filter_array = array();
$var = isset($_POST['input']) ? $_POST['input'] : NULL;
// проверяем отправили ли форму
//смотрим что у нас пришло с поста

if ($_POST['submit']){

foreach($_columns as $key=>$value){
if(isset($_POST[$key])){
$query_filter_array[] = '`'.$key. '` LIKE \''.mysql_real_escape_string($_POST[$key]).'\'';
}
}
}



//проверяем было ли что-то заполнено
//если да то разбираем массив

if(!empty($query_filter_array)){
$query_filter = " WHERE ".implode(' AND ', $query_filter_array);
}

$tQuery ='SELECT * FROM `realty`';

$test = $tQuery.$query_filter;
//var_dump($query_filter);

//отладка

echo $test; // проверка сложенного запроса
//echo isset($_POST['$key']) ? $_POST['$key'] : null;//отладка

echo isset($_POST[$key]) ? $_POST[$key] : null;
//echo mysql_errno() . ": " . mysql_error() . "\n";

//собираем весь запрос и выполняем

$result = mysql_query($test) or die('Query failed: ' . mysql_error());
//sif (!$result) print ("failed\n");

$n=mysql_num_rows($result);
$logo = '<img src="/uploads/realty/';


echo '<table>';
while($arr = mysql_fetch_assoc($result))
{
echo '<tr>'
. '<td>'.$logo. $arr['logo'].'">' .'</td>'
. '<td>'. $arr['region'] .'</td>'
. '<td>'. $arr['rooms'] .'</td>'
. '</tr>';
}
echo '</table>';




вот одна форма:
<div class="search"><div id="sForm">
<
h1>Поиск недвижимости по коду</h1>
<
form method="POST" action="/{LANG}/search/" id='frm' name='id_realty'>
<
table cellpadding="0" cellspacing="0" summary="Форма поиска">


<
td class="control">

<
p> </p>
<
div style="position: inherit; float:left; width:500px;">
<
div style="position:inherit; width:340px; float:left;">
<
input name="real_code" type="text" id="real_code" class="right key" />
</
div>
<
div style="position:inherit; float:left; width:160px;">
<
input type="submit" name="submit" class="submit" id="search" value="Поиск" /><input type="button" onclick="resetIT()" name="reset" class="submit right" value="Сброс" />
</
div>
</
div>

<
p> </p>
<
div></div> </td>
</
tr>
<
tr class="ruler">


<
tr class="bottom">
<
td class="l" colspan="2"> </td>

</
tr>
</
table>
</
form>
</
div></div>



вот вторая форма:
<div class="search"><div id="sForm">
<h1>
Поиск недвижимости по коду</h1>
<form
method="POST" action="/ru/search/" id='frm' name='_column'>
<table
cellpadding="0" cellspacing="0" summary="Форма поиска">


<td
class="control">

<p>
 </p>
<div
style="position: inherit; float:left; width:500px;">
<div
style="position:inherit; width:340px; float:left;">
<input
name="real_code" type="text" id="real_code" class="right key" />
</div>
<div
style="position:inherit; float:left; width:160px;">
<input
type="submit" name="submit" class="submit" id="search" value="Поиск" /><input type="button" onclick="resetIT()" name="reset" class="submit right" value="Сброс" />
</div>
</div>



так вот через первую форму все работает(там всего один инпут тайп), а вот через вторую не хочет ничего работать (там два инпута)

Спустя 1 день, 23 минуты, 42 секунды (17.06.2011 - 10:46) Oliver Varnce написал(а):
Тоесть мне нужно чтобы если елемент массива не заполнен чтобы этот AND не включало в запров. Такое вообще реально сделать?

Спустя 1 день, 5 часов, 5 минут, 15 секунд (18.06.2011 - 15:51) Oliver Varnce написал(а):
Народ, подскажите мне такое у меня там в массиве есть параметры типа date1 date 2 тоесть это в условии искать от до как мне реализовать данную функцию?

Спустя 1 день, 20 часов, 58 минут, 45 секунд (20.06.2011 - 12:50) Oliver Varnce написал(а):
Тут есть кто живой?

Спустя 11 минут, 40 секунд (20.06.2011 - 13:01) linker написал(а):
if ($_POST['submit'])
{
foreach($_columns as $key=>$value)
{
if(!isset($_POST[$key]))
continue;
switch($key)
{
case 'date1' :
$query_filter_array[] = '`'.$key. '` >= \''.mysql_real_escape_string($_POST[$key]).'\'';
break;
case 'date2' :
$query_filter_array[] = '`'.$key. '` <= \''.mysql_real_escape_string($_POST[$key]).'\'';
break;
default :
$query_filter_array[] = '`'.$key. '` LIKE \''.mysql_real_escape_string($_POST[$key]).'\'';
}
}
}


Спустя 1 час, 16 минут, 51 секунда (20.06.2011 - 14:18) Oliver Varnce написал(а):
Почемуто не докидывает хвост запроса.

Спустя 3 минуты, 8 секунд (20.06.2011 - 14:21) Oliver Varnce написал(а):
вот мой код, поправьте меня пожалуйста, товарищи знатоки


<?

require_once '_init.php';

//создаем массив полей, которые могут использоваться в запросе
$row = array('real_code'=>NULL,
'street'=>NULL,
'price'=>NULL,
'price2'=>NULL,
'rooms1'=>NULL,
'rooms2'=>NULL,
'floor1'=>NULL,
'floor2'=>NULL,
'date1'=>NULL,
'date2'=>NULL);


$query_filter = '';
$query_filter_array = array();

// проверяем отправили ли форму
//смотрим что у нас пришло с поста

if(isset($_POST['submit']) and strlen(trim($_POST['submit']))!=0)
{
foreach($row as $key=>$value){
if(!empty($_POST[$key])){
continue;
switch($key)
{
case 'date1' :
$query_filter_array[] = '`'.$key. '` >= \''.mysql_real_escape_string($_POST[$key]).'\'';
break;
case 'date2' :
$query_filter_array[] = '`'.$key. '` <= \''.mysql_real_escape_string($_POST[$key]).'\'';
break;
default :
$query_filter_array[] = '`'.$key. '` LIKE \''.mysql_real_escape_string($_POST[$key]).'\'';
}
}
}
}


//проверяем было ли что-то заполнено
//если да то разбираем массив

if(!empty($query_filter_array)){
$query_filter = " WHERE ".implode(' AND ', $query_filter_array);
}

$tQuery ='SELECT * FROM `realty`';

$query = $tQuery.$query_filter;


//собираем весь запрос и выполняем
$result = mysql_query($query) or die('Query failed: ' . mysql_error());
$logo = '<img src="/uploads/realty/';


$href='<a href="/'.$LANG.'/'.$row['id_realty'].'/">';

if ($result)
{
if (mysql_num_rows($result))
{

//$content .= '<a href="/'.$LANG.'/'.$id_realty.'/">';
$content .= '<div class="searchresult">';
$content .= '<table border= 1><th class="rImage"> </th>
<th nowrap="nowrap">Комн.</th>
<th nowrap="nowrap">Адрес</th>
<th nowrap="nowrap">Эт.</th>
<th nowrap="nowrap">Площадь<small>м<sup>2</sup></small></th>
<th class="rPrice" nowrap="nowrap">Ціна, у.о.</th>
<th nowrap="nowrap"> </th>'
;
while ($row = mysql_fetch_assoc($result))
{

$content .= '<tr>'
. '<td>'.$logo. $row['logo'].'">' .'</td>'
.'<td>'. $row['rooms'] .'</td>'
. '<td><b>'. $row['region'].'</b>,<br>' . $row ['street']
.
'<td>'. $row['floor'] .'</td>'
.'<td>'. $row['area'] .'</td>'
.'<td>'. $row['price'] .'</td>'
.'<td>'. '<a href="/'.$LANG.'/realty/'.$row['id_realty'].'/">Подробнее</a>' .'</td>'
. '</tr><tr> </tr>';
}
$content .= '</table>';
$content .= '</div>';
$content .= '</a>';
} else $content .= 'Ничего не найдено';
?>

Спустя 47 минут, 42 секунды (20.06.2011 - 15:09) linker написал(а):
Блин, не надо коверкать то, что я написал. Повторю свой код
if ($_POST['submit'])
{
foreach($_columns as $key=>$value)
{
if(!isset($_POST[$key]))
continue;
switch($key)
{
case 'date1' :
$query_filter_array[] = '`'.$key. '` >= \''.mysql_real_escape_string($_POST[$key]).'\'';
break;
case 'date2' :
$query_filter_array[] = '`'.$key. '` <= \''.mysql_real_escape_string($_POST[$key]).'\'';
break;
default :
$query_filter_array[] = '`'.$key. '` LIKE \''.mysql_real_escape_string($_POST[$key]).'\'';
}
}
}

Спустя 23 минуты, 16 секунд (20.06.2011 - 15:32) Oliver Varnce написал(а):
мне вот это нужно
if(!empty($_POST[$key])){
чтобы не добавляло в запрос пустые ключи

Спустя 1 минута, 51 секунда (20.06.2011 - 15:34) linker написал(а):
Согласно этому
if(!isset($_POST[$key]))
continue;
в запрос будут добавляться только те ключи, значения которых присутствуют в $_POST.

Спустя 5 минут, 11 секунд (20.06.2011 - 15:39) Oliver Varnce написал(а):
У меня почемуто добавляются все ключи. Ковыряю ковыряю уже две недели и все равно добавляются. Щас будем еще ковырять)))) спасибо)

вот что оно формирует((
SELECT * FROM `realty` WHERE `real_code` LIKE '' AND `street` LIKE ''

Спустя 8 минут, 11 секунд (20.06.2011 - 15:48) linker написал(а):
Наличие и пустота - разные вещи. Тогда так
if(empty($_POST[$key]))
continue;

Спустя 11 минут, 18 секунд (20.06.2011 - 15:59) Oliver Varnce написал(а):
ОУУУУ, теперь формирует как надо))) большое спасибо) но не могу разобраться с ошибкой которую выдает после запроса вот собсно
Query failed: Unknown column 'price1' in 'where clause'
я понимаю что оно не видит колонку прайс1 потому что ее там нету. есть колонка price
тоесть формировать должно так
price >=1000 <= 2000

Спустя 3 минуты, 57 секунд (20.06.2011 - 16:03) linker написал(а):
Еще для более параноидального режима
if(!array_key_exists($key, $_POST) || empty($_POST[$key]))
continue;
приведи в соответствие все поля, чтобы не было расхождения в именованиях.

Спустя 3 минуты, 18 секунд (20.06.2011 - 16:06) Oliver Varnce написал(а):
Ничего не изменилось(((
if ($_POST['submit'])
{
foreach($row as $key=>$value)
{
if(!array_key_exists($key, $_POST) || empty($_POST[$key]))
continue;
switch($key)
{
case 'price1' :
$query_filter_array[] = '`'.$key. '` >= \''.mysql_real_escape_string($_POST[$key]).'\'';
break;
case 'price2' :
$query_filter_array[] = '`'.$key. '` <= \''.mysql_real_escape_string($_POST[$key]).'\'';
break;
default :
$query_filter_array[] = '`'.$key. '` LIKE \''.mysql_real_escape_string($_POST[$key]).'\'';
}
}
}


вот сформированный запрос:
SELECT * FROM `realty` WHERE `street` LIKE 'Попова' AND `price1` >= '1000' AND `price2` <= '65000'Query failed: Unknown column 'price1' in 'where clause'

Спустя 5 часов, 56 минут, 3 секунды (20.06.2011 - 22:02) linker написал(а):
Колонку в таблице переобзови как price1 и всё.

Спустя 11 часов, 3 минуты, 45 секунд (21.06.2011 - 09:06) Oliver Varnce написал(а):
Ну так колонки нету price2.....

P.S.
Я дико извиняюсь за свою тупость..

Спустя 26 минут, 53 секунды (21.06.2011 - 09:33) linker написал(а):
Если нету, то и в условии не должно быть их. Если нужно условие, то нужно добавлять колонки.

Спустя 1 час, 53 минуты, 12 секунд (21.06.2011 - 11:26) Oliver Varnce написал(а):
Ну тогда сделаем по другому, при внесении данных в в базу, одно и то же значение будет добавляться две колонки в price1 price2, спасибо за удельные советы!

Спустя 4 часа, 17 минут, 58 секунд (21.06.2011 - 15:44) Oliver Varnce написал(а):
Ошибочка какаято получается, запрос работает отлично. В базе создано две коллонки price1 и price2 формируется такой запрос
SELECT * FROM `realty` WHERE `price1` >= '1000' AND `price2` <= '100000'


возвращается ноль, вернее вот что пишет в базе:
MySQL returned an empty result set (i.e. zero rows).

хотя значения в этих полях есть в таком диапазоне

Спустя 41 минута, 5 секунд (21.06.2011 - 16:25) linker написал(а):
А типы этих полей какие?

Спустя 5 часов, 32 минуты, 36 секунд (21.06.2011 - 21:58) Oliver Varnce написал(а):
text

Спустя 26 минут, 45 секунд (21.06.2011 - 22:24) inpost написал(а):
Oliver Varnce
Почему не INT? Ты же числа сравниваешь.

Спустя 10 часов, 21 минута, 25 секунд (22.06.2011 - 08:46) linker написал(а):
Oliver Varnce
Inpost правильно тебе вопрос задал, я присоединяюсь к нему.

Спустя 1 час, 32 минуты, 40 секунд (22.06.2011 - 10:18) Oliver Varnce написал(а):
Юхуууу, домучал я этот код) Большое спасибо, дядям мудрецам за помощь!


_____________
мой хостинг - GlobalNET.com.ua
Быстрый ответ:

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