Списки данных привязать к пользователям. Организация в базе.

Сенсей

Новичок
Списки данных привязать к пользователям. Организация в базе.

Есть таблица пользователей. Пользователям нужно дать возможность выбирать из списка несколько вариантов.

Список - это например список интересов, или например цель нахождения на сайте.
Выводим список с чекбоксами... юзер отмечает чекбоксы - и мы сохраняем данные в базе.

Вот тут вопрос - как хранить эти данные? По ним потом будет осуществляться поиск пользователей.

Создавать отдельное поле для каждого чекбокса в таблице юзеров слишком громоздко. Особенно если список значений может измениться.

Хранить значения чекбоксов в виде например 1,0,0,0,1,1 в одном поле - не кошерно вроде как...

Есть идея создать таблицу например:

PHP:
CREATE TABLE `users_extended_data` (
  `data_id` int(11) NOT NULL auto_increment,
  `user_id` int(11) default NULL,
  `data_type` varchar(11) default NULL,
  `data_value` int(11) unsigned NOT NULL default '0',
  PRIMARY KEY  (`data_id`)
)
А данные хранить в таком виде:

PHP:
data_id | user_id | data_type | data_value
1            4      interests       0
2            4      interests       1
3            4      interests       4
4            4      search_for      0
5            4      search_for      2
Значения потом выберать из соответствующих массивов в соответствии с data_type и data_value

Например при выборке получаем:
PHP:
$data_type = 'interests';
$data_value[1] = 0;
$data_value[2] = 1;
$data_value[3] = 4;
И уже выбираем что выводить из соответствующих массивов.

PHP:
$interests = array(
0 => 'Музыка',
1 => 'Фильмы',
2 => 'Спорт',
3 => 'Интернет',
4 => 'Танцы'
);

$user_search_for = array(
0 => 'Любовь',
1 => 'Новых друзей',
2 => 'Общения',
3 => 'Секс',
4 => 'Просто мне здесь нравится'
);
Я на правильном пути? Что можете посоветовать?
 

SaNeK

Новичок
А может так?
define('MUSIC', 2);
define('FILMS', 4);
define('SPORT', 8);
define('INTERNET', 16);
define('DANCE', 32);

Пользователь выбрал, например, музыку и спорт - складываешь MUSIC + SPORT = 10. И эту 10 пишешь в поле interests таблицы users.

Ну а поиск народа, который музыкой интересуется вроде этого:
select * from users where interests & MUSIC

А вообще: http://ru.php.net/manual/ru/language.operators.bitwise.php
 

Сенсей

Новичок
Интересное решение...

но допустим я с базы выбрал 10 как разложить его на 8 и 2?

Пошарил по форуму... есть еще решение использовать поле set('1','2','3') но вроде как не советуют этого делать...

Что то местные гуру молчат...
 

Андрейка

Senior pomidor developer
Сенсей
сколько этих вариантов то? и по скольким одновременно выборка?
 

Сенсей

Новичок
Андрейка
Вариантов - сколько точно сказать не могу.. но скажем так.. с каждой тематики не больше 20

Например эти же

PHP:
$interests = array( 
0 => 'Музыка', 
1 => 'Фильмы', 
2 => 'Спорт', 
3 => 'Интернет', 
4 => 'Танцы' 
); 

$user_search_for = array( 
0 => 'Любовь', 
1 => 'Новых друзей', 
2 => 'Общения', 
3 => 'Секс', 
4 => 'Просто мне здесь нравится' 
);
Потом например что бы без проблем можно было добавить дополнительные тематики и прявязать их к юзеру.

PHP:
$user_now = array( 
0 => 'В армии', 
1 => 'Работаю', 
2 => 'Учусь'
);
Поиск должен проводиться по выбранным полям... то есть юзер отмечает чекбоксы по каким критериям искать...

например по: $interests = 0,1, $user_search_for= 2,4, $user_now = 2
 

SaNeK

Новичок
но допустим я с базы выбрал 10 как разложить его на 8 и 2?
Я же показал в запросе смысл. Выбрал значение 10, положил его в переменную $interests. Далее тебе надо знать, какие именно интересы были выбраны, что получилось в итоге 10. Используй:
PHP:
// здесь MUSIC - константа
if($interests & MUSIC)
    echo "Увлекается музыкой";
if($interests & FILMS)
    echo "Увлекается фильмами";
Код топорный (может, даже я что-нибудь и напутал тут), т.к. делать кучу IF'ов - глюк. Подумай, как это можно организовать красиво (может, в цикле). Но смысл, думаю, понятен?

Вообще советую сначала попробовать предложенный вариант, а затем уже задавать по нему вопросы ;)
 

Сенсей

Новичок
SaNeK
Мне идея понравилась... вобщем соорудил тут.. вроде цивильно не?

PHP:
$i_am = array(
1 => 'Служу в армии',
2 => 'Работаю',
4 => 'Учусь',
8 => 'Закончил армию',
16 => 'В поисках работы',
32 => 'Подрабатываю',
64 => 'Бездельничаю'
);

$u_is = 120;

foreach ($i_am as $key => $value)
{
   if ($u_is & $key)
   {
   	   echo $value.', ';
   }
}
 
Сверху