0

私は次のようにデータベーステーブルを設定しました:

table: group
id     name          subGroupOf
1      grandparent   NULL
2      parent           1
3      child            2

これが私がphpでやろうとしていることです:

ユーザーがページにアクセスすると、ページはauth()関数に「子」権限が必要であることを通知します。「子」は「親」のサブグループであるため、両方のグループのメンバーが許可を得る必要があります。ただし、親は「祖父母」のサブグループであるため、3つのグループすべてのメンバーがアクセスできる必要があります。

ネストできるサブグループの数に制限はないので、ループが必要になることはわかっていました。しかし、私は完全に空白を描いています。

グループがsubGroupOfであるかどうかを確認し、そうである場合は親グループを検証する必要があることはわかっています。これが私がこれまでに持っているものです:

        // Get group of current user
        $group = mysqli_query($cxn,'SELECT group FROM user WHERE id='.$userID);

        // Compare group to permissions
        if($group == $permissions)
            return TRUE;

        // Check if group is a sub group
        $subGroupOf = mysqli_query($cxn,'SELECT subGroupOf FROM group WHERE id="'.$group.'"');
        if($subGroupOf == NULL)
        {
            // Wrong permissions
        }

        // Check if the parent group matches permissions
        if($subGroupOf == $permissions)
            return TRUE;

どういうわけか私はその最後の部分をループし、それが到達したときに停止する必要があります

$subGroupOf == NULL

私はプログラミングにかなり慣れていないので、まだロジックを理解しています...何かアイデアはありますか?私のためにすべてを書く必要はありません(そのコードはとにかく要約されています)、構造を理解するのに助けが必要です。

4

2 に答える 2

0

これは、サブグループをチェックし、「subGroupOf」IDがNULLになるまで継続する再帰関数を介して実行できます。

例えば:

function getTopParentGroup($groupId, $cxn) {
    $subGroupOf = mysqli_query($cxn,'SELECT subGroupOf FROM group WHERE id="'.$groupId.'"');

    //There is no parent, just return the group
    if($subGroupOf == NULL)
    {
        return $group;
    }
    //A parent has been found, continue...  
    getTopParentGroup($subGroupOf, $cxn);
}
于 2012-09-12T19:16:57.257 に答える
0

別の方法ですが、再帰用の関数が必要です。

  1. グループの階層を配列に追加する関数を作成します
  2. グループの配列をループして、権限を確認します。

関数

function getGroupHierarchy($groupId, $cxn)
{
    $groupArray = array();

    //Push the group to the array..
    $groupArray[] = $groupId;

    //Get the parent id of this group
    $subGroupOf = mysqli_query($cxn,'SELECT subGroupOf FROM group WHERE id="'.$groupId.'"');

    //There is no parent, just return the array.
    if($subGroupOf == NULL)
    {
        return $groupArray;
    }

    //Continue checking the parent group(s).
    getGroupHierarchy($subGroupOf, $cxn);
}

関数を呼び出し、権限と照合します。

// Get group of current user
$groupId = mysqli_query($cxn,'SELECT group FROM user WHERE id='.$userID);

$allGroups = getGroupHierarchy($groupId, $cxn);

//Compare each group to permissions.
foreach($groupArray as $group)
{
    if($group == $permissions)
        return TRUE;
}
于 2012-09-12T19:42:52.563 に答える