Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Выделить checkbox
 
 автор: kapitalist   (10.07.2014 в 20:20)   письмо автору
 
 

Добрый вечер. Подскажите, пожалуйста как выделить 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>';
            }

  Ответить  
 
 автор: confirm   (10.07.2014 в 20:28)   письмо автору
 
   для: kapitalist   (10.07.2014 в 20:20)
 

Во-первых плохо что в базе "1,3,5", уже должно быть 1(key)=>'Установка и монтаж'(value), то есть два поля в таблице.
Во-вторых что значит выделить? Если, например, вы получаете форму, в которой пользователь выбрал чекбокс, значение которого равно 3, то возвращая форму пользователю, можно сравнить это значение с ключом и соответственно установить выбрано.
А у вас что? $key == $adv - всегда будут равны, что именно выбрать?
Если база должна хранить состояние чекбокса, ранее выбранного или сброшенного, значит отводите под это поле в таблице и основываясь на нем устанавливайте.

  Ответить  
 
 автор: kapitalist   (10.07.2014 в 20:41)   письмо автору
 
   для: confirm   (10.07.2014 в 20:28)
 

>Во-первых плохо что в базе "1,3,5", уже должно быть 1(key)=>'Установка и монтаж'(value), то есть два поля в таблице.
И какой смысл так делать? У меня в таком виде хранятся значения. Не вижу ничего плохого.
>Во-вторых что значит выделить? Если, например, вы получаете форму, в которой пользователь выбрал чекбокс, значение которого равно 3, то возвращая форму пользователю, можно сравнить это значение с ключом и соответственно установить выбрано.
ок. Пусть установить бокс. Я и по сути и спрашивал как сравнить эти значения?
>А у вас что? $key == $adv - всегда будут равны, что именно выбрать?
>Если база должна хранить состояние чекбокса, ранее выбранного или сброшенного, значит отводите под это поле в таблице и основываясь на нем устанавливайте.
С чего вдруг? Это разные значения!!

  Ответить  
 
 автор: confirm   (10.07.2014 в 20:52)   письмо автору
 
   для: kapitalist   (10.07.2014 в 20:41)
 

>И какой смысл так делать? У меня в таком виде хранятся значения. Не вижу ничего плохого.

Я не знаю, что означают ваши чекбоксы, но судя по текстовым полям, можно сделать вывод, что это услуги и можно выбрать сразу несколько.
Пусть будет так. А теперь вопрос - как вы думаете, если нужно будет найти в базе пользователей выбравших определенные услуги, то удобно ли это будет сделать, если ваш выбор это строка?
Запомните, искать числа и быстрее и эффективнее запрос будет.

>Я и по сути и спрашивал как сравнить эти значения?

До вас не дойдет суть. Нельзя сравнить что-то не известно с чем-то. Если у вас в базе услуги это поля с автоинкрементом (!), а значения чекбоксов в форме равных этим id, и которые потом заносятся в базу, пусть и в виде строки (что плохо), вот тогда выводя все чекбоксы (а не какой-то адвансед + explode), сравниваете их id с id выбранных.

Либо у каждого чебокса есть поле в базе, tityint - 1 вабрано/0 сброшено (по умолчанию). И выводя чекбоксы проверяете это значение. У вас выбор должна хранить связанная таблица. В общем неудачная у вас структура.

>С чего вдруг? Это разные значения!!

Еще раз перечитайте и хорошо подумайте. Вы базу, которая имеет возможности для удобного связывания, используете не по назначению, храня в ней строки, что в данном случае не выгодно.

  Ответить  
 
 автор: kapitalist   (13.07.2014 в 21:51)   письмо автору
 
   для: 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?

  Ответить  
 
 автор: confirm   (14.07.2014 в 00:10)   письмо автору
 
   для: 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".

  Ответить  
 
 автор: moonfox   (10.07.2014 в 23:44)   письмо автору
 
   для: kapitalist   (10.07.2014 в 20:41)
 

1 ЗНАЧЕНИЕ 1 ПОЛЕ
погуглите принципы нормализации.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования