Количество комнат:<br>
<input type="checkbox" value="1" name="komnat[]" id="1" />
<label for="1">Однокомнатная</label><br>
<input type="checkbox" value="2" name="komnat[]" id="2" />
<label for="2">Двухкомнатная</label><br>
<input type="checkbox" value="3" name="komnat[]" id="3" />
<label for="3">Трехкомнатная</label><br>
<input type="checkbox" value="4" name="komnat[]" id="4" />
<label for="4">Четырехкомнатная</label><br>
<input type="checkbox" value="5 и более" name="komnat[]" id="5" />
<label for="5">Пятикомнатная</label>
и таком php-код:
if (empty($_POST['komnat'])) {
$km1="1";
$km2="2";
$km3="3";
$km4="4";
$km5="5";
} else {
$km1=$_POST['komnat'][0];
$km2=$_POST['komnat'][1];
$km3=$_POST['komnat'][2];
$km4=$_POST['komnat'][3];
$km5=$_POST['komnat'][4];
}
$query = "select * from base where (komnat='$km1' OR komnat='$km2' OR komnat='$km3' OR komnat='$km4' OR komnat='$km5')";
заранее спасибо за любую помощь!
Спустя 6 минут, 12 секунд (20.12.2011 - 21:41) inpost написал(а):
evgeny777
У тебя есть массив $_POST['komnat'] , вот там и содержатся данные только отмеченных чекбоксов
И не надо создавать левые переменные! Работай непосредственно с имеющимся массивом.
У тебя есть массив $_POST['komnat'] , вот там и содержатся данные только отмеченных чекбоксов

И не надо создавать левые переменные! Работай непосредственно с имеющимся массивом.
Спустя 17 часов, 8 минут (21.12.2011 - 14:49) qqq написал(а):
inpost а как в таком случает выгружать все данные (если ничего не отметили)? может примерчик скинешь чтобы принцип понять?
Спустя 2 часа, 24 минуты, 25 секунд (21.12.2011 - 17:14) inpost написал(а):
qqq
$query = "... WHERE `komnat` IN (".implode(',',$_POST['komnat']).")";
Спустя 17 минут, 53 секунды (21.12.2011 - 17:32) killer8080 написал(а):
И не забываем данные привести к целочисленному виду, для защита от иньекций
$_POST['komnat'] = array_map('intval', $_POST['komnat']);
Спустя 2 часа, 48 минут, 6 секунд (21.12.2011 - 20:20) evgeny777 написал(а):
inpost большое спасибо за помощь, но при вашем варианте из базы ничего не выгружается если ничего не отмечено. это как то возможно исправить?
Спустя 6 минут, 44 секунды (21.12.2011 - 20:26) killer8080 написал(а):
Цитата (evgeny777 @ 21.12.2011 - 19:20) |
но при вашем варианте из базы ничего не выгружается если ничего не отмечено. |
а что должно выгружаться? Посетитель ничего не выбрал, или у тебя должен быть дефолтовый вариант?
Спустя 25 минут (21.12.2011 - 20:51) inpost написал(а):
evgeny777
Конечно, а теперь подумай сам, как сделать так, чтобы в условие не попадало IN (), если массива нет
Конечно, а теперь подумай сам, как сделать так, чтобы в условие не попадало IN (), если массива нет

Спустя 3 минуты, 36 секунд (21.12.2011 - 20:55) evgeny777 написал(а):
у меня получился вот такой вариант, но думаю, что это не идеал.... и его можно оптимизировать :)
if (empty($_POST['komnat'])) {
$komnatzapros="komnat LIKE '%%'";
} else {
$km1=$_POST['komnat'][0];
$km2=$_POST['komnat'][1];
$km3=$_POST['komnat'][2];
$km4=$_POST['komnat'][3];
$km5=$_POST['komnat'][4];
$komnatzapros="komnat !='' AND (komnat='$km1' OR komnat='$km2' OR komnat='$km3' OR komnat='$km4' OR komnat='$km5')";
}
$query = "select * from base where (."$komnatzapros.")";
Спустя 1 минута, 6 секунд (21.12.2011 - 20:56) inpost написал(а):
evgeny777
Я что тебе написал? НАФИГА ТЕБЕ $km1 ? Объясни, что мешает тебе пользоваться переменной $_POST['komnat'] ?
И 2, я дал оптимильный код, а ты всё испоганил
Я что тебе написал? НАФИГА ТЕБЕ $km1 ? Объясни, что мешает тебе пользоваться переменной $_POST['komnat'] ?
И 2, я дал оптимильный код, а ты всё испоганил

Спустя 5 минут, 19 секунд (21.12.2011 - 21:01) evgeny777 написал(а):
да killer8080 должен быть дефолтовы вариант на случай если по этому парамету ничего не проставлено, так как в моей базе данных около 30 различных параметров
кстати большое спасибо за совет про инъекции! правда я в этом пока не особо разбираюсь а можно как то сделать защиту от инъекций в том варианте который я написал выше?
inpost вы имеете в виде, сделать проверку на пустоту, если массив пустой то выгружать все занчения через '%%' (как в моем верхнем варианте), а если если что то отмечено то через ваш ариант через IN ?

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

Спустя 12 минут, 18 секунд (21.12.2011 - 21:14) evgeny777 написал(а):
inpost я оптимизировал и сделал вот так, но почему то когда у меня что то отмечено запрос не работает, работает только когда ничего не отмечено:
if (empty($_POST['komnat'])) {
$komnatzapros="komnat LIKE '%%'";
} else {
$komnatzapros="`komnat` IN (".implode(',',$_POST['komnat']).")";
}
$query = "select * from base where (".$komnatzapros.") ";
if (empty($_POST['komnat'])) {
$komnatzapros="komnat LIKE '%%'";
} else {
$komnatzapros="`komnat` IN (".implode(',',$_POST['komnat']).")";
}
$query = "select * from base where (".$komnatzapros.") ";
Спустя 9 минут, 54 секунды (21.12.2011 - 21:24) inpost написал(а):
Ты можешь объяснить, что значит эта запись:
komnat LIKE '%%'
То есть какой смысл в ней?
komnat LIKE '%%'
То есть какой смысл в ней?
Спустя 4 часа, 44 минуты, 48 секунд (22.12.2011 - 02:08) killer8080 написал(а):
evgeny777
Если ничего не выбрано, будут выводится все записи. Если нужно выводить что конкретное, по дефолту, вместо пустых кавычек, пропиши нужное условие.
$query = "SELECT * FROM `base`".
(
!empty($_POST['komnat'] && is_array($_POST['komnat']) ?
" WHERE `komnat` IN (".implode(', ', array_map('intval', $_POST['komnat'])).")" :
""
);
Если ничего не выбрано, будут выводится все записи. Если нужно выводить что конкретное, по дефолту, вместо пустых кавычек, пропиши нужное условие.
Спустя 18 часов, 2 минуты, 58 секунд (22.12.2011 - 20:11) evgeny777 написал(а):
killer8080 большое спасибо!
только в твоем коде пропущена скобка: !empty($_POST['komnat'])
но насколько понял, этот код подходит только для численных переменных, так я попытался сделать выгрузку с учетом слов - ничего не получилось. я убрал защиту от инъекции и получилось следующий вариант, но он тоже почему то не работает... :( :
т.е. когда ничего не отмечено - выгружается все, а кога отмечены конкретные чекбоксы - то ничего не выгружается
только в твоем коде пропущена скобка: !empty($_POST['komnat'])
но насколько понял, этот код подходит только для численных переменных, так я попытался сделать выгрузку с учетом слов - ничего не получилось. я убрал защиту от инъекции и получилось следующий вариант, но он тоже почему то не работает... :( :
$query = "SELECT * FROM `base`".
(
!empty($_POST['metro']) && is_array($_POST['metro']) ?
" WHERE `metro` IN (".implode(', ', $_POST['metro']).")" :
""
);
т.е. когда ничего не отмечено - выгружается все, а кога отмечены конкретные чекбоксы - то ничего не выгружается
Спустя 47 минут, 17 секунд (22.12.2011 - 20:59) killer8080 написал(а):
evgeny777
потому что текстовые данные должны быть в кавычках. И для защиты от SQLi тут нужно использовать mysql_real_escape_string().
потому что текстовые данные должны быть в кавычках. И для защиты от SQLi тут нужно использовать mysql_real_escape_string().
$query = "SELECT * FROM `base`".
(
!empty($_POST['metro']) && is_array($_POST['metro']) ?
" WHERE `metro` IN ('".implode("', '", array_map('mysql_real_escape_string', $_POST['metro']))."')" :
""
);
Спустя 41 минута, 36 секунд (22.12.2011 - 21:40) evgeny777 написал(а):
ураааа! заработало! killer8080 огромное тебе спасибо!

Спустя 2 минуты, 52 секунды (22.12.2011 - 21:43) killer8080 написал(а):
evgeny777
да на здоровье
PS так глядишь, в новый год с трехзначной кармой
да на здоровье

PS так глядишь, в новый год с трехзначной кармой

