You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PHP登录系统如何新增验证另一数据表中的激活码?

解决PHP登录系统添加激活码验证的问题

没问题,我来帮你把激活码验证的逻辑整合到现有登录系统里!核心思路是在验证完用户名和密码的有效性之后,再去act_codes表中校验用户输入的激活码是否存在且有效。

修改后的完整代码

if(empty($username_err) && empty($password_err) && empty($code_err)){ 
    // 第一步:验证用户名和密码
    $sql = "SELECT username, password FROM users WHERE username = ?"; 
    if($stmt = mysqli_prepare($link, $sql)){ 
        mysqli_stmt_bind_param($stmt, "s", $param_username); 
        $param_username = $username; 
        if(mysqli_stmt_execute($stmt)){ 
            mysqli_stmt_store_result($stmt); 
            if(mysqli_stmt_num_rows($stmt) == 1){ 
                mysqli_stmt_bind_result($stmt, $username, $hashed_password); 
                if(mysqli_stmt_fetch($stmt)){ 
                    if(password_verify($password, $hashed_password)){ 
                        // 第二步:验证激活码
                        $sql_code = "SELECT act FROM act_codes WHERE act = ?";
                        if($stmt_code = mysqli_prepare($link, $sql_code)){
                            mysqli_stmt_bind_param($stmt_code, "s", $param_code);
                            $param_code = $code; // 确保$code是用户输入的激活码值
                            if(mysqli_stmt_execute($stmt_code)){
                                mysqli_stmt_store_result($stmt_code);
                                // 检查激活码是否存在
                                if(mysqli_stmt_num_rows($stmt_code) == 1){
                                    // 可选:如果激活码是一次性使用,这里可以添加标记已使用的逻辑
                                    // $sql_update = "UPDATE act_codes SET used = 1 WHERE act = ?";
                                    // 执行UPDATE语句...

                                    // 所有验证通过,创建会话并跳转
                                    session_start(); 
                                    $_SESSION['username'] = $username; 
                                    $_SESSION['code'] = $code; 
                                    header("location: welcome.php");
                                    exit; // 跳转后记得终止脚本执行
                                } else {
                                    $code_err = 'Invalid or unused activation code.';
                                }
                            } else {
                                $code_err = 'Oops! Failed to verify activation code. Please try again later.';
                            }
                            mysqli_stmt_close($stmt_code);
                        }
                    } else{ 
                        $password_err = 'The password you entered was not valid.'; 
                    } 
                } 
            } else{ 
                $username_err = 'No account found with that username.'; 
            } 
        } 
        mysqli_stmt_close($stmt); 
    } 
}

关键修改说明

  1. 新增激活码验证流程:在密码验证成功后,新增了对act_codes表的查询,检查用户输入的激活码是否存在于act字段中。
  2. 错误处理:如果激活码无效或查询失败,会设置对应的$code_err错误信息,和原有错误提示逻辑保持一致。
  3. 可选优化:如果你的激活码是一次性使用的,建议在验证成功后更新act_codes表(比如新增一个used字段,标记为已使用),避免同一个激活码被重复利用。
  4. 安全提示:如果需要更严格的验证,可以考虑给act_codes表添加用户关联字段(比如username),确保某个激活码只能对应特定用户登录,防止他人盗用激活码。

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

火山引擎 最新活动