邮箱表单已保存会话变量,但刷新/验证码失败后无法更新表单输入
问题排查与修复方案
核心问题分析
你的表单无法更新最新输入内容,根源在于以下几个代码缺陷:
- 会话未初始化:
send-email.php中操作$_SESSION前未调用session_start(),导致会话变量完全无法存储。 - 提交按钮判断错误:表单提交按钮的
name属性是send,但代码中判断的是$_POST['submit'],条件永远不成立,会话变量从未被设置。 - 验证码错误时未保存最新输入:验证码校验失败跳转前,未将本次提交的表单数据存入会话,返回表单时只能显示旧的历史内容。
- 邮件发送成功后未清空会话:成功发送后未清除会话变量,刷新页面会持续显示历史输入。
修复后的代码
修改send-email.php
<?php session_start(); // 必须先启动会话,才能操作$_SESSION // 获取本次提交的表单数据,兼容空值情况 $name = $_POST['name'] ?? ''; $email = $_POST['email'] ?? ''; $message = $_POST['message'] ?? ''; // 立即将最新输入存入会话,无论验证码是否正确 $_SESSION['name'] = $name; $_SESSION['email'] = $email; $_SESSION['message'] = $message; // 获取验证码输入 $captcha = $_POST['captcha'] ?? ''; // 验证码校验失败,跳转回表单并携带错误标识 if ($captcha != 'unicorn') { header('Location: index.php?error=captcha'); exit; } // 邮件发送逻辑 $to = 'email@example.com'; $subject = 'New email from contact form'; $email_content = "Name: $name\n"; $email_content .= "Email: $email\n\n"; $email_content .= "Message:\n$message\n"; $email_headers = "From: $name <$email>"; mail($to, $subject, $email_content, $email_headers); // 发送成功后清空会话变量,避免刷新页面重复显示历史内容 unset($_SESSION['name'], $_SESSION['email'], $_SESSION['message']); header('Location: index.php?success=1'); ?>
优化index.php(增加成功提示)
在错误提示代码块后添加:
<?php if (isset($_GET['success'])) { echo '<p>邮件发送成功!</p>'; } ?>
修复说明
- 添加
session_start():确保会话功能正常启用,实现$_SESSION变量的读写。 - 移除错误的按钮判断:直接将表单数据存入会话,保证每次提交都能保存最新输入内容。
- 验证码错误前先存数据:跳转回表单时,会话中已存储本次提交的内容,页面会自动显示最新输入。
- 发送成功后清空会话:避免用户刷新页面时重复看到历史表单内容,符合常规交互逻辑。
内容的提问来源于stack exchange,提问作者eskilla
相关产品推荐
相关产品推荐

