2009-09-05 4 views
2

사용자에게 권한을 부여하기 위해 관리자가 체크 할 수있는 확인란 집합이 있습니다. 필자의 경우 관리자는 Image on ImageShack 체크 박스를 클릭 할 수 있습니다. 이 확인란을 통해 사용자는 해당 국가/도시의 데이터를 볼 수 있습니다.쉬운 검색을 위해 데이터베이스에 데이터를 구성하는 방법

1) 가장 나중에 어떤 권한을 해결하는 방법 내 데이터베이스 2)에이 권한을 삽입하는 방법을 각 사용자가 허용 : 나는 folowing 것은 할 내 머리를 랙하려고

http://img205.imageshack.us/img205/4170/screenshotao.png

지금 당장, 각 확인란마다 많은 열을 내 db에 추가하고 거기에 1 또는 0을 넣을 생각입니다. 그런 다음 많은 if 함수를 사용하여 이들을 확인하십시오! 이것은 코딩 할 때 시간 낭비가 될 것입니다.

내가 할 수 있는게 더 있습니까? 어떤 도움을 주셔서 감사합니다!

답변

4

당신필요. 집합이다 다소 각 비트가 이름이있는 bit field :

ALTER TABLE user ADD COLUMN permissions SET(
    'States', 
    'Cities', 
    'Africa', 
    'Asia', 
    'Australia', 
    'Europe', 
    ... 
); 

선택 사용자 아시아에 대한 데이터를 볼 수 있습니다

SELECT * FROM user WHERE FIND_IN_SET('Asia',permissions) > 0; 

또는 아시아와 유럽 아니라 볼 수있는 모든 사용자를 선택을 아프리카 :

SELECT * FROM user WHERE permissions & 40 = 40 AND !(permissions & 4) 

내가 더 PHP에서 이러한 상수를 정의하는 것, 다음 코드는 꽤 읽을 수 있어야합니다

define('PERMISSION_STATES', 1); 
define('PERMISSION_CITIES', 2); 
define('PERMISSION_AFRICA', 4); 
define('PERMISSION_ASIA', 8); 
define('PERMISSION_AUSTRALIA', 16); 
define('PERMISSION_EUROPE', 32); 
# ... 

# Check if user can view data for Africa 
if ($user['permissions'] & PERMISSION_AFRICA) { 
    # ... 

# Check if user can Asia and Europe but not Africa 
if ($user['permissions'] & PERMISSION_ASIA 
    && $user['permissions'] & PERMISSION_EUROPE 
    && !($user['permissions'] & PERMISSION_AFRICA)) { 
    # ... 
+0

안녕하세요 Soulmerge, 사용자 권한을 PHP 상수와 비교할 때 왜 앰퍼샌드를 사용합니까? '=='와 같지 않습니까? 그것의 결코 보지 않는 경편 한 지름길과 같게 보인다. 깨달음 : – SolidSmile

+0

그것은 조금 현명한 연산자입니다 : http://us.php.net/manual/en/language.operators.bitwise.php – soulmerge

0

사용자 이름과 각 권한에 대한 열 수를 가진 사용 권한 테이블을 가질 수 있습니다.

이 (당신은 아마 제한된 용량을 필요로하기 때문에) 모든 데이터를 사용자 테이블을 작성하지 못하도록하지만 각 권한을보고 사용자 권한을 확인 할 수 있습니다

예를 들어

만큼 당신이 그들이로드되면 사용 권한을 추적 할 수있는 사용자 구조에서 특정 변수를 가지고
For Each Field 
    User.Permission[Field] = Field 
Next Field 

가 (지도/연관 배열이 좋은 것입니다.)

2

정규화 된 데이터베이스 접근 방식을 사용하면 사용자와 사용 권한간에 다 대 다 관계가 있습니다. 이 정보를 저장하려면 교차 테이블이 필요합니다.당신이 사용자에 대한 권한을 입력하면

CREATE TABLE UserPermissions (
    user_id INT NOT NULL, 
    perm_id INT NOT NULL, 
    PRIMARY KEY(user_id, perm_id), 
    FOREIGN KEY (user_id) REFERENCES Users (user_id), 
    FOREIGN KEY (perm_id) REFERENCES Permissions (perm_id) 
); 

, 각 권한에 대해 하나 개의 행을 입력

INSERT INTO UserPermissions (user_id, perm_id) VALUES 
(1234, 1), -- for Cities 
(1234, 5), -- for continent North America 
(1234, 17); -- for country Canada 

를 이제 북미 권한이있는 모든 사용자를 조회하는 것은 쉽다 :

SELECT Users.* 
FROM Users JOIN UserPermissions USING (user_id) 
WHERE perm_id = 5; 

특정 사용자에 대해 쉼표로 구분 된 사용 권한 목록을 가져올 수도 있습니다.

SELECT user_id, GROUP_CONCAT(Permissions.Name) AS perm_list 
FROM UserPermissions JOIN Permissions USING (perm_id) 
WHERE user_id = 1234 
GROUP BY user_id; 
관련 문제