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

邮箱表单已保存会话变量,但刷新/验证码失败后无法更新表单输入

问题排查与修复方案

核心问题分析

你的表单无法更新最新输入内容,根源在于以下几个代码缺陷:

  • 会话未初始化: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>';
}
?>

修复说明

  1. 添加session_start():确保会话功能正常启用,实现$_SESSION变量的读写。
  2. 移除错误的按钮判断:直接将表单数据存入会话,保证每次提交都能保存最新输入内容。
  3. 验证码错误前先存数据:跳转回表单时,会话中已存储本次提交的内容,页面会自动显示最新输入。
  4. 发送成功后清空会话:避免用户刷新页面时重复看到历史表单内容,符合常规交互逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:35:22