【问题标题】:Set file privileges in navigational menu with php使用 php 在导航菜单中设置文件权限
【发布时间】:2015-08-12 00:53:39
【问题描述】:

您好,提前感谢您的帮助。我正在开发一个更强大的版本,但我需要一些短期的东西。我们创建了对管理面板的 2 层用户访问权限。员工和管理员。下面的代码是我们在短期内实现的较长版本的一个简短版本示例。首先,我想检查他们的访问级别是 1 级还是 0 级。这是 OOP 中的一种方法。

    function menuPriviledge($dbCon){

        $username = $_REQUEST['username'];

        if($accessLevel = $this->dbConnection->query("SELECT access FROM UserProfiles WHERE username = '$username' LIMIT 0, 1")){
            while($accessData = $accessLevel->fetch_assoc()){
                $access = $accessData['access'];
            }
        }

在我完成回显此顶部部分后,我得到了正确答案,我得到了与帐户中当前用户名相关联的访问级别 1。这就是我一直在寻找的,所以我们很好,但是在下一个 if 语句中,我测试变量 $access 是否 = 1(下面的语句)如果它等于 1 我调用 printf 并显示当前列表为管理员准备的导航菜单,否则会为页面访问受限的员工显示不同的预设菜单。

            if(isset($access)){

                switch($access){

                case 1: 
                    $query = "SELECT * FROM CVCUserFilePrivileges";
                    if($files = $this->dbConnection->query($query)){
                        while($access = $files->fetch_assoc()){
                            printf("<li><a href=\"%s\"><i class=\"icon-angle-right\"></i>Directory Listings</a></li>
                                <li><a title=\"Ads Manager\"><i class=\"icon-laptop\"></i>Ads Manager<span>5</span></a>
                                    <ul>
                                        <li><a href=\"%s\"><i class=\"icon-angle-right\"></i>Dealer Paid Listings</a></li>
                                        <li><a href=\"%s\"><i class=\"icon-angle-right\"></i>Listing Side Ads</a></li>
                                        <li><a href=\"%s\"><i class=\"icon-angle-right\"></i>Scrap Metal Page Ads</a></li>
                                        <li><a href=\"%s\"><i class=\"icon-angle-right\"></i>Coin Request Page Ads</a></li>
                                        <li><a href=\"%s\"><i class=\"icon-angle-right\"></i>Dealer Form Page Ads</a></li>
                                    </ul>                   
                                </li>", $access['directoryList'], $access['dlrPaidListing'], $access['listingSideAds'], $access['scrapMetalAds'], $access['coinRequestAds'], $access['dlrFormAds']);
                        }
                    }
                break;
                case 0:
                    $query = "SELECT * FROM CVCUserFilePrivileges";
                    if($files = $this->dbConnection->query($query)){
                        while($access = $files->fetch_assoc()){
                            printf("<li><a href=\"%s\"><i class=\"icon-angle-right\"></i>Directory Listings</a></li>
                                <li><a title=\"Ads Manager\"><i class=\"icon-laptop\"></i>Ads Manager<span>1</span></a>
                                    <ul>
                                        <li><a href=\"%s\"><i class=\"icon-angle-right\"></i>Dealer Paid Listings</a></li>
                                    </ul>                   
                                </li>", $access['directory'], $access['dlrPaidListing']);
                        }
                    }
                break;
                default:
                    echo "There is an error, no access level set, contact your database administrator";
                }
            }

当它半工作时,它会继续将首页链接添加到其下方的每个导航选项,因此每个导航选项都指向同一页面。当它不起作用时,它会完全消失,导航甚至不存在。我希望我能够很好地解释这一点。问题似乎出在我在显示导航菜单之前测试其访问级别的 if 语句上。

【问题讨论】:

  • 嗨@RookieRecruits ...首先:对于良好的做法,您必须在if 语句之前启动$access 变量。第二:如果您的用户只有两种访问权限,则不需要使用else if。只有else 标签。第三:您的 SQL 查询在 AdministratorEmployees 两种情况下都是相同的。
  • 谢谢@ThiagoAugustusOliveira 我会在没有elseif的情况下尝试它,sql查询是相同的,因为每个访问级别可用的文件数量已经预先确定并硬编码到php中。上面我只显示了 1 个
  • 标签,但在实际版本中,它们在导航中会有不同数量的页面。这会为我争取时间。
  • 你有什么进展吗?
  • 没有还在努力解决。 @ThiagoAugustusOliveira 希望今天能完成这项工作。
  • 标签: php mysql privileges


    【解决方案1】:

    将代码改为:

    if(isset($access)) {
    
        switch($access) {
    
            case 1:
               // do the code
               break;
    
            case 2:
               // do the code
               break;
    
        }
    }else{
        echo "access not set";
    }
    

    试试这个。

    Ps.: 1 与“1”不同。你把你的 sql 字段设置为 int 了吗?

    【讨论】:

    • @ThiagoAugustusOliveira 我将语句更改为 switch 语句,但目前无法正常工作。试过这个,但我仍然得到一个空白菜单。它只是没有出现。我更改了数据库以使访问列 INT 并使用 1 而不是 '1' 其他一切正常,除非它进入 switch 语句。有没有办法将其发布在此以便您可以看到更新?谢谢你们的帮助。
    • 让我们尝试调试它。评论switch语句并输入echo $access;看看输出是什么,请告诉我。
    • 我之前做过,它给了我一个正确的 1。我只是仔细检查了它。早些时候我还拿走了 printf(" ");变成并回显并将末尾的数据更改为菜单内部,以查看是否有效但仍收到空响应。没有出现菜单。
    • 我注意到,当我取出 while 语句时,它会显示,但只有列表中的第一个链接附加到每个导航选项卡,因此您只能转到一个页面。
    • 哦,很高兴为您提供帮助!是的,使用这种语法,它变得更容易阅读和运行。赞一个!
    【解决方案2】:

    为了在保护页面的同时充分发挥作用,我添加了这个简单的代码来存储在登录过程中登录的当前用户名

            session_start();
                $_SESSION['username'] = $user;
    

    然后我添加了一个包含类似于以下语法的包含文件。

    session_start();
    if(isset($_SESSION['username'])){
        $userId = $_SESSION['username'];
    } else {
        echo "You don't have credentials to enter...";
        exit();
        die();
    }
    

    此包含已添加到所有文件中,或者我还可以选择将所有页面中的常见包含文件包含到包含所有常见包含()的包含文件中;文件。现在它限制访问,除非有人登录,但如果有人有更好的方法来优化此代码,请告诉我。我认为这个版本简单明了。任何人都可以推荐的任何其他安全级别,请随时告诉我。其他人可能也可以使用它。

    现在根据$userId 中存储的用户名,它将提供正确的菜单。

    菜单的语法类似于下面的内容。

    class menu{
    
        public function __construct($dbCon){
            $this->dbConn = $dbCon;
        }
    
        function menuPriviledges($dbCon){
    
            global $userId;
    
                if($accessLev = $this->dbConn->query("SELECT access FROM UserProfiles WHERE userId = '$userId'")){
                    while($Data = $accessLev->fetch_assoc()){
                        $access = $Data['access'];
                    }
                }
    
                if($access == 1){
                    include('common-menu-admin.php');
                } elseif($access == 0) {
                    include('common-menu-employee.php');
                }
    
        }
    }
    

    现在一切正常,而且速度也很快!

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签