[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ограничение выгрузки пустых ячеек
evgeny777
здравствуйте. подскажите пожалуйста как при выгрузке через checkbox (если отмечены один или несколько чекбоксов) выгружались только нужные параметры - без пустых значений. а иначе php определяет неотмеченые чекбоксы как пусто и выгружает еще и пусты значения Например существует sql-таблица с каким-то параметром (например кол-во комнат). есть таком html-код
Количество комнат:<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'] , вот там и содержатся данные только отмеченных чекбоксов smile.gif
И не надо создавать левые переменные! Работай непосредственно с имеющимся массивом.

Спустя 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 (), если массива нет smile.gif

Спустя 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, я дал оптимильный код, а ты всё испоганил smile.gif

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

Спустя 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.") ";

Спустя 9 минут, 54 секунды (21.12.2011 - 21:24) inpost написал(а):
Ты можешь объяснить, что значит эта запись:
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'])

но насколько понял, этот код подходит только для численных переменных, так я попытался сделать выгрузку с учетом слов - ничего не получилось. я убрал защиту от инъекции и получилось следующий вариант, но он тоже почему то не работает... :( :
$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().
$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 огромное тебе спасибо! smile.gif

Спустя 2 минуты, 52 секунды (22.12.2011 - 21:43) killer8080 написал(а):
evgeny777
да на здоровье smile.gif

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

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