Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Тип данных Enum, как создать список значений 
:(
    Опции темы
Geolog
Дата 13.5.2008, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 18.3.2005

Репутация: нет
Всего: 1



Есть таблица в которой имеется поле с типом enum и значениями например: понедельник, вторник, среда и т.д.
Вопрос следующий - как мне в php скрипте получить все возможные значения поля enum для добовления их в выпадающий список.
PM MAIL   Вверх
bars80080
Дата 13.5.2008, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 9
Всего: 315



в php скрипте это реализуется функцией http://php.ru/manual/function.array-unique.html
однако, наверняка того же эффекта можно достичь при составлении правильного запроса в БД
PM MAIL WWW   Вверх
solenko
Дата 13.5.2008, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 7
Всего: 67



bars80080, думаю, имеется в виду получение списка на основе метаданных.
Первое что приходит на ум --парсинг результата SHOW FIELDS FROM table_name;

Добавлено через 2 минуты и 53 секунды
А еще есть готовое решение в комментариях к функции mysql_fetch_field


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
skyboy
Дата 13.5.2008, 18:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



bars80080, не о том речь. а если в таблице вообще пусто - что ж, ничего не предлагать для ввода?
Geolog, у тебя mysql какой версии? если 5 или выше, то смотри в `information_schema`.`columns`
особое внимание на поля data_type(тебе нужен "enum") и data_type(там в формате enum("значение1,"значение2"....)) и содержатся нужные тебе данные

Добавлено через 49 секунд
Цитата(solenko @  13.5.2008,  16:57 Найти цитируемый пост)
парсинг результата SHOW FIELDS FROM table_name;

да уж, это поуниверсальнее будет

Добавлено через 3 минуты и 7 секунд
впрочем, смущает одно: если количество вариантов enum и сами варианты неизменны - почему "жестко" не забить в коде вывод("да" и "нет").
если же эти варианты могут меняться - почему бы не вынести их в отдельную таблицу?
PM MAIL   Вверх
bars80080
Дата 13.5.2008, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 9
Всего: 315



ну вы на меня набросились

автор выделил слово php, и я тоже его пометил, причём здесь заморочки с mysql? хотя и коню ясно, что это лучше вытягивать из БД запросом


solenko, он говорит о значениях в поле (или вы думаете под значениями подразумевается имена столбцов?  smile )

Добавлено через 40 секунд
не, бред, имена только латиницей
PM MAIL WWW   Вверх
solenko
Дата 13.5.2008, 18:14 (ссылка) |   (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 7
Всего: 67



bars80080, почитайте тут про тип enum. И еще, как вы думаете, список возможных значений и список уже присутствующих значений это разные вещи?

Добавлено через 4 минуты и 11 секунд
А вообще прийдет топикстартер и расскажет у кого телепатия лучше прокачана )


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
bars80080
Дата 14.5.2008, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 9
Всего: 315



м-м, какие интересные весчи оказывается есть
PM MAIL WWW   Вверх
Geolog
  Дата 14.5.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 18.3.2005

Репутация: нет
Всего: 1



Огромное спасибо за помощь.
Посмотрел все предложенные варианты

Цитата

А вообще прийдет топикстартер и расскажет у кого телепатия лучше прокачана ) 


За телепатию solenko и skyboy ПЯТЁРКА  smile  - прошу прощения если вопрос был задан не совсем ясно.
Естественно нужны ВОЗМОЖНЫЕ значения поля enum.

взял за основу функцию предложенную solenko по ссыле mysql_fetch_field
Всё работает, так как хотел.

Код

//just another option to get all enum|set values from table definition. values are stored into arrays using the same field name

$result = mysql_query("SHOW COLUMNS FROM [table_name]");
while($row = mysql_fetch_object($result)){
   if(ereg(('set|enum'), $row->Type)){
       eval(ereg_replace('set|enum', '$'.$row->Field.' = array', $row->Type).';');
   }
}


Цитата

впрочем, смущает одно: если количество вариантов enum и сами варианты неизменны - почему "жестко" не забить в коде вывод("да" и "нет").
если же эти варианты могут меняться - почему бы не вынести их в отдельную таблицу? 


Хочется красоты и гармонии. Зачем дублировать значения полей, когда информация об этом уже присутствует в базе.


PM MAIL   Вверх
skyboy
Дата 14.5.2008, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



Цитата(Geolog @  14.5.2008,  14:14 Найти цитируемый пост)
Зачем 

а затем, что:
а) хранятся в таблицах числовые индексы, а выводятся забитые заранее строки. такая двойственность может привести к не вполне очевидным "глюкам". пример:
Код

select `select_priv`
from `mysql`.`db`

выведет набор из значений "Y" и "N"(естественно, если версия mysql предполагает наличие информационной базы "mysql"; в противном случае - используй для примера свою таблицу с enum)
но вот запрос
Код

select `select_priv` + 1
from `mysql`.`db`

выведет уже двойки(1 - индекс "N" в enum'e; плюс один, указанный в запросе) и тройки(2 - индекс "Y" в enum'e; плюс один, указанный в запросе). 
б) возможны прелести при join'e(если два логически идентифичных поля - enum'ы с разным порядком объявления значений) - если же я ошибаюсь и enum сравниваются по значению, а не по индексу, то у нас будут дикие тормоза при группировке и объединении таблиц
в) для изменения списка значений придется alter'ить поле таблицы, что практически наверняка вызовет переиндексацию поля(зачем оно тебе?)
г) сортировка точно происходит не по значениям, а по индексам - то есть по порядку объявления в enum'e. и "арбуз" вполне может оказаться после "яблока", но перед "персиком".
PM MAIL   Вверх
Geolog
Дата 15.5.2008, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 18.3.2005

Репутация: нет
Всего: 1



Спасибо за информацию о возможных "граблях" - обязательно учту при проектировании БД.
PM MAIL   Вверх
solenko
Дата 15.5.2008, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 7
Всего: 67



skyboy, а вам не кажется, что все эти проблеммы и подводные камни надуманы? Я часто исползую enum, но почему-то никогда ни join'а по ним не приходилось делать, ни сортировки. Да и добавление значений... Возможно у меня плохо фантазия работает, но я не знаю что можно добавить в значение поля "пол". Все что вы перечислили лечится очень просто -- использованием enum по назначению.


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
skyboy
Дата 15.5.2008, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



Цитата(solenko @  15.5.2008,  12:22 Найти цитируемый пост)
Все что вы перечислили лечится очень просто -- использованием enum по назначению. 

ну, ладно. если бы у топикстартере речь шла о поле, то зачем вместо того, чтоб забить жестко в PHP-код список значений, понадобилось вдруг выдергивать из описания поля все значения enum'a? Не потому ли вдруг, что в данном случае как раз enum используется не по назначению? Я автору вопрос задал, ответа не получил. привел доказательства того, что если пихать enum куда не следует - будут проблемы. какие претензии? или ты не согласен с приведенным?

Добавлено через 1 минуту и 5 секунд
solenko, не находишь, что получать от СУБД информацию о поле в таблице, собственноручно тобою созданной - задача несколько странно выглядящая?
PM MAIL   Вверх
solenko
Дата 15.5.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 7
Всего: 67



Цитата(skyboy @  15.5.2008,  15:09 Найти цитируемый пост)
solenko, не находишь, что получать от СУБД информацию о поле в таблице, собственноручно тобою созданной - задача несколько странно выглядящая?

Нет, не считаю, т.к. с удовольствуем пользуюсь автогенераторами вроде propel (он, кстати, не держит enum, хотя обещали поправить)

Цитата(skyboy @  15.5.2008,  15:09 Найти цитируемый пост)
привел доказательства того, что если пихать enum куда не следует - будут проблемы. какие претензии? или ты не согласен с приведенным?

Я считаю что нет смысла приводить доказательство аксиомы "если что-то применить не по назначению, то получиш Г" . А после прочтения вашего сообшения может сложиться впечатление, что enum это вселенское зло. )




--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
skyboy
Дата 15.5.2008, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



Цитата(solenko @  15.5.2008,  16:01 Найти цитируемый пост)
enum это вселенское зло

разве у меня перечислены недостатки? 
я перечислял известные мне ньюансы работы с enum. причем, возможно, не всем очевидные. 
где-то я фактически ошибся? 
PM MAIL   Вверх
Geolog
Дата 19.5.2008, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 18.3.2005

Репутация: нет
Всего: 1



Ни кто и не пытается использовать поле enum не по назначению - используя функцию определения возможных значений полей типа enum и set из базы я вопервых: возлагаю груз ответственности за набор значений на человека, который спроектировал базу данных, во вторых: использую механизмы сохранения целостности базы данных заложенные в архитектуре MySQL, в третьих мне такое решение нравиться считаю его логически верным.

Вот уж не думал, что столько дебатов вызовет этот вопрос.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0572 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.