PHP验证码异常:输入错误表单仍提交,正确输入也报错
修复你的联系表单CAPTCHA问题
嘿,我仔细看了你的代码,这两个CAPTCHA的bug其实都是小细节没处理到位,咱们一步步来解决:
问题1:正确输入验证码仍显示错误提示
你定义了接收验证码输入的变量是$captcha = $_POST['captcha-input'];,但在对比session中的验证码时,却用了一个未定义的变量$captchaUser!这就导致不管用户输入的验证码对不对,$_SESSION['CAPTCHA_CODE'] !== $captchaUser永远为真,自然会弹出错误提示。
修复方法:把对比语句里的$captchaUser替换成$captcha。
问题2:验证码输入错误时表单仍会提交
这里有两个核心原因:
- 你的验证码非空验证逻辑写错了:
if (!$_POST['captcha-input'] || filter_var($_POST['captcha-input'], FILTER_SANITIZE_STRING))中,filter_var返回的是过滤后的字符串,不是布尔值。只要用户输入了内容,后半部分就会被视为“真”,导致$errorCaptcha一直被设置,同时这个逻辑本身也不符合“检查是否为空”的需求。 - 在判断是否发送邮件的条件里,你没有检查
$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
相关产品推荐
相关产品推荐

