You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP区分普通用户与管理员登录的if else逻辑报错问题

问题根因

你的权限判断分支完全失效,核心错误是管理员身份判断的条件类型不匹配:
你写的判断if ($value['User'] == $users)里,$value['User']是当前登录的用户名字符串(比如admin),但$users是存了两个管理员账号的二维数组,字符串和数组永远不可能相等,所以这个判断永远返回false,哪怕登录的是管理员账号也只会走普通用户的分支。

除此之外代码还有几个隐藏bug会导致运行异常:

  • Login.php里没有调用session_start(),直接读$_SESSION['captcha']会报会话未初始化的错误
  • 直接把$_SESSION['newUsers']传入array_merge,如果这个会话值不存在(比如还没注册过新用户),会抛出数组合并警告
  • 遍历用户列表匹配到结果后没有终止循环,会继续遍历后续用户,可能重复输出错误提示
  • 没有处理「用户名不存在」的边界场景,输入不存在的账号时页面没有任何提示
修复方案
  1. 单独提取管理员用户名列表,用in_array()判断当前登录用户是否为管理员,不要拿字符串和整个数组做对比
  2. 给Login.php顶部加上会话初始化逻辑
  3. 补全边界值判断,避免不存在的变量引发报错
  4. 匹配到登录结果后立刻终止循环,避免重复输出

修正后代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 12:09:27