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

PHP验证码异常:输入错误表单仍提交,正确输入也报错

修复你的联系表单CAPTCHA问题

嘿,我仔细看了你的代码,这两个CAPTCHA的bug其实都是小细节没处理到位,咱们一步步来解决:

问题1:正确输入验证码仍显示错误提示

你定义了接收验证码输入的变量是$captcha = $_POST['captcha-input'];,但在对比session中的验证码时,却用了一个未定义的变量$captchaUser!这就导致不管用户输入的验证码对不对,$_SESSION['CAPTCHA_CODE'] !== $captchaUser永远为真,自然会弹出错误提示。

修复方法:把对比语句里的$captchaUser替换成$captcha。

问题2:验证码输入错误时表单仍会提交

这里有两个核心原因:

  1. 你的验证码非空验证逻辑写错了:if (!$_POST['captcha-input'] || filter_var($_POST['captcha-input'], FILTER_SANITIZE_STRING))中,filter_var返回的是过滤后的字符串,不是布尔值。只要用户输入了内容,后半部分就会被视为“真”,导致$errorCaptcha一直被设置,同时这个逻辑本身也不符合“检查是否为空”的需求。
  2. 在判断是否发送邮件的条件里,你没有检查$errorCaptcha,所以即使验证码错误,只要其他字段没问题,表单还是会提交并发送邮件。

修复方法:

  • 把验证码非空验证改成只检查是否为空:if (!$_POST['captcha-input']) { $errorCaptcha = 'Please enter the captcha'; }
  • 在发送邮件的判断条件中加入!$errorCaptcha,确保所有验证都通过才发送邮件。

修改后的完整代码

<?php 
// 别忘了开启session,否则$_SESSION['CAPTCHA_CODE']无法获取!
session_start();

if (isset($_POST["submit"])) { 
    $name = $_POST['name']; 
    $email = $_POST['email']; 
    $message = $_POST['message']; 
    $captcha = $_POST['captcha-input']; 
    $from= 'From:' . $name . "\r\n" .'Reply-To:' . $email . "\r\n" .'X-Mailer: PHP/' . phpversion(); 
    $to = 'example@yahoo.com'; 
    $subject = 'Message from example.com'; 
    $body = "$message"; 

    // 初始化错误变量
    $errorName = $errorEmail = $errorMessage = $errorCaptcha = '';

    // 验证姓名
    if (!$_POST['name']) { 
        $errorName = 'Please enter your name'; 
    } 

    // 验证邮箱
    if (!$_POST['email'] || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { 
        $errorEmail = 'Please enter a valid email address'; 
    } 

    // 验证消息内容
    if (!$_POST['message']) { 
        $errorMessage = 'Please enter your message'; 
    } 

    // 验证验证码是否为空
    if (!$_POST['captcha-input']) { 
        $errorCaptcha = 'Please enter the captcha'; 
    } 

    // 验证验证码是否正确
    $result = '';
    if ($_SESSION['CAPTCHA_CODE'] !== $captcha) { 
        $result = '<div id="error" class="error">CAPTCHA has failed</div>'; 
    } 
    // 所有验证都通过才发送邮件
    else if (!$errorName && !$errorEmail && !$errorMessage && !$errorCaptcha) { 
        if (mail ($to, $subject, $body, $from)) { 
            $result='<div id="success" class="success">Thank You! I will be in touch</div>'; 
        } else { 
            $result='<div class="error">Sorry there was an error sending your message. </div>'; 
        } 
        // 清空POST数据
        $_POST = array(); 
    } 
} 
?>

另外还要注意:确保你的CAPTCHA生成代码已经开启了session_start(),并且正确将验证码存入$_SESSION['CAPTCHA_CODE'],否则这个对比还是会失效哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:02:55