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

PHP数学验证码验证失败求助:注册时始终返回无效提示

问题分析与解决方案

嘿,我一眼就瞅出你这个验证码的核心问题啦——每次调用Captcha()方法时,都会重新生成一个全新的$random随机数!这就导致了离谱的情况:

  • 你显示验证码问题时,生成了比如随机数7,给用户展示"What is 7 + 7"
  • 用户输入14提交验证,结果调用方法时又生成了新的随机数比如12,计算的答案变成24,用户输入的14自然和24不匹配,永远返回"无效验证码"

下面给你修正后的思路和代码,帮你搞定这个问题:

修正后的验证码类实现

我们需要把生成的随机数存到Session里,这样显示和验证时用的是同一个值:

<?php 
namespace forum; 

require_once 'core/database.php'; 
require_once 'classes/Redirect.php'; 

session_start(); // 确保Session已启动,如果项目入口已经加过就可以删掉这行

Class Captcha{ 
    // 专门用来生成验证码问题,同时把随机数存到Session
    public static function generateCaptcha() {
        $random = rand(1, 15);
        $_SESSION['captcha_random'] = $random; // 把随机数存起来,供验证时用
        return 'What is ' . $random . ' + ' . $random . '?';
    }

    // 专门用来验证用户输入的答案
    public static function verifyCaptcha($sol) {
        // 先判断用户没输入或者Session里没存随机数的情况
        if (empty($sol) || !isset($_SESSION['captcha_random'])) {
            return false;
        }
        $random = $_SESSION['captcha_random'];
        $answer = $random + $random;
        // 验证完就把Session里的随机数删掉,防止重复使用
        unset($_SESSION['captcha_random']);
        return $sol == $answer;
    }
}

使用示例

  1. 在注册页面显示验证码的时候,调用生成方法:
echo Captcha::generateCaptcha();
  1. 用户提交表单后,调用验证方法:
$userInput = $_POST['captcha_solution']; // 假设你表单里的验证码输入框name是captcha_solution
if (!Captcha::verifyCaptcha($userInput)) {
    echo '无效验证码';
    Redirect::back(); // 跳回注册页面重新输入
} else {
    // 验证码正确,继续处理用户注册的逻辑就好啦
}

额外提醒

  • 一定要确保session_start()在页面输出任何内容之前调用,不然会报错,通常可以把它放在项目的入口文件最顶部。
  • 验证后删除Session里的随机数,能避免用户重复提交同一个验证码,安全性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:47:35