[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: У каждый группы своя страница
Renden
Hellow, небольшая задачка.
Дано:
бд
  • пользователи с id name ugroup access
  • группы id name
  • набор страниц для разных групп


Надо так, если пользователь находиться в $a группе отображаеть ему $a, т.е определенную страницу, если в $b отображать $b страницу ну и тд. Это сделать не проблема спомощью запроса wthere в бд, вопрос как сделать так чтоб я (админ) мог дать доступ пользователю находящимся в группе $a к страницам $a $b и тд $n , ну и спобственно убрать этот доступ)
В таблице юзерс не хочеться прописывать десятки колонок с правами на каждую страницу отдельно, ктомуже надо чтоб колличество страниц и групп было расширяемо.
Как мона реализовать?





Спустя 18 минут, 1 секунда (17.09.2010 - 10:50) silius написал(а):
вопервых запрос не wthere а WHERE

в таблице у юзера добавь одну колонку (к примеру rule), и в ней добавляй права, к примеру прав может быть 2, тогда у пользователя с ограниченными правами в колонке rule будет стоять 1, а у пользователя с полными правами в колонке rule будет стоять 2

что то типа этого

Спустя 17 минут, 51 секунда (17.09.2010 - 11:08) SlavaFr написал(а):
надо зделать таблицу которая соединяет пользователя с групой и убрать
user: user_id, name, ...

user_to_group:
id_user, id_group

group:
group_id, group_name, .....

site:
site_id, site_url, ......

group_to_site:
group_id, seite_id, ...

Спустя 8 минут, 3 секунды (17.09.2010 - 11:16) Renden написал(а):
Цитата (silius @ 17.09.2010 - 07:50)
вопервых запрос не wthere а WHERE

в таблице у юзера добавь одну колонку (к примеру rule), и в ней добавляй права, к примеру прав может быть 2, тогда у пользователя с ограниченными правами в колонке rule будет стоять 1, а у пользователя с полными правами в колонке rule будет стоять 2

что то типа этого

Опечатался, такое чувство что все читают только между строк, толи я криво изъясняюсь..
Группы и так стоят у пользователя(ugroup), там 1 2 3 4 n , и права тоже стоят (acess) там 1 2 (Админ и юзер) и я написал что это реализовать я понимаю как, вопрос в том как сделать права на страницы, перечитай 1 пост)

SlavaFr, непонял , ониж и так могут выводиться по группам

$res = mysql_query("SELECT * FROM usersgroups ORDER BY id ASC"); //Выборка групп
while ($gr = mysql_fetch_array($res))
{
$res2 = mysql_query("SELECT * FROM users WHERE `ugroup` = '". $gr['id'] ."' ORDER BY `id` ASC"); //Выбор пользователей
while($staff = mysql_fetch_array($res2)) {
//вывод
}
}

Спустя 17 минут, 20 секунд (17.09.2010 - 11:33) SlavaFr написал(а):
я на сколько понял (поправь если ошибся), что тебе нужна возможность юзера ко многим групам причеслять, чтоб он мог работать со страницами, которые пренадлежат другим групам. это можно зделать посредством создания (n to n) отношения между юзером и группой.

Спустя 13 минут, 4 секунды (17.09.2010 - 11:46) Renden написал(а):
SlavaFr
Думаю ты правильно понял, тк я даже не понимаю как обьяснить, но попробую еще раз
Есть группы, у них есть своя персональная страница, например у группы "секретари" есть своя страничка где они хранят телефоны организации, но например кто-то из группы "Бухи" захотел тоже получить доступ к этой самой страничке, окромя своей.
Надо реализовать так чтоб добавление\удаление этих прав у определенного пользователя было легким, и + колличество групп - неизвестное, и колличесво страний неизвестное, и самое главное колличество групп не равно колличеству страниц, тк у 1 группы может быть и 1 и 2 и 10 персональных страниц. И пользователю не надо давать доступ ко всем страницам не своей группы, а на выбор например к 3 7 10 только...
Мне надо просто увидеть как это должно быть хотяб в теории..
А у тя я увидел то что ты приравниваешь...
Т.е у тя
group_to_site:
1 = 1
2 = 2
3 = 3
Или я чет не понимаю?

Спустя 47 минут, 32 секунды (17.09.2010 - 12:34) SlavaFr написал(а):
нет, я приравниваю типа
group_to_site:
group_id,seite_id
1,1
1,2
1,3

и таким оброзом создаю связь между группой номер 1 и страницами 1,2,3
если я хочу удалить страницу 3, то я в группе 1 удаляю просто в group_to_site строчку where group_id=1 and seite_id=3

если я хочу чтоб ктото из Бухов захотел получить доступ ко всем Секретарям, то ты
создаеш новую строчку в user_to_group где ты вносиш user_id от желаемого юзера и group_id группы секретарей. Если ты его хочеш с этой группы удалить, то ты просто удаляеш эту строчку.

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

Спустя 9 минут, 24 секунды (17.09.2010 - 12:43) Renden написал(а):
SlavaFr
Понял, спасибо, но это как-то все сложно реализуемо(.. попробую мб че получиться..

Спустя 4 минуты, 17 секунд (17.09.2010 - 12:48) SlavaFr написал(а):
вывод всех разрешонных страниц юзера будет выглядеть гдето так
SELECT distinct site.* FROM site inner join group_to_site on site.site_id=group_to_site.site_id
inner join groups on group_to_site.group_id=groups.group_id
inner join user_to_group on groups.group_id=user_to_group.group_id
where user_to_group.user_id=$user_id

Спустя 3 минуты, 12 секунд (17.09.2010 - 12:51) SlavaFr написал(а):
Цитата (Renden @ 17.09.2010 - 09:43)
SlavaFr
Понял, спасибо, но это как-то все сложно реализуемо(.. попробую мб че получиться..

если бы было легко, то в нас бы ненуждались.
А как в данной ситуации проще зделать, я к стате и незнаю.

Спустя 1 час, 29 минут, 55 секунд (17.09.2010 - 14:21) Ser18 написал(а):
Мне в голову пришел такой вариант
В таблице users создаем колонку dostup
и в неё вписываем id названия групп через пробел
Например: 1 2 3 - открыт доступ к группам с id 1,2 и 3
При обращении пользователя к определенной группе получаем из колонки dostup
разрешенные группы и при помощи функции strpos ищем есть ли совпадение с id темы, промер:
$a = " 1 4 55 5 45 "; //Полученные данные из таблицы users колонка dostup пробел должен быбть обязательно в начале и в конце строки, иначе не найдет первое и второе число
$r = "45"; // id группы
$s = strpos($a, " ".$r." "); Если есть совпадения, то укажет позицию в строке Пробелы чтоб не путались цифры такие как 4 и 45, 5 и 55
echo $a."<br>";
echo $s."<br>";
если есть переменная $s, то показываем сообщения этой группы, если нет то доступ к данной группе закрыт

Разрешить доступ к группе с id 7
Получаем данные из таблицы users колонка dostup
Получаем id группы которую хотим разрешить
$f = $dostup." "$id." ";
Перезаписываем колонку dostup

Удаление доступа к группе с id 5
Получаем данные из таблицы users колонка dostup
И заменяем ненужный нам id на пробел
$e = str_replace(" 5 ", " ",$a);
$a - строка полученная из БД
5 - id к которому надо закрыть доступ
Перезаписываем колонку dostup

На практике я так не пробовал

Спустя 37 минут, 47 секунд (17.09.2010 - 14:59) SlavaFr написал(а):
@Ser18 это типичная ошибка при дезайне базы данных пытатся (1 то n) отношения засунуть в один столбец. Для этих случаев делается дополнительная таблица и не только по тому, что все решается одним запросом, но и по причине референциального интегритета. Т.е удаление группы должно быть возможным только после удаления референцированых строчек в других таблицах, а твоя модель не может этого обеспечить на уровне базы данных.

Спустя 9 дней, 19 часов, 57 минут, 46 секунд (27.09.2010 - 10:56) Renden написал(а):
Занимался другой проблемой, но опять пришлось вернуться к этому..
Что-то у меня не получаеться приравнять и вывести так как говорил SlavaFr, итак:
Это таблица с правами на страницы где user_id это айди пользователя page_id айди доступных страниц..
user posted image
Сами страницы
user posted image
Сами юзеры
user posted image
Каким в данном случае должен быть запрос в бд на доступ к страницам?

Спустя 1 час, 59 минут, 17 секунд (27.09.2010 - 12:56) Renden написал(а):
Ребят, ну потратьте 5 минут.. помогите а..

Спустя 2 часа, 29 минут, 8 секунд (27.09.2010 - 15:25) Ser18 написал(а):
Вам как надо, чтоб пользователю показывались ссылки только на разрешенные группы или показывались все группы, но если пользователь выбирает запрещенную группу ему выдает отказ.

Спустя 28 минут, 38 секунд (27.09.2010 - 15:53) Renden написал(а):
Ser18
Чтоб запрос выбирал только разрешенные страницы, остальное я сам по вашему примеру сделаю. Я просто не умею делать сложные запросы с обьедиенением таблиц..

Спустя 23 минуты, 54 секунды (27.09.2010 - 16:17) Ser18 написал(а):
Я тоже не умею делать сложные запросы ))

Но может так попробовать

Обращаемся к таблице с id пользователя и id группы

while(mysql_fetch_assoc($result)) {

// Здесь делаем запрос на таблицу с группами WHERE page_id=$result['page_id']

}


$result['page_id'] - id разрешенной группы
page_id - из таблицы групп

Спустя 9 минут, 49 секунд (27.09.2010 - 16:27) SlavaFr написал(а):
Цитата (Renden @ 27.09.2010 - 07:56)
Что-то у меня не получаеться приравнять и вывести так как говорил SlavaFr

Так ты нечиго из того, что я предложил и не зделал.
В таком виде можеш групы забыть.
Если тебе надо по этим таблицам JOIN делать, то в начале переименуй твою таблицу "test" к примеру в user_page_view

узнать может ли Юзер $u_x посмотреть страницу номер $p_y
select * from  pages inner join user_page_view on pages.page_id=user_page_view.page_id
where user_page_view.user_id=$u_x and user_page_view.page_id=$p_y

если ни чего не выдает, значет нет права.

Спустя 16 часов, 34 минуты, 27 секунд (28.09.2010 - 09:02) Renden написал(а):
SlavaFr
Спасибо огромное.
Цитата

Так ты нечиго из того, что я предложил и не зделал.

Ну какраз таблица test должна была приравнивать)) И у тебя было просто 4 таблицы, а здесь 3.. а тк я еще плохо разбираюсь во всем возникли проблемы.
Еще раз спасибо..

Спустя 4 часа, 52 минуты, 7 секунд (28.09.2010 - 13:54) Renden написал(а):
SlavaFr
Прости пожалуйста что еще раз дергаю:

$qpages = mysql_query("select * from pages inner join user_page_view on pages.page_id=user_page_view.page_id
where user_page_view.user_id=
$UserID");
while ($page = mysql_fetch_array($qpages)) {
$show .= '<li><a href="page?id='.$page['page_id'].'">'.$page['name'].'</a></li>';
}

Это запрос на вывод всех доступных юзеру страниц..
А как сделать вывод всех недоступных?
если я меняю на ...where user_page_view.user_id<>'$UserID' фигня получаеться.
Нечаяно удалил пост..хотел отредактировать))

Спустя 52 минуты, 57 секунд (28.09.2010 - 14:47) SlavaFr написал(а):

select * from pages where page_id not in(select page_id from user_page_view where user_id=$UserID)

Спустя 1 час, 11 минут, 46 секунд (28.09.2010 - 15:58) Renden написал(а):
SlavaFr
к сожалению
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource

А все разобрался..другое название ячейки было..

Спустя 2 минуты, 37 секунд (28.09.2010 - 16:01) SlavaFr написал(а):
я подправил запрос, так как я вместо page_id pages_id написал.
к стате в следующий раз если чтото не работает, то ты mysql_error() смотри
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.