2014-04-30 2 views
0

여기 내 문제가 있습니다. 이 두 테이블과 PHP 코드가 있습니다.PHP MYSQL의 메뉴에 대한 사용자 액세스 권한

테이블

menu 
    ==== 
    m_id menu_name parent_menu_id menu_order menu_url status 
    1  M1   0    1   #   1 
    2  M2   0    2   #   1 
    3  S1   1    1   #   1 
    4  S2   1    2   #   1 


    user_rights 
    =========== 

    user_id   rights 
    1    1,2,3,4 
    2    1,2,3 

CODE

<?php 
    $get_user_id = $_GET['id']; // user id will be 1 or 2 
    mysql_connect("localhost", "root", "password") or die(mysql_error()); 
    mysql_select_db("booksdb") or die(mysql_error()); 
    $get_access_query = mysql_query("SELECT rights FROM user_rights where user_id='".$get_user_id."'"); 
    $fetch_access_list = mysql_fetch_row($get_access_query); 
    $get_access_list = $fetch_access_list[0]; 
?> 
<div id='mymenuclass'> 
    <ul> 
     <?php 
     foreach (explode(',', $get_access_list) as $n) { 
      $get_main_menu_query = mysql_query("SELECT * FROM menu where m_id='".$n."' and parent_menu_id='0' order by menu_order"); 
      $get_main_menu = mysql_fetch_assoc($get_main_menu_query); 
     ?> 
     <li class='has-sub'><a href='#'><span><?php echo $get_main_menu['menu_name']; ?></span></a> 
    <ul> 
     <?php 
     $get_sub_menu = mysql_query("SELECT * FROM menu_master where parent_menu_id='".$get_main_menu['m_id']."'"); 
     while($row = mysql_fetch_assoc($get_sub_menu)) { 
     ?> 
     <li class='has-sub'><a href='<?php echo $row['menu_url']; ?>'><span><?php echo $row['menu_name']; ?></span></a></li> 
     <?php } ?> 
    </ul> 
    </li> 
    <?php } ?> 
    </ul> 
</div> 

위의 쿼리는 첫 번째 수준 메뉴 잘 작동합니다. 그러나 서브 메뉴에 관해서는 모든 서브 메뉴를 표시하고 있습니다. 내가 잘못 된 곳을 모른다. 예를 들어

: user_id = 2은 1, 2, 3하지만 내 위의 코드는 1,2,3에 대한 권한을 부여하고 4.

내가 그것을 어떻게

을 제한 할 수 있습니다 만 메뉴에 액세스 할 수 있습니까?

어떤 도움이 필요합니까? 감사합니다,

Kimz

참고 :

내 코드는 정말 한심한입니다. 그것은 당신 같은 전문가를 혼란스럽게 할 것입니다. 하지만 제 요구 사항은 위에 설명되어 있습니다. 도와주세요. 당신에게 보상을 줄 수 있습니다.)

+0

부모 메뉴 id = 1에 대한 액세스 권한이있는 경우이 쿼리를 통해 내 부 메뉴를 제공하겠습니까? 'SELECT * FROM 메뉴에서 m_id = ' ". $ n."' ' –

+0

그럴 수는 없습니다. 각 메뉴는 user_rights 테이블로 점검해야합니다. 각 메뉴 (서브 메뉴 포함)는 인증 될 것입니다 – user3350885

+0

@RoyalBg 저는 PHP 코드를 다시 편집했습니다. – user3350885

답변

1

우선 사용자 액세스권이 혼재 된 권리와 메뉴 보유에 문제가 있기 때문에 데이터베이스를 표준화 할 것을 제안합니다. 둘째, mysql_ * lib를 사용하지 않기를 바란다. (아래 예제에서 필자는 그것을 바꾸지 않았다.) Pinoniq은 말했다. 셋째, HTML에서 쿼리를 혼란시키지 않아야합니다. 번역에서 쉽게 길을 잃어 버리고 문제를 찾을 수 없기 때문입니다. 이제

, 내가 여기에있는 문제는 다음과 같습니다

당신, 예를 들어, 스키마 다음했습니다

사용자 ID : 1 메인 메뉴 ID : 1 개 하위 메뉴 ID : 5 하위 메뉴 ID : 8 하위 메뉴 ID : 50 사용자 권한 : 1, 8, 50

당신은 주 메뉴 1 만 하위 메뉴 (8) 및 (50)에 액세스 할 수 있도록 사용자를 원하는, 5

없이 parent_menu_id가 0이 아니기 때문에, 아이 메뉴는 두 번째와 세 번째 조회 결과를 리턴하지 않을있다

SELECT * FROM menu where m_id='1' and parent_menu_id='0' order by menu_order 
SELECT * FROM menu where m_id='8' and parent_menu_id='0' order by menu_order 
SELECT * FROM menu where m_id='50' and parent_menu_id='0' order by menu_order 

8 이후 50 :으로

$get_main_menu_query = mysql_query("SELECT * FROM menu where m_id='".$n."' and parent_menu_id='0' order by menu_order"); 

이 하나는 바뀔 것이다. 첫 번째 결과 만 반환됩니다. `나에게 부모 ID 1에서 하위 메뉴를 제공합니다 : 당신이 말해하지 않았기 때문에, 5, 8, 50 :

나중에

$get_sub_menu = mysql_query("SELECT * FROM menu_master where parent_menu_id='".$get_main_menu['m_id']."'"); 

세 가지 결과를 반환하는

SELECT * FROM menu_master where parent_menu_id=1 

가 발생합니다 사용자에게 권한이있는 사용자

권리가 인출 된 곳으로 돌아가서 신청해야합니다. AND id = "fetchedRecordsFromUserRights"

로 설정해야 63,210

:

SELECT * FROM menu_master where parent_menu_id=1 AND id = 1; // 0 records 
SELECT * FROM menu_master where parent_menu_id=1 AND id = 5; // 0 records because 5 is not in RIGHTS 
SELECT * FROM menu_master where parent_menu_id=1 AND id = 8; // 1 record 
SELECT * FROM menu_master where parent_menu_id=1 AND id = 50; // 1 more record 

나는 당신이 당신의 권리 두 시간을 가져올 필요가 없습니다, 그래서 기능의 분할이 작업을 수행하려고 줄 것이다 다음 코드. 그러나 테스트하지 않았기 때문에 완벽하게 실행 가능하다는 보장은 없으며, 그렇지 않은 경우 직접 함수를 실행하여 어떤 함수가 잘못된 값을 반환하는지 확인해야합니다.

RIGHTS가 배열로 필요하지 않습니다. 당신이 문자열 1, 8, 50을 인출 한 경우

SELECT * FROM menu_master where parent_menu_id=1 AND id IN (1, 8, 50); 

가 어느 8, 50이 개 기록을 반환 할 수 있도록 MySQL은, IN() 연산자를 가지고있다.당신은 오직 당신이 이러한 저장할 수있는 '권리'의 소수가있을 것이라는 점을 알고있는 경우

, 나는 이미 제공 한 제안에 대한 대안으로 당신

<?php 
    $get_user_id = $_GET['id']; // user id will be 1 or 2 
    mysql_connect("localhost", "root", "password") or die(mysql_error()); 
    mysql_select_db("booksdb") or die(mysql_error()); 

    /** 
    * 
    * @param int $get_user_id 
    * @return string 
    */ 
    function getMenuRights($get_user_id) { 
     $get_user_id = intval($get_user_id); 
     $get_access_query = mysql_query("SELECT rights FROM user_rights where user_id='".$get_user_id."'"); 
     $fetch_access_list = mysql_fetch_row($get_access_query); 
     $get_access_list = $fetch_access_list[0]; 
     return $get_access_list; 
    } 
    /** 
    * 
    * @param int $get_user_id 
    * @return array 
    */ 
    function getUserMainMenus($get_user_id) { 
     $get_user_id = intval($get_user_id); 
     $rights = getMenuRights($get_user_id); 
     $get_main_menu_query = mysql_query("SELECT * FROM menu where m_id IN ($rights) and parent_menu_id='0' order by menu_order"); 
     while ($row = mysql_fetch_assoc($get_main_menu_query)) { 
      $results[] = $row; 
     } 
     return $results; 
    } 
    /** 
    * 
    * @param int $parent_menu_id 
    * @param int $get_user_id 
    * @return array 
    */ 
    function getUserChildMenu($parent_menu_id, $get_user_id) { 
     $parent_menu_id = intval($parent_menu_id); 
     $get_user_id = intval($get_user_id); 
     $rights = getMenuRights($get_user_id); 
     $get_sub_menu = mysql_query("SELECT * FROM menu_master where parent_menu_id='".$parent_menu_id."' AND id IN ($rights)"); 
     while($row = mysql_fetch_assoc($get_sub_menu)) { 
      $results[] = $row; 
     } 
     return $results; 
    } 
?> 
<div id='mymenuclass'> 
    <ul> 
     <?php foreach (getUserMainMenus($get_user_id) as $get_main_menu): ?> 
     <li class='has-sub'><a href='#'><span><?=$get_main_menu['menu_name']; ?></span></a> 
    <ul> 
     <?php foreach (getUserChildMenu($get_main_menu['m_id'], $get_user_id) as $row): ?> 
     <li class='has-sub'><a href='<?=$row['menu_url']; ?>'><span><?=$row['menu_name']; ?></span></a></li> 
     <?php endforeach; ?> 
    </ul> 
    </li> 
    <?php endforeach; ?> 
    </ul> 
</div> 
+0

우수함. 잘 작동합니다. – user3350885

0

PHP로 해결하려는 문제는 실제로 데이터베이스 레벨에서 해결되어야합니다. 권한 배열을 일반 텍스트로 저장합니다. 왜? 이제 특정 메뉴 항목에 대한 액세스 권한을 확인해야 할 때마다 모든 권한을 가져 와서 배열로 분해해야합니다.

그럼 데이터베이스 수준에서이 문제를 해결해 보겠습니다. 우리는 먼저 모든 것을 사람이 읽을 수있는 텍스트로 써서 이것을합니다. 구현은 그 후에 온다.

사용자가 있습니다 (테이블 사용자에 저장 됨). 모든 사용자는 0 개 이상의 메뉴 액세스 권한을 가질 수 있습니다. 그래서 이것은 다 - 대 - 다 관계입니다. 많은 사용자는 많은 메뉴 액세스 권한을 가질 수 있습니다.

테이블 users이 있으며 테이블 menu과 테이블 menu_rights (menu_access는 더 나은 이름이 될 것입니다)이 있습니다.

menu_rights 테이블은 사용자를 특정 menu.item에 연결합니다. 이 데이터베이스 대신 그 무시 무시한 폭발 작성하지의 모든 로직을 처리하도록 $ currentUser 당신에 액세스 할 수있는 모든 menu_items을 얻을 것인지, 그래서 지금 user_id

menu_id를 시작 menu_rights 테이블에 대해 우리에게 2 열을 제공합니다 어디서나 :

SELECT menu.* FROM menu,menu_rights WHERE menu.id = menu_rights.menu_id AND menu_rights.user_id = $current_user_id 

이제 SQL은 모든 액세스 권한 논리를 처리합니다. SQL은 모든 액세스 권한을 추적하기 때문에 깔끔합니다. 하나의 쿼리를 사용하여 액세스 할 수있는 모든 메뉴 항목을 검색 할 수 있습니다.

다음은 다른 메모입니다. 프로덕션 환경에서 코드를 사용하지 마십시오. 그냥하지 마.

0

에 대해 다시 한 코드입니다 비트 패션 : 15의 점수 사용자가 모든 권한을 즐길 동안이 설계에서

privilege _id 
1    
2 
4 
8 

는 3의 점수로 사용자는 권한 1 & 2를 즐길 것입니다.