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

基于数据库角色的多角色登录功能实现技术问询

完善基于角色的登录验证与跳转功能

原代码的核心问题是未从数据库读取用户真实角色,仅根据用户勾选状态直接跳转或报错,无法满足「验证数据库中身份是否匹配」的需求。以下是修正后的完整实现:

1. 修正HTML复选框代码

原代码中<input>标签缺少左尖括号,先修复表单元素:

<label class="selecttype"> Select if you're an Electrician
    <input type="checkbox" name="type_1" value="Electrician">
    <span class="checkmark"></span>
</label>

2. 完善PHP登录逻辑

假设你的users数据表包含role字段(存储值为Homeowner或Electrician),以下代码实现了完整的角色验证、错误提示与页面跳转逻辑:

if (isset($_POST['login_user'])) {
    $username = trim($_POST['username']);
    $password = trim($_POST['password']);
    // 用户选择的角色:未勾选复选框默认设为Homeowner
    $selected_role = isset($_POST['type_1']) ? $_POST['type_1'] : 'Homeowner';
    $errors = [];

    // 基础字段验证
    if (empty($username)) {
        $errors[] = "Username is required";
    }
    if (empty($password)) {
        $errors[] = "Password is required";
    }

    if (empty($errors)) {
        // 使用预处理语句防止SQL注入
        $query = "SELECT id, username, password, role FROM users WHERE username = ?";
        $stmt = mysqli_prepare($db, $query);
        mysqli_stmt_bind_param($stmt, "s", $username);
        mysqli_stmt_execute($stmt);
        $result = mysqli_stmt_get_result($stmt);

        if (mysqli_num_rows($result) === 1) {
            $user = mysqli_fetch_assoc($result);
            // 验证密码(推荐用password_verify,需配合注册时的password_hash加密)
            // 若仍使用md5可替换为:$user['password'] === md5($password)
            if (password_verify($password, $user['password'])) {
                // 对比用户选择的角色与数据库真实角色
                if ($selected_role === $user['role']) {
                    // 验证通过,跳转对应角色页面
                    $redirect_url = $selected_role === 'Homeowner' ? 'homeowner.php' : 'electrician_dashboard.php';
                    header("Location: {$redirect_url}");
                    exit; // 跳转后必须终止代码执行,避免后续逻辑干扰
                } else {
                    // 角色不匹配时给出对应错误提示
                    if ($selected_role === 'Electrician') {
                        $errors[] = "You're not an Electrician";
                    } else {
                        $errors[] = "Your account is registered as an Electrician, please check the checkbox";
                    }
                }
            } else {
                $errors[] = "Invalid username or password";
            }
        } else {
            $errors[] = "Invalid username or password";
        }
        mysqli_stmt_close($stmt);
    }

    // 可在此处输出错误信息(例如渲染到页面)
    // foreach($errors as $error) { echo "<div class='error'>{$error}</div>"; }
}

关键改进说明

  • 角色验证逻辑:从数据库读取用户真实角色,与用户选择的角色做严格对比,确保身份匹配
  • 安全优化:使用mysqli预处理语句避免SQL注入风险,替换不安全的md5加密为password_verify(需在用户注册时用password_hash生成密码哈希值)
  • 跳转安全性:跳转后添加exit语句,防止后续代码意外执行
  • 错误提示细化:针对不同的角色不匹配场景,给出精准的提示信息

内容的提问来源于stack exchange,提问作者DevAlvarico

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:15:33