PHP联系表单提交后跳转空白页且校验错误不显示如何解决
问题根因
- 提交按钮缺失
name属性:你的HTML代码中提交按钮没有设置name="submit",PHP代码入口判断isset($_POST['submit'])永远不成立,整个业务逻辑代码都不会执行,因此页面直接空白。 - 条件判断逻辑错误:当前
else分支仅和最后一个校验主题、留言的if语句绑定,就算姓名、邮箱校验失败,只要主题和留言非空,程序依然会执行发邮件+跳转逻辑,前面的错误提示会被跳转直接覆盖。 - 主题校验逻辑失效:下拉选的默认选项值为
basic,并非空值,原有empty($chosenSubject)判断永远触发不了,用户没选主题也能通过校验。 - 逻辑顺序不合理:先拼接邮件内容再做校验属于无效操作,且如果校验错误输出内容后再执行跳转,会报
headers already sent的系统错误。
修复方案
第一步:修改HTML提交按钮
给提交按钮添加name="submit"属性,确保PHP能接收到提交标识:
<button type="submit" class="send" name="submit">SEND</button>
第二步:重构PHP逻辑
调整校验顺序、修复判断逻辑,代码如下:
<?php // 开发阶段开启报错提示,上线后可关闭 error_reporting(E_ALL); ini_set('display_errors', 1); if (isset($_POST['submit']) && !empty($_POST)) { $myEmail = "xxxxxxxxxx"; $timeStamp = date("d/M/Y H:i:s"); // 修正原日期格式重复输出的问题 $error = []; // 先接收字段并去空格 $fullName = trim($_POST['fullName']); $customerEmail = trim($_POST['customerEmail']); $chosenSubject = trim($_POST['subject']); $message = trim($_POST['message']); // 姓名正则可根据需求调整,当前已支持带空格的英文名,要支持中文可替换为/^[\x{4e00}-\x{9fa5}a-zA-Z\s]+$/u $nameRegularExpression = "/^[a-zA-Z\s]+$/"; $emailRegularExpression = "/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/"; // 逐个字段校验,错误信息存入数组 if (empty($fullName) || !preg_match($nameRegularExpression, $fullName)) { $error[] = "您的姓名未填写或格式不正确"; } if (empty($customerEmail) || !preg_match($emailRegularExpression, $customerEmail)) { $error[] = "您的邮箱未填写或格式不正确"; } if ($chosenSubject == 'basic') { $error[] = "请选择咨询主题"; } if (empty($message)) { $error[] = "请填写留言内容"; } // 无错误才发邮件跳转 if (empty($error)) { $body = ""; $body .= "From: " . $fullName . " at $timeStamp" . "\r\n"; $body .= "Email: " . $customerEmail . "\r\n"; $body .= "Message: " . $message . "\r\n"; // 补充邮件头避免被判定为垃圾邮件 $headers = "From: $customerEmail" . "\r\n" . "Reply-To: $customerEmail" . "\r\n" . "X-Mailer: PHP/" . phpversion(); mail($myEmail, $chosenSubject, $body, $headers); header("Location: mail_sent.php"); exit(); // 跳转后必须终止代码执行 } else { // 输出所有错误提示 foreach ($error as $msg) { echo "<p>$msg</p>"; } } }
内容的提问来源于stack exchange,提问作者Daniel Radosa
相关产品推荐
相关产品推荐

