[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: IN и Mysql
umnik90
Чего он хочет от меня?

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 '3,4) AND`orient` LIKE '%' AND `price` >= 0 AND `price` <= 1.0E+20' at line 1
SELECT `ad_index`, `ad_date`, `ad_title`, `ad_html`, `district`, `orient`, `phones`, `total_space`, `floors_num`, `state`, `material`, `house_type`, CAST(`price` AS SIGNED) as `price`, `room_count`, `living_space`, `kitchen_space`, `planning`, `floor`, `toilet`, `balcony`, `loggia` FROM zhilcom_class_advert_flat_sale WHERE`district` IN (1,2,3,4,5,6,7,8,9,10,11) AND `room_count` IN (1,,3,4) AND`orient` LIKE '%' AND `price` >= 0 AND `price` <= 1.0E+20


вроде бы верно все, если указаны все значния IN (1,2,3,4) - тогда работает



Спустя 11 минут, 21 секунда (4.08.2010 - 22:35) linker написал(а):
`room_count` IN (1,,3,4)
А чего такой красивый IN 1,,3?

Спустя 1 час, 6 минут, 54 секунды (4.08.2010 - 23:42) umnik90 написал(а):
linker
я отправляю выбранные в мультиселекте, в массиве.

 if (isset($district) && isset($room_count))
{
$d=implode(",",$district);
$r=implode(",",$room_count);
$sql .= "`district` IN (".$d.") AND `room_count` IN (".$r.") AND";

}

Спустя 7 часов, 17 минут, 42 секунды (5.08.2010 - 06:59) Michael написал(а):
$r=implode(",",array_filter($room_count, 'emptyfilter'));

function emptyfilter($val){
return (bool) $val;
}


тоже самое для $d.

Спустя 3 часа, 30 минут, 59 секунд (5.08.2010 - 10:30) linker написал(а):
Да, да, где-то в массиве есть элемент с пустым значением, фильтровать или искать ошибку выше по коду.

Спустя 3 часа, 53 минуты, 3 секунды (5.08.2010 - 14:23) umnik90 написал(а):
Michael
спасибо, работает.

а что мы сделали?

Спустя 11 минут, 12 секунд (5.08.2010 - 14:35) linker написал(а):
Отфильтровали массив от элементов с пустыми значениями, а потом слили полученный массив в строку вида: '1,2,3,4,5'
Но, если по-уму делать, то смотрите в то место, где у вас создается этот массив, т.е. уже на этой стадии там нужно отбрасывать пустые значения. Но это по-уму, если по-лени, то можно забить.

Спустя 19 минут, 52 секунды (5.08.2010 - 14:55) umnik90 написал(а):
linker
понял, спасибо.

хочется по уму)
я так понимаю сейчас у меня возникает трудность именно поэтому.

если не выбрано не одно значение, то в массив почему-то что-то поступает.
с обычным мультиселектом (а это jquery) было иначе: я проверял на существование массив (isset) и если не существовал убирал строку
$sql .= "`district` IN (".$d.") AND `room_count` IN (".$r.") AND"; 
из запроса... сейчас массив все время существует и даже не пустой (проверка на empty) не помогает

Спустя 11 минут, 5 секунд (5.08.2010 - 15:06) Michael написал(а):
Цитата
сейчас массив все время существует и даже не пустой (проверка на empty) не помогает

код показывай. Что приходит и как из этого формируются $room_count и т.д.


Спустя 7 минут, 8 секунд (5.08.2010 - 15:13) umnik90 написал(а):
Michael

у нас есть два мультиселекта:
<div class="select_wrap"  multiple="multiple">

<select
name="room_count[]" class="select_field" multiple="multiple">

<option
value="0">Комнаты </option>

<option
value="1">1-комнат</option>

<option
value="2">2-комнат</option>

<option
value="3">3-комнат</option>

<option
value="4">4-комнат и более </option>

</select> </div> </td>

<td
width="147" rowspan="3" valign="top">
<div
class="select_wrap" multiple="multiple">
<select
name="district[]" multiple="multiple">

<option
value="0">Районы</option>

<option
value="1">Ворошиловский</option>

<option
value="2">Калининский</option>

<option
value="3">Киевский</option>

<option
value="4">Ленинский</option>

<option
value="5">Куйбышевский</option>

<option
value="6">Кировский</option>

<option
value="7">Будёновский</option>

<option
value="8">Пролетарский</option>

<option
value="9">Петровский</option>

<option
value="10">Межгород</option>

<option
value="11">Макеевка</option>

</select> </div>


после отправки формы получаем их:

$district = $_POST['district'];
$room_count = $_POST['room_count'];


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

if (!empty($district)  && !empty($room_count) )

{
$d=implode(",",array_filter($district, 'emptyfilter'));
$r=implode(",",array_filter($room_count, 'emptyfilter'));
$sql .= "`district` IN (".$d.") AND `room_count` IN (".$r.") AND";

}

else if (empty($district) && !empty($room_count) )
{
$r=implode(",",array_filter($room_count, 'emptyfilter'));
$sql .= "`room_count` IN (".$r.") AND";

}

else if (!empty($district) && empty($room_count) )
{
$d=implode(",",array_filter($district, 'emptyfilter'));
$sql .= "`district` IN (".$r.") AND";

}

else if (empty($district) && empty($room_count) )
{
$sql .= " ";

}

Спустя 28 минут, 9 секунд (5.08.2010 - 15:41) Michael написал(а):
А ну ка так:
$room_count = (isset($_POST['room_count'])) ? $_POST['room_count'] : null;


для $district также.

Спустя 6 минут, 14 секунд (5.08.2010 - 15:47) linker написал(а):
Смотри в сторону count($array). Пример
if (count($array) == 0) $sql .= ' ';
Но ни empty, ни count не скажут тебе ничего про пустые элементы.

Спустя 10 минут, 54 секунды (5.08.2010 - 15:58) umnik90 написал(а):
linker
Michael


count натолкнул в нужную сторону, даже если ничего не выбрано форма отправляет массив из всех элементов, сейчас попробую проверить на пустоту каждый элемент

Спустя 19 минут, 26 секунд (5.08.2010 - 16:17) umnik90 написал(а):
if ( $district[0] != NULL && $district[1] != NULL && $district[2] != NULL && $district[3] != NULL && $district[4] != NULL && $district[5] != NULL  && $district[6] != NULL && $district[7] != NULL  && $district[8] != NULL  && $district[9] != NULL  && $district[10] != NULL && $room_count[0] != NULL && $room_count[1] != NULL && $room_count[2] != NULL && $room_count[3] != NULL ) 

не пошло
и empty тоже не пошло(

Спустя 8 минут, 25 секунд (5.08.2010 - 16:26) umnik90 написал(а):
получилось так

if ( $district[0] != 1 && $district[1] != 2 && $district[2] != 3 && $district[3] != 4 && $district[4] != 5 && $district[5] != 6  && $district[6] != 7 && $district[7] != 8  && $district[8] != 9  && $district[9] != 10  && $district[10] != 11 && $room_count[0] != 1 && $room_count[1] != 2 && $room_count[2] != 3 && $room_count[3] != 4 ) 

{


}


else if ($room_count[0] != 1 && $room_count[1] != 2 && $room_count[2] != 3 && $room_count[3] != 4 )

{
$d=implode(",",array_filter($district, 'emptyfilter'));
$sql .= "`district` IN (".$d.")";

}

else if ($district[0] != 1 && $district[1] != 2 && $district[2] != 3 && $district[3] != 4 && $district[4] != 5 && $district[5] != 6 && $district[6] != 7 && $district[7] != 8 && $district[8] != 9 && $district[9] != 10 && $district[10] != 11)

{

$r=implode(",",array_filter($room_count, 'emptyfilter'));
$sql .= "`room_count` IN (".$d.")";

}

else

{
$d=implode(",",array_filter($district, 'emptyfilter'));
$r=implode(",",array_filter($room_count, 'emptyfilter'));
$sql .= "`district` IN (".$d.") AND `room_count` IN (".$r.") AND";

}


но вариант, я так понимаю не лучший.

Спустя 4 минуты, 34 секунды (5.08.2010 - 16:30) Michael написал(а):
Напиши уже нам что приходит:
echo '<hr><pre>' . print_r($room_count, true) . print_r($district, true) .'</pre><hr>';

если ничего не выбрать.
Я у себя проверяю - ничего не приходит.

Спустя 1 час, 31 минута, 28 секунд (5.08.2010 - 18:02) umnik90 написал(а):
Michael
ну собственно вот http://slon.dn.ua/zhilcom/zhilcom_in.php

возвращает все, но...

Спустя 5 минут, 27 секунд (5.08.2010 - 18:07) umnik90 написал(а):
Array
(
[0] =>
[1] =>
[2] =>
[3] =>
)
Array
(
[0] =>
[1] =>
[2] =>
[3] =>
[4] =>
[5] =>
[6] =>
[7] =>
[8] =>
[9] =>
[10] =>
)

Спустя 14 часов, 1 минута, 28 секунд (6.08.2010 - 08:09) Michael написал(а):
$room_count = (isset($_POST['room_count'])) ? $_POST['room_count'] : null;
$room_count = array_filter($room_count, 'emptyfilter');
...


if (!empty($district) && !empty($room_count) )
...


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

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