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

Форум PHP

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

 

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

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

тема: Выбор нескольких checkbox с занесение в базу и их обратное использование
 
 автор: clubxaliav   (15.01.2015 в 00:29)   письмо автору
 
 

Имеется 8 checkbox, заношу через пробел в БД как "1 2 3 4 5 6 7 8" (если выбраны все checkbox).

<input name="vid_oplat_work[]" type="checkbox" value="1" /> Наличные<br />
                <input name="vid_oplat_work[]" type="checkbox" value="2" /> Почтовый перевод<br />
                <input name="vid_oplat_work[]" type="checkbox" value="3" /> Электронные платежные системы<br />
                <input name="vid_oplat_work[]" type="checkbox" value="4" /> Пополнение счета мобильного телефона<br />
                <input name="vid_oplat_work[]" type="checkbox" value="5" /> Банковский перевод на счет<br />
                <input name="vid_oplat_work[]" type="checkbox" value="6" /> Перевод на банковский счет<br />
                <input name="vid_oplat_work[]" type="checkbox" value="7" /> Системы денежных переводов<br />
                <input name="vid_oplat_work[]" type="checkbox" value="8" /> Наложенный платеж</td>


Далее при редактировании данных мне нужно вставить атрибут checked, в те checkbox которые присутствуют в БД

Как это сделать?

  Ответить  
 
 автор: Valick   (15.01.2015 в 07:40)   письмо автору
 
   для: clubxaliav   (15.01.2015 в 00:29)
 

>заношу через пробел в БД как "1 2 3 4 5 6 7 8"
уже не правильный подход

  Ответить  
 
 автор: clubxaliav   (15.01.2015 в 08:28)   письмо автору
 
   для: Valick   (15.01.2015 в 07:40)
 

А как правильно? Какой метод необходим?

  Ответить  
 
 автор: Trianon   (15.01.2015 в 11:22)   письмо автору
 
   для: clubxaliav   (15.01.2015 в 08:28)
 

такой, при котором эти элементы попадут не в одно поле, а каждый в свою строку таблицы.

в принципе, есьт вариант с использованием типа SET в одном поле, но он (как правило) менее гибкий.

  Ответить  
 
 автор: Valick   (15.01.2015 в 12:06)   письмо автору
 
   для: Trianon   (15.01.2015 в 11:22)
 

тут конечно вопрос не о хранении, а о сопоставлении информации из БД с чекбоксами в форме, но я не смог пройти мимо необоснованной денормализации.

clubxaliav
, про сопоставление даже не знаю как ответить, форма должна формироваться в цикле, и сделать условие на соответствие, собственно говоря проблем не должно вызывать (особенно у тех программистов которые берутся за платёжные системы)

  Ответить  
 
 автор: clubxaliav   (18.01.2015 в 00:28)   письмо автору
 
   для: Valick   (15.01.2015 в 12:06)
 

Платежных систем нет, это просто выбор для пользователя продающий товар на площадке, показывающий с помощью каких видов оплат можно приобрести его товар.

  Ответить  
 
 автор: Valick   (15.01.2015 в 12:26)   письмо автору
 
   для: clubxaliav   (15.01.2015 в 08:28)
 

по хорошему у вас должно быть две таблицы
первая таблица:
pay
p_id | p_name

1 | Наличные
2 | Почтовый перевод
и тд

вторая таблица
metod_user_pay
m_id | u_id | p_id
1 | 1 | 1
2 | 1 | 3
3 | 1 | 5
4 | 1 | 6

в итоге запрос с соединением двух таблиц, на основе кторого очень просто автоматически сформировать форму с выбранными чекбоксами

$query ="SELECT * FROM `pay` p 
            LEFT JOIN (SELECT * FROM `metod_user_pay` WHERE u_id=1) m 
            USING ( p_id )
            ORDER BY p.p_id";
$res=mysql_query($query) or die(mysql_error());
$p = '';
while($m=mysql_fetch_assoc($res)){
    $p .= '<p><input type="checkbox" value="'.$m['p_id'].'"';
    $p .= ($m['u_id'])? ' checked="checked"' : '';
    $p .= ' /> '.$m['p_name'].'</p>'."\n";
}
echo $p;

  Ответить  
 
 автор: clubxaliav   (18.01.2015 в 00:36)   письмо автору
 
   для: Valick   (15.01.2015 в 12:26)
 

Все четко работает! Вам большое спасибо, теперь осталось реализовать редактирование этих чекбокс.
В принципе с занесение в 2 таблицы я уже знаком, я так теги заношу по каждому товару. Просто почему то хотел от такого метода уйти!

И еще вопрос: При редактировании таких чекбокс, получается нужно удалить их по u_id и соответственно занести новые данные с новыми p_id?

Например: если было так

metod_user_pay
m_id | u_id | p_id
1 | 1 | 1
2 | 1 | 3
3 | 1 | 5
4 | 1 | 6

то новое значение будет так(если он выбрал другие чекбокс)?

metod_user_pay
m_id | u_id | p_id
5 | 1 | 1
6 | 1 | 2
7 | 1 | 3
8 | 1 | 4

  Ответить  
 
 автор: Valick   (18.01.2015 в 00:49)   письмо автору
 
   для: clubxaliav   (18.01.2015 в 00:36)
 

зачем же их все удалять, если 1 и 3 остаются, удалять только те которых нет в новом наботе чекбоксов
тут еще можно несколько упростить таблицу и оставить только поля u_id | p_id только сделать составной индекс primary key (естественно без автоинкремента) на два поля
в итоге получим связку
u_id | p_id
1 | 1
1 | 2
1 | 3
1 | 4

  Ответить  
 
 автор: clubxaliav   (18.01.2015 в 02:02)   письмо автору
 
   для: Valick   (18.01.2015 в 00:49)
 

Спасибо.

  Ответить  
 
 автор: Trianon   (18.01.2015 в 01:08)   письмо автору
 
   для: clubxaliav   (18.01.2015 в 00:36)
 

m_id как таковой вам не нужен.
первичным ключом можно сделать составной по обоим оставшимся полям.

  Ответить  
 
 автор: clubxaliav   (18.01.2015 в 02:02)   письмо автору
 
   для: Trianon   (18.01.2015 в 01:08)
 

Спасибо.

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

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