|
|
|
| Добрый вечер. Подскажите, пожалуйста как выделить checkbox из БД.
В БД есть запись "1,3,5".
Не могу немного додумать, как выделить 1, 3 и 5 боксы.
Думаю, что нужно сделать через array_in, но вообще не понимаю как.
$adv = $row['advantage'];
//$adv = explode(",", $row['advantage']);
$advantage = array(
'1'=>'Установка и монтаж',
'2'=>'Защита двигателя',
'3'=>'Регулирование скорости',
'4'=>'Низкое электропотребление',
'5'=>'Низкий шум'
);
foreach ($advantage as $key=>$val) {
$selected = ($key == $adv) ? 'checked' : '';
$adv_form.= '<div class="checkbox"><input type="checkbox" name="avantage" value="'.$key.'" '.$selected.'>'.$val.'</div>';
}
|
| |
|
|
|
|
|
|
|
для: kapitalist
(10.07.2014 в 20:20)
| | Во-первых плохо что в базе "1,3,5", уже должно быть 1(key)=>'Установка и монтаж'(value), то есть два поля в таблице.
Во-вторых что значит выделить? Если, например, вы получаете форму, в которой пользователь выбрал чекбокс, значение которого равно 3, то возвращая форму пользователю, можно сравнить это значение с ключом и соответственно установить выбрано.
А у вас что? $key == $adv - всегда будут равны, что именно выбрать?
Если база должна хранить состояние чекбокса, ранее выбранного или сброшенного, значит отводите под это поле в таблице и основываясь на нем устанавливайте. | |
|
|
|
|
|
|
|
для: confirm
(10.07.2014 в 20:28)
| | >Во-первых плохо что в базе "1,3,5", уже должно быть 1(key)=>'Установка и монтаж'(value), то есть два поля в таблице.
И какой смысл так делать? У меня в таком виде хранятся значения. Не вижу ничего плохого.
>Во-вторых что значит выделить? Если, например, вы получаете форму, в которой пользователь выбрал чекбокс, значение которого равно 3, то возвращая форму пользователю, можно сравнить это значение с ключом и соответственно установить выбрано.
ок. Пусть установить бокс. Я и по сути и спрашивал как сравнить эти значения?
>А у вас что? $key == $adv - всегда будут равны, что именно выбрать?
>Если база должна хранить состояние чекбокса, ранее выбранного или сброшенного, значит отводите под это поле в таблице и основываясь на нем устанавливайте.
С чего вдруг? Это разные значения!! | |
|
|
|
|
|
|
|
для: kapitalist
(10.07.2014 в 20:41)
| | >И какой смысл так делать? У меня в таком виде хранятся значения. Не вижу ничего плохого.
Я не знаю, что означают ваши чекбоксы, но судя по текстовым полям, можно сделать вывод, что это услуги и можно выбрать сразу несколько.
Пусть будет так. А теперь вопрос - как вы думаете, если нужно будет найти в базе пользователей выбравших определенные услуги, то удобно ли это будет сделать, если ваш выбор это строка?
Запомните, искать числа и быстрее и эффективнее запрос будет.
>Я и по сути и спрашивал как сравнить эти значения?
До вас не дойдет суть. Нельзя сравнить что-то не известно с чем-то. Если у вас в базе услуги это поля с автоинкрементом (!), а значения чекбоксов в форме равных этим id, и которые потом заносятся в базу, пусть и в виде строки (что плохо), вот тогда выводя все чекбоксы (а не какой-то адвансед + explode), сравниваете их id с id выбранных.
Либо у каждого чебокса есть поле в базе, tityint - 1 вабрано/0 сброшено (по умолчанию). И выводя чекбоксы проверяете это значение. У вас выбор должна хранить связанная таблица. В общем неудачная у вас структура.
>С чего вдруг? Это разные значения!!
Еще раз перечитайте и хорошо подумайте. Вы базу, которая имеет возможности для удобного связывания, используете не по назначению, храня в ней строки, что в данном случае не выгодно. | |
|
|
|
|
|
|
|
для: confirm
(10.07.2014 в 20:52)
| | Ок. Значения храню в базе. Но в другой таблице у меня перечислены id, через запятую. Мне нужно на их основе поставить флажки
$adv = $row['advantage'];
$q = mysql_query("SELECT * FROM `advantage`");
while ($r = mysql_fetch_assoc($q)) {
$rid = $r[id];
if (in_array($rid, $adv)) {
$checked = "checked";
}
echo "<div class='checkbox_p'><input type='checkbox' name='advantage' value='$r[id]' $checked>$r[name]</div>";
}
|
Получилось, что то вроде этого. Как выделить только те, что находятся в массиве adv? | |
|
|
|
|
|
|
|
для: kapitalist
(13.07.2014 в 21:51)
| | Еще раз - хранить в базе выбор как значения через запятую, это зло. Если до вас это до сих пор не дошло, то рано или поздно вы о таком хранении очень сильно пожалеете.
$rid = $r[id];
if (in_array($rid, $adv))
А что, записать как if (in_array($r[id], $adv)) нельзя, и обязательно нужна еще, лишняя, переменная?
И зачем здесь вообще условие?
<?
echo '<div class="checkbox_p"><input type="checkbox" name="advantage" value=' . $r[id] . (in_array($r[id], $adv) ? ' checked' : null) . '>' . $r[name] . '</div>';
|
Используйте LABEL, чтобы можно было делать выбор по щелчку не только чекбокса, но и текста к нему.
>Как выделить только те, что находятся в массиве adv?
А вы что делаете? Просто записано ужасно и не обдуманно, ибо последнее true условия так и останется за $checked, а следующий чечкбокс не совсем обязательно является "checked". | |
|
|
|
|
|
|
|
для: kapitalist
(10.07.2014 в 20:41)
| | 1 ЗНАЧЕНИЕ 1 ПОЛЕ
погуглите принципы нормализации. | |
|
|
|
|