Опытный плюсополучатель
С нами с 09.06.05
Сообщения: 8305
Рейтинг: 186
|
Добавлено: 26/12/10 в 04:08 |
Приветствую!
Буду благодарен общественности, если кто-нибудь кинет в меня ссылкой на пример обработки MySQL-множетсва SET средствами PHP.
Долго гуглил и яндексил, но найденной информации - практически ноль.
Суть проблемы:
Есть поле типа SET в базе сайта знакомств. Назовём это поле - LookingFor. Может принимать одновременно несколько значений из следующих:
Код: | set('CORRESPONDENCE', 'FRIENDSHIP', 'LOVE', 'SEX', 'FLIRT', 'FAMILY', 'ROMANCE', 'SPONSORSHIP', 'COMMUNICATION', 'VACATION', 'LEISURE', 'BEASPONSOR')
|
Пользователь заполнил анкетку на сайте и выбрал несколько из них, например:
Код: | CORRESPONDENCE, FRIENDSHIP, SEX, FLIRT, VACATION |
Теперь передо мной стоит задача это дело распарсить и присвоить каждому англоязычному термину русскоязычный вариант написания, то есть:
Код:
Код: | ПЕРЕПИСКА, ДРУЖБА, СЕКС, ФЛИРТ, ПУТЕШЕСТВИЯ |
Можно было бы, конечно, распарсить строковыми функциями, но это топорно, насколько я думаю. Ведь множество SET присваивает каждому элементу целочисленное значение (1, 2, 4, 8, 16, 32, 64 и т.д.). Вот и хотелось бы обрабатывать через switch...case по числовому значению элемента и присваивать перевод.
Или я не прав?
Надеюсь, что понятно всё объяснил.
Спасибо!
|
|
|
|
Чингачгук, вождь красноглазых
С нами с 14.05.04
Сообщения: 4744
Рейтинг: 1824
|
Добавлено: 26/12/10 в 15:33 |
Не еби себе моск SET'ами, они от лукавого. Сделай отдельную таблицу LookingFor с возможными значениями, две колонки: PK и Value, свяжи две таблицы через Many-to-Many, к таблице со значениями привяжи таблицу трансляций через PK. И не придется менять структуру только для того, чтобы поменять потом что-то, да и работать будет быстрее. Сможешь через SELECT выбрать значения на любом языке.
|
|
|
|
Добрых Дел Мастер
С нами с 03.05.08
Сообщения: 3143
Рейтинг: 1227
|
Добавлено: 27/12/10 в 21:36 |
<select name="LookingFor">
<option value="CORRESPONDENCE">ПЕРЕПИСКА</option>
<option value="FRIENDSHIP">ДРУЖБА</option>
...
</select>
|
|
пришел к победе коммунистического труда
|
0
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 27/12/10 в 22:10 |
Редко вижу этот тип данных. Насколько я знаю, эта хрень воспринимается как строка и работать надо как со строковым полем.
|
|
|
|
Чингачгук, вождь красноглазых
С нами с 14.05.04
Сообщения: 4744
Рейтинг: 1824
|
Добавлено: 27/12/10 в 22:24 |
http://dev.mysql.com/tech-resources/articles/mysql-set-datatype.html
Цитата: | The SET elements are stored in the MySQL table as a bitmap: each element is represented by a single bit |
Все равно хуйня - выборка работает медленно. Ниже:
Цитата: | Why You Shouldn't Use SET
...
Fourth, an INDEX on a set datatype is going to refer to the set as a whole and will not be used for searching individual elements |
Это о том, что в данном случае для того, чтобы выбрать список баб, готовых простопоебаццо, надо будет перебрать все записи, делая побитовое сравнение "выставлен ли бит Простопоебаццо". Что для сайта знакомств окажется жопой, как несложно догадаться. Есть смысл применять этот тип данных только для чисто информативного поля, по которому никогда поиск вестись не будет.
Нормальную архитектуру надо делать, с нормализованной базой, и все хорошо будет.
|
|
|
|
Опытный плюсополучатель
С нами с 09.06.05
Сообщения: 8305
Рейтинг: 186
|
Добавлено: 29/12/10 в 20:21 |
FXIX писал: | <select name="LookingFor">
<option value="CORRESPONDENCE">ПЕРЕПИСКА</option>
<option value="FRIENDSHIP">ДРУЖБА</option>
...
</select> |
FXIX, эт чо?
|
|
|
|
Добрых Дел Мастер
С нами с 03.05.08
Сообщения: 3143
Рейтинг: 1227
|
Добавлено: 29/12/10 в 20:53 |
то что ты хотел. но без распарсивания. юзер выбирает "ПЕРЕПИСКА" а в post летит "CORRESPONDENCE".
|
|
пришел к победе коммунистического труда
|
0
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 29/12/10 в 21:27 |
как оригинально
|
|
|
|
Опытный плюсополучатель
С нами с 09.06.05
Сообщения: 8305
Рейтинг: 186
|
Добавлено: 29/12/10 в 21:35 |
FXIX писал: | то что ты хотел. но без распарсивания. юзер выбирает "ПЕРЕПИСКА" а в post летит "CORRESPONDENCE". |
Сдаётся мне, что ты не въехал в тему вопроса.
Хорошо, давай применим твой метод. Посмотри на мой первый пост. Допустим, юзер выбрал CORRESPONDENCE, FRIENDSHIP, SEX, FLIRT, VACATION.
В соответствии с этим, значение SET-поля будет равно 539 (1+2+8+16+512). А теперь примени свой гениальный метод, чтобы из числа 539 получить именно нужные значения (CORRESPONDENCE, FRIENDSHIP, SEX, FLIRT, VACATION) программным путём на РНР.
Или ты решил поучить меня как селекты в дропдаунах форм делать и данные POST-ом отправлять?
SET не хранит строку! SET хранит биты. Двойку в степени. И мне надо распарсить это значение и получить на их основании строчный вариант.
|
|
|
|
Добрых Дел Мастер
С нами с 03.05.08
Сообщения: 3143
Рейтинг: 1227
|
Добавлено: 29/12/10 в 22:30 |
так выражайся яснее . что надо сделать? юзер выбрал несколько значений, и надо по этим значениям выбрать из базы строчки, так?
можно LIKE заюзать или FIND_IN_SET.
|
|
пришел к победе коммунистического труда
|
0
|
|
|