такая проблемка
MySQL пишет что запрос пуст was empty, правильно ли я его формирую?
я так обрабатываю все данные из формы переданные методом GET,
в данном скрипте вывода нет просто формируется динамически запрос к БД
если не трудно помогите разобраться, нужно чтобы в запрос добавлялись операторы <= => в зависимости от того какие данные были получены из формы
нжно чтобы запрос был не пуст
if(isset($_POST['search'])) // если кнопка нажата
{
// Пришедшие данные
$f_room0 = isset($_GET['f_room0']) ? $_GET['f_room0'] : 0;
$f_room1 = isset($_GET['f_room1']) ? $_GET['f_room1'] : 0;
$f_room2 = isset($_GET['f_room2']) ? $_GET['f_room2'] : 0;
$f_room3 = isset($_GET['f_room3']) ? $_GET['f_room3'] : 0;
$rayon = isset($_GET['rayon']) ? $_GET['rayon'] : 0;
$ftype = isset($_GET['ftype']) ? $_GET['ftype'] : 0;
$material = isset($_GET['material']) ? $_GET['material'] : 0;
$quorter = isset($_GET['quorter']) ? $_GET['quorter'] : 0;
$minamount = isset($_GET['minamount']) ? $_GET['minamount'] : 0;
$maxamount= isset($_GET['maxamount']) ? $_GET['maxamount'] : 0;
$minlamount = isset($_GET['minlamount']) ? $_GET['minlamount'] : 0;
$maxlamount= isset($_GET['maxlamount']) ? $_GET['maxlamount'] : 0;
$minprice = isset($_GET['minprice']) ? $_GET['minprice'] : 0;
$maxprice= isset($_GET['maxprice']) ? $_GET['maxprice'] : 0;
// создаем ассоциативный массив
$array = array(
"`komnat`" => $f_room0,
"`komnat`" => $f_room1,
"`komnat`" => $f_room2,
"`komnat`" => $f_room3,
"`rayon`" => $area,
"`planirovka`" => $ftype,
"`material_sten`" => $material,
"`kvartal`" => $quorter,
"`S`" => $minamount,
"`S`" => $maxamount,
"`S_zil`" => $minlamount,
"`S_zil`" => $maxlamount,
"`cena`" => $minprice,
"`cena`" => $maxprice,
);
// Начальная строчка запроса
$sql = "SELECT * FROM `novostr`";
//Создаем пустой масив для условия WHERE
$sql_where = array();
//Перебираем массив
foreach($array as $key => $value)
{
// Если есть 0 в запросе отсеиваем его
if(!empty($value))
if($array[$key]==$minamount){
$sql_where[] = $key." >= ".$value;
if(count($sql_where) > 0)
{
$sql .=" WHERE ";
}
//Формируем окончательную строку запроса
$sql.=" ".implode(" AND ", $sql_where);
}
elseif($array[$key]==$maxamount){
$sql_where[] = $key." <= ".$value;
if(count($sql_where) > 0)
{
$sql .=" WHERE ";
}
//Формируем окончательную строку запроса
$sql.=" ".implode(" AND ", $sql_where);
}
elseif($array[$key]==$minlamount){
$sql_where[] = $key." <= ".$value;
if(count($sql_where) > 0)
{
$sql .=" WHERE ";
}
//Формируем окончательную строку запроса
$sql.=" ".implode(" AND ", $sql_where);
}
elseif($array[$key]==$maxlamount){
$sql_where[] = $key." <= ".$value;
if(count($sql_where) > 0)
{
$sql .=" WHERE ";
}
//Формируем окончательную строку запроса
$sql.=" ".implode(" AND ", $sql_where);
}
elseif($array[$key]==$minprice){
$sql_where[] = $key." <= ".$value;
if(count($sql_where) > 0)
{
$sql .=" WHERE ";
}
//Формируем окончательную строку запроса
$sql.=" ".implode(" AND ", $sql_where);
}
elseif($array[$key]==$maxprice){
$sql_where[] = $key." <= ".$value;
if(count($sql_where) > 0)
{
$sql .=" WHERE ";
}
//Формируем окончательную строку запроса
$sql.=" ".implode(" AND ", $sql_where);
}
else{
$sql_where[] = $key." = ".$value;
if(count($sql_where) > 0)
{
$sql .=" WHERE ";
}
//Формируем окончательную строку запроса
$sql.=" ".implode(" AND ", $sql_where);
}
}
}
Спустя 6 минут, 46 секунд (15.06.2011 - 14:20) waldicom написал(а):
В конце вывести $sql и делов-то ...
Спустя 8 минут, 10 секунд (15.06.2011 - 14:28) Aleks-prog написал(а):
Это без вывода, когда я вывожу в форму то мне пишет
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in Z:\home\localhost\www\agency\index.php on line 551
Query was empty
Типа запрос пустой, не прошел,
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in Z:\home\localhost\www\agency\index.php on line 551
Query was empty
Типа запрос пустой, не прошел,
Спустя 1 минута, 36 секунд (15.06.2011 - 14:29) Aleks-prog написал(а):
Нужно правильно сформировать запрос в зависимости от отго что я выбрал на форме
Спустя 24 минуты, 1 секунда (15.06.2011 - 14:53) Aleks-prog написал(а):
В первой строке забыл GET прописать)))
но вот проблемка - он выводит данные но все, не ставит ограничения которые я наложил с помощью формы... с этими if elseif внизу кода может я намудрил,
выдал ошибку вот сейчас Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in Z:\home\localhost\www\agency\index.php on line 551
Unknown column 'Бетон' in 'where clause'
помогите плиз
но вот проблемка - он выводит данные но все, не ставит ограничения которые я наложил с помощью формы... с этими if elseif внизу кода может я намудрил,
выдал ошибку вот сейчас Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in Z:\home\localhost\www\agency\index.php on line 551
Unknown column 'Бетон' in 'where clause'
помогите плиз
Спустя 1 час, 1 минута, 1 секунда (15.06.2011 - 15:54) m4a1fox написал(а):
Aleks-prog
А запросик у тебя крутой! Даже с первого взгляда не понять что там происходит!
А запросик у тебя крутой! Даже с первого взгляда не понять что там происходит!
Спустя 13 минут, 35 секунд (15.06.2011 - 16:08) Aleks-prog написал(а):
Да там всего то происходит после таблицы добавляется слово WHERE, а дальше происходит вставка условий вида "переменная=значение" и в качестве разделителя используется используется AND, только чтото не выходит прравильно реализовать уже запарился если честно
Спустя 4 минуты, 57 секунд (15.06.2011 - 16:13) kristall написал(а):
Много одинаковых ключей в ассоциативном массиве, в результате в массив занесется только последний из них.
Спустя 21 минута, 47 секунд (15.06.2011 - 16:35) Aleks-prog написал(а):
А как лучше сделать, мне же надо указать на форме от какого то значения до другого, например укажите цену - от "значение1" до "значение2", но поле то у меня одно
Сейчас я подробно поясню по параметрам, я вообще честно говоря запарился, уже голова болит даже)
форма выглядит там
а насчет индексов я добавил все это в ассоциативный массив, а как по-другому, ведь надо чтобы значения были в массиве, иначе что он будет выводить в запросе, мне все эти условия нужны, ты еще правильно заметил про условия которое формируется в запросе, макспрайс и минпрайс
где есть мин и макс это все поля ввода с макс и мин значениями, а rayon,quorter ftype, material, - это селекты из которых выбираются район и материал, квартал и планировка определенный f_room'ы это чекбоксы которые либо нажаты либо нет, если нажат то передается значение 1
Сейчас я подробно поясню по параметрам, я вообще честно говоря запарился, уже голова болит даже)
форма выглядит там
<br /><form id="findForm" method="GET">
<div id="field"><div id="fieldtitle">Комнат:</div>
<input id="inputCheck" type="checkbox" name="f_room0" value="1">1
<input id="inputCheck" type="checkbox" name="f_room1" value="1">2
<input id="inputCheck" type="checkbox" name="f_room2" value="1">3
<input id="inputCheck" type="checkbox" name="f_room3" value="1">более 3
</div><div id="field"><div id="fieldtitle">Район:</div>
<select id="rayon_novostr" name="area"><option value=""></option>
<option value="Автозаводской">Автозаводской</option><option value="Жигморе">Жигморе
</option><option value="Жигулевск">Жигулевск</option>
<option value="Комсомольский">Комсомольский</option>
<option value="Поволжский">Поволжский</option>
<option value="Портпоселок">Портпоселок</option>
<option value="Ставропольский">Ставропольский</option>
<option value="Сызранский">Сызранский</option>
<option value="Федоровка">Федоровка</option>
<option value="Центральный">Центральный</option>
<option value="Шигонский">Шигонский</option>
<option value="Шлюзовой">Шлюзовой</option></select></div><div id="field"><div id="fieldtitle">Планировка:</div>
<select id="planirovka_novostr" name="ftype"><option value="">
</option><option value="8-ми квартирная">8-ми квартирная</option><option value="Барская">Барская</option><option value="Брежневка">Брежневка</option><option value="Волга (серия)">Волга (серия)</option><option value="Гостинич.тип">Гостинич.тип</option><option value="Изолированная">Изолированная </option>
<option value="Ленинградская">Ленинградская</option><option value="Макаровская">Макаровская</option><option value="Македонская">
Македонская</option><option value="Монолитная">Монолитная</option><option value="Московская">Московская</option><option value="Олимпийская">Олимпийская</option>
<option value="Самарская">Самарская</option><option value="Самолет">Самолет</option><option value="Ст. Московская">Ст. Московская</option><option value="Сталинская">Сталинская</option>
<option value="Ташкентская">Ташкентская</option><option value="Трамвай">Трамвай</option><option value="Трапеция">Трапеция</option><option value="Улучшенная">Улучшенная</option><option value="Ульяновская">Ульяновская</option><option value="Хрущевка">Хрущевка</option><option value="Экспериментальная">Экспериментальная</option><option value="Элитная">Элитная</option>
<option value="Югославская">Югославская</option></select></div><div id="field"><div id="fieldtitle">Материал стен:</div> <select id="material_novostr" name="material"><option value=""></option><option value="Бетон">Бетон</option><option value="Блочные">Блочные</option><option value="Дерево">Дерево</option><option value="Камень">Камень</option>
<option value="Каркасный">Каркасный</option><option value="Керамз.бетон">Керамз.бетон</option><option value="Кирпич">Кирпич</option><option value="Кирпич+дерево">Кирпич+дерево</option><option value="Литой">Литой</option><option value="Монолит">Монолит</option><option value="Панель">Панель</option><option value="Силикатный кирпич">Силикатный кирпич</option><option value="Шлакобетон">Шлакобетон</option><option value="Щитовой">Щитовой</option>
</select></div><div id="field"><div id="fieldtitle">Квартал:</div> <select id="inputField" name="quorter"><option value=""></option><option value="1">1</option><option value="2">2</option><option value="3А">3А</option><option value="3Б">3Б</option><option value="3">3</option><option value="4">4</option><option value="5">5</option><option value="6">6</option><option value="7">7</option>
<option value="8">8</option><option value="9">9</option><option value="10">10</option>
<option value="11">11</option><option value="12">12</option><option value="13">13</option><option value="14">14</option><option value="15">15</option>
<option value="16">16</option><option value="17">17</option><option value="18">18
</option><option value="19">19</option><option value="20">20</option><option value="21">21</option></select></div><div id="field"><div id="fieldtitle">Общая площадь:</div> от <input id="inputField" type="text" name="minamount" value="" maxlength="10"> до <input id="inputField" type="text" name="maxamount" value="" maxlength="10"></div><div id="field"><div id="fieldtitle">Жилая площадь:
</div> от <input id="inputField" type="text" name="minlamount" value="" maxlength="10"> до <input id="inputField" type="text" name="maxlamount" value="" maxlength="10"></div><div id="field"><div id="fieldtitle">Цена:</div> от
<input id="inputField" type="text" name="minprice" value="" maxlength="10"> до <input id="inputField" type="text" name="maxprice" value="" maxlength="10"></div><input type="hidden" name="type_of_realty" value="new_building">
<input type="hidden" name="search" value="find"><input class="buttonSend" type="submit" value="Найти"></form>
$f_room0 = isset($_GET['f_room0']) ? $_GET['f_room0'] : 0;// чекбокс на форме
$f_room1 = isset($_GET['f_room1']) ? $_GET['f_room1'] : 0;
$f_room2 = isset($_GET['f_room2']) ? $_GET['f_room2'] : 0;
$f_room3 = isset($_GET['f_room3']) ? $_GET['f_room3'] : 0;
$rayon = isset($_GET['rayon']) ? $_GET['rayon'] : 0;
$ftype = isset($_GET['ftype']) ? $_GET['ftype'] : 0;
$material = isset($_GET['material']) ? $_GET['material'] : 0;
$quorter = isset($_GET['quorter']) ? $_GET['quorter'] : 0;
$minamount = isset($_GET['minamount']) ? $_GET['minamount'] : 0;
$maxamount= isset($_GET['maxamount']) ? $_GET['maxamount'] : 0;
$minlamount = isset($_GET['minlamount']) ? $_GET['minlamount'] : 0;
$maxlamount= isset($_GET['maxlamount']) ? $_GET['maxlamount'] : 0;
$minprice = isset($_GET['minprice']) ? $_GET['minprice'] : 0;
$maxprice= isset($_GET['maxprice']) ? $_GET['maxprice'] : 0;
а насчет индексов я добавил все это в ассоциативный массив, а как по-другому, ведь надо чтобы значения были в массиве, иначе что он будет выводить в запросе, мне все эти условия нужны, ты еще правильно заметил про условия которое формируется в запросе, макспрайс и минпрайс
где есть мин и макс это все поля ввода с макс и мин значениями, а rayon,quorter ftype, material, - это селекты из которых выбираются район и материал, квартал и планировка определенный f_room'ы это чекбоксы которые либо нажаты либо нет, если нажат то передается значение 1
Спустя 15 минут, 28 секунд (15.06.2011 - 16:50) Invis1ble написал(а):
Дампани после всех преобразований конечный запрос, чтобы увидеть что не так ;)
echo '<pre>'; print_r($sql); echo '</pre>';
Спустя 7 минут, 20 секунд (15.06.2011 - 16:58) Aleks-prog написал(а):
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in Z:\home\localhost\www\agency\index.php on line 553
Unknown column 'Барская' in 'where clause'
Unknown column 'Барская' in 'where clause'
Спустя 4 минуты, 6 секунд (15.06.2011 - 17:02) kristall написал(а):
Попробуй оставить только первую из строк $sql .=" WHERE "; и только последнюю из $sql.=" ".implode(" AND ", $sql_where); Причем вынеси их из foreach. WHERE перед форичем, а имплод -- сразу за ним.
Спустя 1 минута, 22 секунды (15.06.2011 - 17:03) Aleks-prog написал(а):
дамп
SELECT * FROM novostr WHERE planirovka = Барская
SELECT * FROM novostr WHERE planirovka = Барская
Спустя 2 минуты, 39 секунд (15.06.2011 - 17:06) Invis1ble написал(а):
Aleks-prog
Цитата |
дамп SELECT * FROM novostr WHERE planirovka = Барская |
кавычек не наблюдается... Поле planirovka - text / varchar ? Кавычки нужны.
Спустя 3 минуты, 58 секунд (15.06.2011 - 17:10) Aleks-prog написал(а):
вот насчет кавычек это целая проблема, дело в том, что я формирую запрос не только из строк а из чисел в основном, а массив делает общий вывод для всех элементов
вот еще протестиол
сейчас в форме выбрал район - автозаводский, площадь <=15000 ну просто
дамп выдал
SELECT * FROM novostr WHERE S <= 15000 и все записи без ошибок
вот еще протестиол
сейчас в форме выбрал район - автозаводский, площадь <=15000 ну просто
дамп выдал
SELECT * FROM novostr WHERE S <= 15000 и все записи без ошибок
Спустя 8 минут, 51 секунда (15.06.2011 - 17:19) Aleks-prog написал(а):
$sql_where[] = $key." <= ".$value;
вот это выражение которое формирует условие в запросе, $value для чисел и для строк одновременно
да planirovka VARCHAR
Спустя 21 минута, 51 секунда (15.06.2011 - 17:40) Aleks-prog написал(а):
вставил кавычки
дамп
SELECT * FROM novostr WHERE S <= '14'
и запрос работает
только проблема с чекбоксами, когда выбираю по комнатам 1, 2, 3, а вот более 3 проблема, где лучше прописать условие >3, так как у меня там значение 3 из чек бокса приходит
дамп
SELECT * FROM novostr WHERE S <= '14'
и запрос работает
только проблема с чекбоксами, когда выбираю по комнатам 1, 2, 3, а вот более 3 проблема, где лучше прописать условие >3, так как у меня там значение 3 из чек бокса приходит
Спустя 5 минут, 54 секунды (15.06.2011 - 17:46) Aleks-prog написал(а):
вото это прикол
дамп
SELECT * FROM novostr WHERE rayon = 'Автозаводской' WHERE rayon = 'Автозаводской' AND kvartal = '3'
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in Z:\home\localhost\www\agency\index.php on line 553
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 'WHERE rayon = 'Автозаводской' AND kvartal = '3'' at line 1
дамп
SELECT * FROM novostr WHERE rayon = 'Автозаводской' WHERE rayon = 'Автозаводской' AND kvartal = '3'
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in Z:\home\localhost\www\agency\index.php on line 553
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 'WHERE rayon = 'Автозаводской' AND kvartal = '3'' at line 1
Спустя 2 минуты, 51 секунда (15.06.2011 - 17:49) Invis1ble написал(а):
Беда-беда... Я пригляделся к твоему коду повнимательней и вижу кучу ошибок. Вот некоторые из них:
1. когда формируешь массив $array у тебя дублируются имена ключей, поэтому остаются только поляедние из них. Тебе уже об этом писали.
2. Есть ненужные проверки, например:
в данном случае проверка if(count($sql_where) > 0) не нужна, т.к. условие всегда будет true..
3. для чекбоксов лучше использовать имена типа f_room[], тогда проще потом с ними работать.
Вобщем много всякого разного у тебя в коде, разбираться в причине ошибок быссмысленно, пока ты не устранишь те недочеты, которые я привел. Да, и кстати, строковые значения в запросе должны быть все-таки в кавычках. Так что исправляй.
1. когда формируешь массив $array у тебя дублируются имена ключей, поэтому остаются только поляедние из них. Тебе уже об этом писали.
2. Есть ненужные проверки, например:
// Если есть 0 в запросе отсеиваем его
if(!empty($value))
if($array[$key]==$minamount){
$sql_where[] = $key." >= ".$value;
if(count($sql_where) > 0)
{
$sql .=" WHERE ";
}
в данном случае проверка if(count($sql_where) > 0) не нужна, т.к. условие всегда будет true..
3. для чекбоксов лучше использовать имена типа f_room[], тогда проще потом с ними работать.
Вобщем много всякого разного у тебя в коде, разбираться в причине ошибок быссмысленно, пока ты не устранишь те недочеты, которые я привел. Да, и кстати, строковые значения в запросе должны быть все-таки в кавычках. Так что исправляй.
Спустя 56 минут, 35 секунд (15.06.2011 - 18:46) Aleks-prog написал(а):
а как лучше сделать minprice и maxprice, у меня в БД это поле под названием cena, а не 2 поля, если я уберу повторяющееся поле и оставлю соответствие при создании массива "cena"=>"minprice", то мне не куда будет записать значение maxprice, а создавать для этого новое поле в таблице...или думаете создать новое поле? другого выхода нет?
Спустя 3 часа, 42 минуты, 22 секунды (15.06.2011 - 22:28) kristall написал(а):
array('mincena'=>$minprice, 'maxcena'=>$maxprice, 'room0' =>$f_room0, ...)
А запрос должен выглядеть примерно так:
"SELECT * FROM `novostr` WHERE `cena` BETWEEN {$mincena} AND {$maxcena} AND `komnat` IN ({$room0}, {$room1},...)"
А запрос должен выглядеть примерно так:
"SELECT * FROM `novostr` WHERE `cena` BETWEEN {$mincena} AND {$maxcena} AND `komnat` IN ({$room0}, {$room1},...)"
Спустя 9 часов, 18 минут, 20 секунд (16.06.2011 - 07:46) Aleks-prog написал(а):
спс Кристал, совсем вчера забыл про BETWEEN, все искал MYSQL функцию промежутка между значениями, мысль тоже такая была, но както совсем забыл про эту, еще раз спс, ...
Спустя 1 час, 4 минуты, 36 секунд (16.06.2011 - 08:51) Aleks-prog написал(а):
Мдаа. толко mincena такого поля у меня нет, а в запрос вставляется именно эита строка
Спустя 52 минуты, 47 секунд (16.06.2011 - 09:44) Aleks-prog написал(а):
вот оно решение, путем перебора всех параметров и затем добавления их в массив, может кому понадобаиться
if(isset($_GET['search'])) // если кнопка нажата
{
$where=array();
$o=array();
if(isset($_GET['f_room0']))
{
$o[]="komnat='1'";
}
if(isset($_GET['f_room1']))
{
$o[]="komnat='2'";
}
if(isset($_GET['f_room2']))
{
$o[]="komnat='3'";
}
if(isset($_GET['f_room3']))
{
$o[]="komnat>'3'";
}
if(sizeof($o)>0)//если массив есть
{
$where[]='('.implode(' AND ',$o).")";
}
if(isset($_GET['area']) and $_GET['area']!='')
{
$rayon=$_GET['area'];
$where[]="(rayon='$rayon')";
}
if(isset($_GET['ftype']) and $_GET['ftype']!='')
{
$ftype=$_GET['ftype'];
$where[]="(planirovka='$ftype')";
}
if(isset($_GET['material']) and $_GET['material']!='')
{
$material=$_GET['material'];
$where[]="(material_sten='$material')";
}
if(isset($_GET['quorter']) and $_GET['quorter']!='')
{
$quorter=$_GET['quorter'];
$where[]="(kvartal='$quorter')";
}
$o=array();
if(isset($_GET['minamount']) and $_GET['minamount']!='')
{
$v=floatval($_GET['minamount']);
$o[]="s>='$v'";
}
if(isset($_GET['maxamount']) and $_GET['maxamount']!='')
{
$v=floatval($_GET['maxamount']);
$o[]="s<='$v'";
}
if(sizeof($o)>0)
{
$where[]='('.implode(' and ',$o).")";
}
$o=array();
if(isset($_GET['minlamount']) and $_GET['minlamount']!='')
{
$v=floatval($_GET['minlamount']);
$o[]="s_zil>='$v'";
}
if(isset($_GET['maxlamount']) and $_GET['maxlamount']!='')
{
$v=floatval($_GET['maxlamount']);
$o[]="s_zil<='$v'";
}
if(sizeof($o)>0)
{
$where[]='('.implode(' and ',$o).")";
}
$o=array();
if(isset($_GET['minprice']) and $_GET['minprice']!='')
{
$v=floatval($_GET['minprice']);
$o[]="cena>='$v'";
}
if(isset($_GET['maxprice']) and $_GET['maxprice']!='')
{
$v=floatval($_GET['maxprice']);
$o[]="cena<='$v'";
}
if(sizeof($o)>0)
{
$where[]='('.implode(' and ',$o).")";
}
if(sizeof($where)>0)
{
$cond='where '.implode(' and ',$where);
}
else
{
$cond='';
}
$sql = "SELECT * FROM `novostr` $cond";
}