PHP区分普通用户与管理员登录的if else逻辑报错问题
问题根因
你的权限判断分支完全失效,核心错误是管理员身份判断的条件类型不匹配:
你写的判断if ($value['User'] == $users)里,$value['User']是当前登录的用户名字符串(比如admin),但$users是存了两个管理员账号的二维数组,字符串和数组永远不可能相等,所以这个判断永远返回false,哪怕登录的是管理员账号也只会走普通用户的分支。
除此之外代码还有几个隐藏bug会导致运行异常:
Login.php里没有调用session_start(),直接读$_SESSION['captcha']会报会话未初始化的错误- 直接把
$_SESSION['newUsers']传入array_merge,如果这个会话值不存在(比如还没注册过新用户),会抛出数组合并警告 - 遍历用户列表匹配到结果后没有终止循环,会继续遍历后续用户,可能重复输出错误提示
- 没有处理「用户名不存在」的边界场景,输入不存在的账号时页面没有任何提示
修复方案
- 单独提取管理员用户名列表,用
in_array()判断当前登录用户是否为管理员,不要拿字符串和整个数组做对比 - 给
Login.php顶部加上会话初始化逻辑 - 补全边界值判断,避免不存在的变量引发报错
- 匹配到登录结果后立刻终止循环,避免重复输出
修正后代码
Login.php
<?php session_start(); ?> <form action="LoginValidator.php" method="POST"> <div class="login"> <h3>Login Here</h3> <label for="username">Username</label> <input type="text" placeholder="User name" id="username" name="username" required> <label for="password">Password</label> <input type="password" placeholder="Password" id="password" name="password" required> <p>Enter this number: <?php echo $_SESSION['captcha']; ?></p> <p><input type="text" name="code" required /> <button>Log In</button> <p> Don't have any account yet? <br> <a href="registration.php"> Register Here </a></p> </div> </form>
LoginValidator.php
<?php session_start(); // 预设管理员账号列表 $adminUsers = [ ["User" => "admin", "Password" => "admin"], ["User" => "administrator", "Password" => "administrator"], ]; // 提前提取所有管理员用户名,用于权限判断 $adminNameList = array_column($adminUsers, 'User'); // 处理注册用户列表不存在的边界情况 $newUsers = isset($_SESSION['newUsers']) ? $_SESSION['newUsers'] : []; $mergedUsers = array_merge($adminUsers, $newUsers); $userName = $_POST['username']; $password = $_POST['password']; $codeinput = $_POST['code']; $loginFlag = false; foreach ($mergedUsers as $userInfo) { // 先匹配用户名 if ($userName != $userInfo['User']) { continue; } // 用户名匹配后校验密码 if ($password != $userInfo['Password']) { echo "Wrong password"; break; } // 密码正确后校验验证码 if ($codeinput != $_SESSION['captcha']) { echo "Captcha NOT valid"; break; } // 所有校验通过 echo "Captcha valid"; echo "<p>Login successful<3</p>"; // 权限判断 if (in_array($userInfo['User'], $adminNameList)) { echo "Welcome admin!"; // 管理员展示所有用户列表 echo "<pre>All user list: " . print_r($mergedUsers, true) . "</pre>"; } else { echo "Welcome user!"; } $loginFlag = true; break; } // 遍历完没匹配到对应用户名 if (!$loginFlag) { echo "User does not exist"; } ?>
改动说明
- 修复了核心的权限判断逻辑,管理员身份识别正常,登录后会正确展示用户列表
- 补全了会话初始化逻辑,验证码可以正常读取校验
- 加了空值判断,不会因为新用户列表不存在抛出警告
- 优化了遍历逻辑,匹配到结果立刻终止,不会出现重复输出的问题
- 补了账号不存在的提示,交互逻辑完整
内容的提问来源于stack exchange,提问作者Xen
相关产品推荐
相关产品推荐

