PHP 表单验证后跳转并传递数据的完整实现指南
发布:smiling 来源: PHP粉丝网 添加日期:2026-07-28 17:17:56 浏览: 评论:0
本文详解如何在 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 表单(保持原样,含错误提示) -->
- <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>">
- Name: <input type="text" name="name" value="<?php echo isset($name) ? $name : ''; ?>">
- <span class="error"><?php echo $nameErr; ?></span><br><br>
- Email: <input type="email" name="email" value="<?php echo isset($email) ? $email : ''; ?>">
- <span class="error"><?php echo $emailErr; ?></span><br><br>
- Website: <input type="url" name="website" value="<?php echo isset($website) ? $website : ''; ?>"><br><br>
- Comment: <textarea name="comment"><?php echo isset($comment) ? $comment : ''; ?></textarea><br><br>
- Gender:
- <input type="radio" name="gender" value="female" <?php echo (isset($gender) && $gender === 'female') ? 'checked' : ''; ?>> Female
- <input type="radio" name="gender" value="male" <?php echo (isset($gender) && $gender === 'male') ? 'checked' : ''; ?>> Male
- <span class="error"><?php echo $genderErr; ?></span><br><br>
- <input type="submit" name="submit" value="Submit">
- </form>
2. 在目标页(如 review.php)读取并展示数据
- <?php
- session_start();
- // ✅ 检查 Session 中是否存在数据,防止直接访问
- if (!isset($_SESSION['form_data']) || emptyempty($_SESSION['form_data'])) {
- header('Location: form.php');
- exit();
- }
- $data = $_SESSION['form_data'];
- // ? 可选:使用后立即销毁 Session 数据(防重复提交)
- // unset($_SESSION['form_data']);
- // session_destroy(); // 或仅 unset 更安全
- ?>
- <!DOCTYPE html>
- <html>
- <head><title>Review Your Submission</title></head>
- <body>
- <h2>Thank you! Here's your submitted information:</h2>
- <ul>
- <li><strong>Name:</strong> <?php echo htmlspecialchars($data['name']); ?></li>
- <li><strong>Email:</strong> <?php echo htmlspecialchars($data['email']); ?></li>
- <li><strong>Gender:</strong> <?php echo htmlspecialchars($data['gender']); ?></li>
- <li><strong>Website:</strong> <?php echo !emptyempty($data['website']) ? htmlspecialchars($data['website']) : 'Not provided'; ?></li>
- <li><strong>Comment:</strong> <?php echo !emptyempty($data['comment']) ? nl2br(htmlspecialchars($data['comment'])) : 'None'; ?></li>
- </ul>
- <a href="form.php">← Submit another form</a>
- </body>
- </html>
⚠️ 关键注意事项
session_start() 必须位于所有 HTML 输出和空格之前,否则会触发“Headers already sent”错误;
header() 后务必调用 exit() 或 die(),阻止后续脚本执行;
不要依赖 $_POST 在跳转后页面中读取数据——它已失效;
生产环境建议对 Session 数据做进一步校验(如时间戳、token 防重放);
如需支持多次提交,可在 review.php 中 unset($_SESSION['form_data']) 清理数据,避免重复展示。
通过 Session 机制,你既能保证验证逻辑清晰分离,又能实现用户体验流畅的页面跳转与数据传递——这是 PHP 表单处理的标准实践。
Tags: PHP表单验证 PHP传递数据
- 上一篇:如何在PHP表单验证成功后跳转到新页面并传递数据
- 下一篇:最后一页
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)
