当前位置:首页 > PHP教程 > php应用 > 列表

PHP 表单验证后跳转并传递数据的完整实现指南

发布:smiling 来源: PHP粉丝网  添加日期:2026-07-28 17:17:56 浏览: 评论:0 

本文详解如何在 php 表单验证通过后重定向至新页面,并安全传递用户输入数据,避免验证失败时页面刷新丢失错误提示,同时确保验证成功后跳转并展示提交内容。

在 PHP Web 开发中,常见的表单处理需求是:验证失败时保留在当前页并显示错误;验证成功后跳转至独立的确认/预览页展示数据。但直接使用 header('Location: ...') 跳转会导致 POST 数据丢失,无法在目标页获取用户输入——这正是你遇到的问题。

解决的核心在于:利用 PHP Session 在跳转前后持久化数据。Session 是服务器端存储机制,不受 HTTP 重定向影响,是传递表单数据最可靠的方式。

✅ 正确实现步骤

1. 在表单处理页(如 form.php)启用 Session 并存储验证通过的数据。

  1. <?php 
  2.  
  3. session_start(); // 必须在任何输出前调用! 
  4.  
  5. // 定义变量并初始化为空 
  6.  
  7. $nameErr = $emailErr = $genderErr = $websiteErr = ""
  8.  
  9. $name = $email = $gender = $comment = $website = "" 
  10.  
  11. if ($_SERVER["REQUEST_METHOD"] == "POST") { 
  12.  
  13.     // 姓名验证 
  14.  
  15.     if (empty($_POST["name"])) { 
  16.  
  17.         $nameErr = "Name is required"
  18.  
  19.     } else { 
  20.  
  21.         $name = test_input($_POST["name"]); 
  22.  
  23.     }  
  24.  
  25.     // 邮箱验证 
  26.  
  27.     if (empty($_POST["email"])) { 
  28.  
  29.         $emailErr = "Email is required"
  30.  
  31.     } elseif (!filter_var($_POST["email"], FILTER_VALIDATE_EMAIL)) { 
  32.  
  33.         $emailErr = "Invalid email format"
  34.  
  35.     } else { 
  36.  
  37.         $email = test_input($_POST["email"]); 
  38.  
  39.     }  
  40.  
  41.     // 网站(可选) 
  42.  
  43.     $website = !empty($_POST["website"]) ? test_input($_POST["website"]) : ""; 
  44.  
  45.     // 评论(可选) 
  46.  
  47.     $comment = !empty($_POST["comment"]) ? test_input($_POST["comment"]) : ""; 
  48.  
  49.     // 性别必填 
  50.  
  51.     if (empty($_POST["gender"])) { 
  52.  
  53.         $genderErr = "Gender is required"
  54.  
  55.     } else { 
  56.  
  57.         $gender = test_input($_POST["gender"]); 
  58.  
  59.     } 
  60.  
  61.  
  62. // ✅ 仅当所有错误为空时才跳转并保存数据 
  63.  
  64. if (empty($nameErr) && empty($emailErr) && empty($genderErr) && empty($websiteErr)) { 
  65.  
  66.     // 将原始 POST 数据存入 Session(推荐)或清洗后字段存入(更安全) 
  67.  
  68.     $_SESSION['form_data'] = [ 
  69.  
  70.         'name'     => $name, 
  71.  
  72.         'email'    => $email, 
  73.  
  74.         'gender'   => $gender, 
  75.  
  76.         'website'  => $website, 
  77.  
  78.         'comment'  => $comment 
  79.  
  80.     ]; 
  81.  
  82.     header('Location: review.php'); 
  83.  
  84.     exit(); // ⚠️ 必须 exit() 防止后续代码执行 
  85.  
  86.  
  87. function test_input($data) { 
  88.  
  89.     $data = trim($data); 
  90.  
  91.     $data = stripslashes($data); 
  92.  
  93.     $data = htmlspecialchars($data); 
  94.  
  95.     return $data; 
  96.  
  97.  
  98. ?>  
  99.  
  100. <!-- HTML 表单(保持原样,含错误提示) --> 
  101.  
  102. <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>"> 
  103.  
  104.     Name: <input type="text" name="name" value="<?php echo isset($name) ? $name : ''; ?>"> 
  105.  
  106.     <span class="error"><?php echo $nameErr; ?></span><br><br>  
  107.  
  108.     Email: <input type="email" name="email" value="<?php echo isset($email) ? $email : ''; ?>"> 
  109.  
  110.     <span class="error"><?php echo $emailErr; ?></span><br><br>  
  111.  
  112.     Website: <input type="url" name="website" value="<?php echo isset($website) ? $website : ''; ?>"><br><br> 
  113.  
  114.     Comment: <textarea name="comment"><?php echo isset($comment) ? $comment : ''; ?></textarea><br><br>  
  115.  
  116.     Gender: 
  117.  
  118.     <input type="radio" name="gender" value="female" <?php echo (isset($gender) && $gender === 'female') ? 'checked' : ''; ?>> Female 
  119.  
  120.     <input type="radio" name="gender" value="male" <?php echo (isset($gender) && $gender === 'male') ? 'checked' : ''; ?>> Male 
  121.  
  122.     <span class="error"><?php echo $genderErr; ?></span><br><br> 
  123.  
  124.     <input type="submit" name="submit" value="Submit"> 
  125.  
  126. </form> 

2. 在目标页(如 review.php)读取并展示数据

  1. <?php 
  2.  
  3. session_start(); 
  4.  
  5.   
  6.  
  7. // ✅ 检查 Session 中是否存在数据,防止直接访问 
  8.  
  9. if (!isset($_SESSION['form_data']) || emptyempty($_SESSION['form_data'])) { 
  10.  
  11.     header('Location: form.php'); 
  12.  
  13.     exit(); 
  14.  
  15.  
  16.   
  17.  
  18. $data = $_SESSION['form_data']; 
  19.  
  20. // ? 可选:使用后立即销毁 Session 数据(防重复提交) 
  21.  
  22. // unset($_SESSION['form_data']); 
  23.  
  24. // session_destroy(); // 或仅 unset 更安全 
  25.  
  26. ?> 
  27.  
  28. <!DOCTYPE html> 
  29.  
  30. <html> 
  31.  
  32. <head><title>Review Your Submission</title></head> 
  33.  
  34. <body> 
  35.  
  36.     <h2>Thank you! Here's your submitted information:</h2> 
  37.  
  38.     <ul> 
  39.  
  40.         <li><strong>Name:</strong> <?php echo htmlspecialchars($data['name']); ?></li> 
  41.  
  42.         <li><strong>Email:</strong> <?php echo htmlspecialchars($data['email']); ?></li> 
  43.  
  44.         <li><strong>Gender:</strong> <?php echo htmlspecialchars($data['gender']); ?></li> 
  45.  
  46.         <li><strong>Website:</strong> <?php echo !emptyempty($data['website']) ? htmlspecialchars($data['website']) : 'Not provided'; ?></li> 
  47.  
  48.         <li><strong>Comment:</strong> <?php echo !emptyempty($data['comment']) ? nl2br(htmlspecialchars($data['comment'])) : 'None'; ?></li> 
  49.  
  50.     </ul> 
  51.  
  52.     <a href="form.php">← Submit another form</a> 
  53.  
  54. </body> 
  55.  
  56. </html> 

⚠️ 关键注意事项

session_start() 必须位于所有 HTML 输出和空格之前,否则会触发“Headers already sent”错误;

header() 后务必调用 exit() 或 die(),阻止后续脚本执行;

不要依赖 $_POST 在跳转后页面中读取数据——它已失效;

生产环境建议对 Session 数据做进一步校验(如时间戳、token 防重放);

如需支持多次提交,可在 review.php 中 unset($_SESSION['form_data']) 清理数据,避免重复展示。

通过 Session 机制,你既能保证验证逻辑清晰分离,又能实现用户体验流畅的页面跳转与数据传递——这是 PHP 表单处理的标准实践。

Tags: PHP表单验证 PHP传递数据

分享到: