
本文详解如何在 php 表单验证通过后重定向至新页面,并安全传递用户输入数据,避免验证失败时页面刷新丢失错误提示,同时确保验证成功后跳转并展示提交内容。
本文详解如何在 php 表单验证通过后重定向至新页面,并安全传递用户输入数据,避免验证失败时页面刷新丢失错误提示,同时确保验证成功后跳转并展示提交内容。
在 PHP Web 开发中,常见的表单处理需求是:验证失败时保留在当前页并显示错误;验证成功后跳转至独立的确认/预览页展示数据。但直接使用 header('Location: ...') 跳转会导致 POST 数据丢失,无法在目标页获取用户输入——这正是你遇到的问题。
解决的核心在于:利用 PHP Session 在跳转前后持久化数据。Session 是服务器端存储机制,不受 HTTP 重定向影响,是传递表单数据最可靠的方式。
✅ 正确实现步骤
1. 在表单处理页(如 form.php)启用 Session 并存储验证通过的数据
<?php session_start(); // 必须在任何输出前调用!
// 定义变量并初始化为空
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// 姓名验证
if (empty($_POST["name"])) {
$nameErr = "Name is required";
} else {
$name = test_input($_POST["name"]);
}
// 邮箱验证
if (empty($_POST["email"])) {
$emailErr = "Email is required";
} elseif (!filter_var($_POST["email"], FILTER_VALIDATE_EMAIL)) {
$emailErr = "Invalid email format";
} else {
$email = test_input($_POST["email"]);
}
// 网站(可选)
$website = !empty($_POST["website"]) ? test_input($_POST["website"]) : "";
// 评论(可选)
$comment = !empty($_POST["comment"]) ? test_input($_POST["comment"]) : "";
// 性别必填
if (empty($_POST["gender"])) {
$genderErr = "Gender is required";
} else {
$gender = test_input($_POST["gender"]);
}
}
// ✅ 仅当所有错误为空时才跳转并保存数据
if (empty($nameErr) && empty($emailErr) && empty($genderErr) && empty($websiteErr)) {
// 将原始 POST 数据存入 Session(推荐)或清洗后字段存入(更安全)
$_SESSION['form_data'] = [
'name' => $name,
'email' => $email,
'gender' => $gender,
'website' => $website,
'comment' => $comment
];
header('Location: review.php');
exit(); // ⚠️ 必须 exit() 防止后续代码执行
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
<!-- HTML 表单(保持原样,含错误提示) -->
2. 在目标页(如 review.php)读取并展示数据
<?php session_start();
// ✅ 检查 Session 中是否存在数据,防止直接访问
if (!isset($_SESSION['form_data']) || empty($_SESSION['form_data'])) {
header('Location: form.php');
exit();
}
$data = $_SESSION['form_data'];
// ? 可选:使用后立即销毁 Session 数据(防重复提交)
// unset($_SESSION['form_data']);
// session_destroy(); // 或仅 unset 更安全
?><title>Review Your Submission</title><h2>Thank you! Here's your submitted information:</h2>
- Name:
- Email:
- Gender:
- Website:
- Comment:
⚠️ 关键注意事项
- session_start() 必须位于所有 HTML 输出和空格之前,否则会触发“Headers already sent”错误;
- header() 后务必调用 exit() 或 die(),阻止后续脚本执行;
- 不要依赖 $_POST 在跳转后页面中读取数据——它已失效;
- 生产环境建议对 Session 数据做进一步校验(如时间戳、token 防重放);
- 如需支持多次提交,可在 review.php 中 unset($_SESSION['form_data']) 清理数据,避免重复展示。
通过 Session 机制,你既能保证验证逻辑清晰分离,又能实现用户体验流畅的页面跳转与数据传递——这是 PHP 表单处理的标准实践。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











