2012-10-19 37 views
3

所以我正在嘗試創建一個基本的用戶系統,在這個系統中我希望用戶能夠擁有多個角色。用戶系統 - MySQL數據庫中的多個角色

例如說我有角色如下:管理員,活動主辦單位,捐贈者

什麼是這些多個角色分配給用戶,然後檢查他們是否有這些角色的用於顯示一定的最好方式權限。

如果每個人只有一個角色,那麼它不會成爲一個問題,因爲我只是分配了Administrator = 10,Organizer = 5和Donator = 1,然後執行if語句來檢查MySQL數據等於這三個數字中的任何一個。

我無法想象有一種方法可以添加一個MySQL字段並用「Administrator,Donator」填充它,因此該用戶將擁有這兩個角色?

這僅僅是我需要創建3個單獨的字段,並將0或1放在這些字段中,並分別檢查每個字段的情況?

回答

7

使用多個表,並加入他們的行列:

User 
-------------- 
id name 
1 test 

Role 
-------------- 
id name 
1 Donator 
2 Organizer 
3 Administrator 

User_Role 
-------------- 
id user_id role_id 
1 1   1 
2 1   3 


SELECT * FROM User u 
    LEFT JOIN User_Role ur ON u.id = ur.user_id 
    LEFT JOIN Role r ON ur.role_id = r.id 
WHERE r.name = "Administrator"; 

查詢是比較容易,如果你知道你只有3個角色,他們很容易記住。

SELECT * FROM User u LEFT JOIN User_Role ur ON u.id = ur.user_id WHERE ur.role_id = 3; 
+0

好吧,現在我可以通過以下查詢獲得特定用戶在陣列中顯示的角色ID: SELECT role_id FROM wp_users u LEFT JOIN users_roles你打開u.id = ur.user_id哪裏? id ='$ user_ID' 我該如何製作它,因此它顯示了角色名稱而不是role_id。 – Tenatious

+1

** SELECT role.name AS name FROM wp_users u LEFT JOIN users_roles ur ON u.id = ur.user_id LEFT JOIN role r ON ur.role_id = r.id WHERE u.id ='$ user_ID'** - 您應該查看參數化查詢。 –

5

你將有一個角色用戶users_roles表:

roles表將容納您的用戶可以有不同的角色。在我的示例數據中,我聲明瞭管理員和捐贈者角色。

roles 
    id    unsigned int(P) 
    description varchar(15) 

+----+---------------+ 
| id | description | 
+----+---------------+ 
| 1 | Administrator | 
| 2 | Donator  | 
| .. | ............. | 
+----+---------------+ 

當然,您必須存儲有關您的用戶的信息。

users 
    id   unsigned int(P) 
    username varchar(32) 
    password varbinary(255) 
    etc. 

+----+----------+----------+-----+ 
| id | username | password | ... | 
+----+----------+----------+-----+ 
| 1 | bob  | ******** | ... | 
| 2 | mary  | ******** | ... | 
| .. | ........ | ........ | ... | 
+----+----------+----------+-----+ 

最後,你將兩個在users_roles表中綁在一起。在我的示例數據中,您可以看到bob是捐贈者,mary既是管理員又是捐助者。 user_idrole_id都是它們各自表的外鍵,它們一起構成此表的主鍵。

users_roles 
    user_id unsigned int(F user.id)\_(P) 
    role_id unsigned int(F role.id)/ 

+----+---------+---------+ 
| id | user_id | role_id | 
+----+---------+---------+ 
| 1 |  1 |  2 | 
| 2 |  2 |  1 | 
| 3 |  2 |  2 | 
| .. | ....... | ....... | 
+----+---------+---------+ 

這樣用戶可以擁有無​​限數量的角色。

+0

哈 - 你贏了,包括數據類型和索引/外鍵。 – kmfk

1

如果您不想爲這樣的小事情創建兩個新表。 您可以利用MySQL的內置SET數據類型,也可以存儲在逗號分隔的varchar作用和使用做FIND_IN_SET() 如查詢操作。

SELECT * FROM user WHERE FIND_IN_SET('admin', role)>0;

+----+----------+----------+----------------+ | id | username | password | role (varchar) | +----+----------+----------+-----------------+ | 1 | bob | ******** | admin | | 2 | mary | ******** | admin,role1 | | .. | ........ | ........ | role1,role2 | +----+----------+----------+-----------------+