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

Форум PHP

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

 

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

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

тема: Набор чекбоксов с произольным полем
 
 автор: Axxil   (17.06.2008 в 16:15)   письмо автору
 
 

Вот встала проблема хранить в базе набор чекбоксов.

Например:
В свободное время я: 

[1] пойду гулять
[2] буду смотреть телек 
[3] уткнусь в комп
[4] буду пить водку
[5] Свой вариант  ______________


Без пункта свой вариант всё красиво и понятно. Набор хранится в одном поле в виде двоичного числа 0010 (чекбокс отмечен - 1, не отмечен - 0), который, имея справочник (ключ - значени) легко восстановить.

Всю малину портит 5 пункт, свободный выбор. Вопрос - как быть с этим своим вариантом (а это, понятно строка любой длины)? Как и куда его сохранять и как потом восстанавливать.

Свой вариант, конечно есть, но он дурацкий (иначе бы не писал уж :))

   
 
 автор: BinLaden   (17.06.2008 в 16:23)   письмо автору
 
   для: Axxil   (17.06.2008 в 16:15)
 

> Набор хранится в одном поле в виде двоичного числа 0010 (чекбокс отмечен - 1, не отмечен - 0)

Странно, а данные (идентификатор, описание) чекбоксов хранятся не в отдельной таблице что ли?

   
 
 автор: Axxil   (17.06.2008 в 16:45)   письмо автору
 
   для: BinLaden   (17.06.2008 в 16:23)
 

Это, в принципе, не важно.

Так как это справочники, а не пользовательские данные, то хранить их в базе смысла нет никакого.
Я их храню в виде файлов на диске.
Формат: key:value

   
 
 автор: BinLaden   (17.06.2008 в 17:03)   письмо автору
 
   для: Axxil   (17.06.2008 в 16:45)
 

Хозяин — барин.

> Формат: key:value

Тогда просто измените формат на "key:is_custom:value", где is_custom принимает значения 0 или 1, обозначающие соотвественно вывод обычного текста или в <input type="text" ... />.

P.S. Под value я понял описания "пойду гулять", "буду смотреть телек" и т.д., а не значение одноименного атрибута <option>.

   
 
 автор: Axxil   (17.06.2008 в 17:18)   письмо автору
 
   для: BinLaden   (17.06.2008 в 17:03)
 

а само значение пользовательского ввода где сохранять?

PS Я вместо is_custom зарезервировал ключ 9. Под которым всегда будет пользовательское поле.

Т.е. справочник выглядит как

1:пойду гулять
2:буду смотреть телек 
3:уткнусь в комп
4:буду пить водку
9:Свой вариант


Так что можно обойтись структурой key:value

Вообще интересны любой опыт решения данной проблемы, если кто-то решал нечто подобное.
Проблема довольно теоретична :)

   
 
 автор: BinLaden   (17.06.2008 в 17:21)   письмо автору
 
   для: Axxil   (17.06.2008 в 17:18)
 

> а само значение пользовательского ввода где сохранять?

В value.

   
 
 автор: Axxil   (17.06.2008 в 17:23)   письмо автору
 
   для: BinLaden   (17.06.2008 в 17:21)
 

Не получится. Так как справочник - один, а пользователей может быть мильон.

   
 
 автор: BinLaden   (17.06.2008 в 17:26)   письмо автору
 
   для: Axxil   (17.06.2008 в 17:23)
 

Простите, ничего не понял. Что это за справочник с какими-то вопросами для пользователей? В справочниках обычно ответы:)

   
 
 автор: Axxil   (17.06.2008 в 17:37)   письмо автору
 
   для: BinLaden   (17.06.2008 в 17:26)
 

OK. Разберёмся в понятиях :)

Справочник, в данном контексте, это файл (или таблица, неважно) вида ключ - значение.
Юзер, выбирая определённые чекбоксы формирует двоичное число, хранящее состояние этих чекбоксов, отсортированных по ключам.

Справочник

1:пойду гулять
2:буду смотреть телек 
3:уткнусь в комп
4:буду пить водку
9:Свой вариант


Формирует набор чекбоксов

[1] пойду гулять
[2] буду смотреть телек 
[3] уткнусь в комп
[4] буду пить водку
[5] Свой вариант  ______________


выбор юзером 1 3 5 чекбокса формирует число 10101 которое и сохраняется в поле free_day соответствующей таблице.


user_id    name        email         free_day
 115      kolya      df@df.rt          10101


Восстановить текстовые значения из числа 10101 имея справочник труда нет.

Вся проблема сводится к тому куда записывать значение пользовательского ввода.

   
 
 автор: AcidTrash   (17.06.2008 в 17:41)   письмо автору
 
   для: Axxil   (17.06.2008 в 17:37)
 

В данном случае можно проверять если отмечен пятый чебокс, то значение поля ввода юзером записывается в отдельный столбец таблицы
user_id           name               email               free_day            field5 
115            kolya            df@df.rt                10101                   Пить пиво

   
 
 автор: BinLaden   (17.06.2008 в 17:45)   письмо автору
 
   для: AcidTrash   (17.06.2008 в 17:41)
 

> Можно проверять если отмечен пятый чебокс, то значение поля ввода юзером записывается в отдельный столбец таблицы

Какое отношение имеет ответ на один из вопросов к данным пользователя?

UPD: Хотя нет, AcidTrash, тут уже не Вы виноваты...Оказывается такая структура у Axxil...

   
 
 автор: Axxil   (17.06.2008 в 17:50)   письмо автору
 
   для: AcidTrash   (17.06.2008 в 17:41)
 

Можно.
А если таких наборов чекбоксов штук 15 -20? :)
Столько же полей создавать?

   
 
 автор: BinLaden   (17.06.2008 в 17:52)   письмо автору
 
   для: Axxil   (17.06.2008 в 17:50)
 

> А если таких наборов чекбоксов штук 15 -20? :)

А если вопроса будет два? Вы добавите другое поле в таблицу users, да?:)

   
 
 автор: Axxil   (17.06.2008 в 17:58)   письмо автору
 
   для: BinLaden   (17.06.2008 в 17:52)
 

нет конечно :)
просто 15-20 нагляднее показывают невозможность способа

   
 
 автор: AcidTrash   (17.06.2008 в 17:53)   письмо автору
 
   для: Axxil   (17.06.2008 в 17:50)
 

Об этом не подумал. Самый оптимальный вариант предложил BinLaden.

   
 
 автор: sim5   (17.06.2008 в 17:42)   письмо автору
 
   для: Axxil   (17.06.2008 в 17:37)
 

А такой вопрос можно? Если чекбоксы, то я могу выбрать и [1] пойду гулять, и [2] буду смотреть телек - а можно ли это делать сразу?

   
 
 автор: Axxil   (17.06.2008 в 17:51)   письмо автору
 
   для: sim5   (17.06.2008 в 17:42)
 

Сейчас есть мобильное телевидение :)

А если серьёзно, варианты от балды написаны.

   
 
 автор: sim5   (17.06.2008 в 17:53)   письмо автору
 
   для: Axxil   (17.06.2008 в 17:51)
 

Ну если у вас допустимо пить водку, смотря телевизор, уткнувшись в компьютер - вопросов нет.

   
 
 автор: Axxil   (17.06.2008 в 17:55)   письмо автору
 
   для: sim5   (17.06.2008 в 17:53)
 

Ещё раз:

> А если серьёзно, варианты от балды написаны.

   
 
 автор: BinLaden   (17.06.2008 в 17:43)   письмо автору
 
   для: Axxil   (17.06.2008 в 17:37)
 

to Axxil: должен быть какой-то идентификатор вопроса. Тогда можно записать ответ в таблицу вида question_id, user_id, value.

   
 
 автор: Axxil   (17.06.2008 в 17:54)   письмо автору
 
   для: BinLaden   (17.06.2008 в 17:43)
 

Наглядный пример:

http://love.mail.ru/ksave2/?sold=J7tKx_OXX.dLpIikItvs6GjPOQQfx8xf

Посмотрите сколько там может быть полей с наборами чекбоксов.
Идентификатор вопроса - название поля.

   
 
 автор: AcidTrash   (17.06.2008 в 17:57)   письмо автору
 
   для: Axxil   (17.06.2008 в 17:54)
 

Так BinLaden и привел пример

   
 
 автор: Axxil   (17.06.2008 в 18:02)   письмо автору
 
   для: AcidTrash   (17.06.2008 в 17:57)
 

Да я так и сделал :)
Мне этот вариант не нравится. Как-то неэлегантно.
Поэтому и интересуюсь другими идеями :)

   
 
 автор: sim5   (17.06.2008 в 17:58)   письмо автору
 
   для: Axxil   (17.06.2008 в 17:54)
 

Мне из этого майловского опросника всегда интересовало - Волосы на голове: Темные - это для того чтобы не подумали плохого, или для размышления?))

   
 
 автор: BinLaden   (17.06.2008 в 18:01)   письмо автору
 
   для: Axxil   (17.06.2008 в 17:54)
 

to Axxil: давай-те разберемся.

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

Или Вы хотите сделать несколько своих вариантов ответов? Тогда почему Вы зафиксировали для ответа только "9"?

   
 
 автор: Axxil   (17.06.2008 в 18:04)   письмо автору
 
   для: BinLaden   (17.06.2008 в 18:01)
 

Насчёт "несколько вариантов" я пока не прорабатывал.

Насчёт таблицы - я так и сделал по-началу. А потом прикинул её потенциальный объём. И подумал что может есть ещё варианты и мой моск просто зашаблонился окончательно.

Похоже что нет :)

   
 
 автор: AcidTrash   (17.06.2008 в 22:31)   письмо автору
 
   для: Axxil   (17.06.2008 в 18:04)
 

>Насчёт таблицы - я так и сделал по-началу

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

   
 
 автор: Axxil   (18.06.2008 в 09:18)   письмо автору
 
   для: AcidTrash   (17.06.2008 в 22:31)
 

> Насчет структуры таблиц и взаимосвязей трех таблиц(включая вашу с юзерами) покумекайте.

Мудро :)

В этом собственно вопрос и заключался.

Всё, всем спасибо. Вопрос решён.

PS Две таблицы тут не нужны. Так как я сторонник хранения в базе исключительно пользовательских данных, т.е. контента. Вся остальная сопутствующая фигня (справочники, конфиги и пр.) хранится в файлах.

   
Rambler's Top100
вверх

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