PHP 无法将验证码字符串与用户输入的字符串进行比较

PHP Can't compare a CAPTCHA string with the user typed in string

我创建了一个登录系统,还有一个 CAPTCHA 字符串,它将生成随机字符并创建一个 A1B2C3 形式的字符串,包括大写和小写字母。那是代码:

$cArr1 = array_merge(range("a", "z"), range("A", "Z"));
$cArr2 = range("1", "9");
$captcha = $cArr1[rand(0, 51)].$cArr2[rand(0,8)].$cArr1[rand(0, 51)].$cArr2[rand(0,8)].$cArr1[rand(0, 51)];

这是暗示验证码的表单片段:

<?php echo "<legend>Please type in the following CAPTCHA: <b>".$captcha."</b></legend>";  ?><div style="margin-top: 5px;"></div>
<input type="text" name="captcha" placeholder="A1B2C3" class="textbox" required><div style="margin-top: 10px;"></div>
<input type="submit" name="btn" value="Register" class="btn">

例如,对于生成的值:A3z5Q7,输出将是:

Please type in the following CAPTCHA: A3z5Q7
//textbox//
//button//

这就是我获取验证码输入的方​​式:

$captchaA = $_POST['captcha'];

问题是,比较 if (strval($captchaA) == $captcha) 不起作用,它总是继续 else 语句,返回 Wrong captcha.

登录表单在没有验证码的情况下也能完美运行,这就是为什么我决定不提供代码的其他部分,如 $user = $_POST['user'];

我也决定在比较中使用strval(),因为我看到$captchaA()是一个混合变量,而$captcha被认为是一个字符串。至少,VSCode 是这么告诉我的。

有什么建议吗?如果您需要更多详细信息,请使用评论部分,我会尽快提供给您。谢谢!

PHP 不会跨请求保留变量 - 问题是在生成表单后,原始验证码丢失了。处理 POST 时会生成一个新的验证码,这就是为什么它永远不会匹配用户提交的内容。

解决方案是保留原始验证码(例如在会话中),以便稍后检索它进行比较。