当前位置:首页 > 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.  
  65. if (empty($nameErr) && empty($emailErr) && empty($genderErr) && empty($websiteErr)) { 
  66.  
  67.     // 将原始 POST 数据存入 Session(推荐)或清洗后字段存入(更安全) 
  68.  
  69.     $_SESSION['form_data'] = [ 
  70.  
  71.         'name'     => $name, 
  72.  
  73.         'email'    => $email, 
  74.  
  75.         'gender'   => $gender, 
  76.  
  77.         'website'  => $website, 
  78.  
  79.         'comment'  => $comment 
  80.  
  81.     ]; 
  82.  
  83.     header('Location: review.php'); 
  84.  
  85.     exit(); // ⚠️ 必须 exit() 防止后续代码执行 
  86.  
  87. } 
  88.  
  89. function test_input($data) { 
  90.  
  91.     $data = trim($data); 
  92.  
  93.     $data = stripslashes($data); 
  94.  
  95.     $data = htmlspecialchars($data); 
  96.  
  97.     return $data; 
  98.  
  99. } 
  100.  
  101. ?>  
  102.  
  103. <!-- HTML 表单(保持原样,含错误提示) --> 
  104.  
  105. <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>"> 
  106.  
  107.     Name: <input type="text" name="name" value="<?php echo isset($name) ? $name : ''; ?>"> 
  108.  
  109.     <span class="error"><?php echo $nameErr; ?></span><br><br>  
  110.  
  111.     Email: <input type="email" name="email" value="<?php echo isset($email) ? $email : ''; ?>"> 
  112.  
  113.     <span class="error"><?php echo $emailErr; ?></span><br><br>  
  114.  
  115.     Website: <input type="url" name="website" value="<?php echo isset($website) ? $website : ''; ?>"><br><br> 
  116.  
  117.     Comment: <textarea name="comment"><?php echo isset($comment) ? $comment : ''; ?></textarea><br><br>  
  118.  
  119.     Gender: 
  120.  
  121.     <input type="radio" name="gender" value="female" <?php echo (isset($gender) && $gender === 'female') ? 'checked' : ''; ?>> Female 
  122.  
  123.     <input type="radio" name="gender" value="male" <?php echo (isset($gender) && $gender === 'male') ? 'checked' : ''; ?>> Male 
  124.  
  125.     <span class="error"><?php echo $genderErr; ?></span><br><br> 
  126.  
  127.     <input type="submit" name="submit" value="Submit"> 
  128.  
  129. </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.  
  19. $data = $_SESSION['form_data']; 
  20.  
  21. // ? 可选:使用后立即销毁 Session 数据(防重复提交) 
  22.  
  23. // unset($_SESSION['form_data']); 
  24.  
  25. // session_destroy(); // 或仅 unset 更安全 
  26.  
  27. ?> 
  28.  
  29. <!DOCTYPE html> 
  30.  
  31. <html> 
  32.  
  33. <head><title>Review Your Submission</title></head> 
  34.  
  35. <body> 
  36.  
  37.     <h2>Thank you! Here's your submitted information:</h2> 
  38.  
  39.     <ul> 
  40.  
  41.         <li><strong>Name:</strong> <?php echo htmlspecialchars($data['name']); ?></li> 
  42.  
  43.         <li><strong>Email:</strong> <?php echo htmlspecialchars($data['email']); ?></li> 
  44.  
  45.         <li><strong>Gender:</strong> <?php echo htmlspecialchars($data['gender']); ?></li> 
  46.  
  47.         <li><strong>Website:</strong> <?php echo !emptyempty($data['website']) ? htmlspecialchars($data['website']) : 'Not provided'; ?></li> 
  48.  
  49.         <li><strong>Comment:</strong> <?php echo !emptyempty($data['comment']) ? nl2br(htmlspecialchars($data['comment'])) : 'None'; ?></li> 
  50.  
  51.     </ul> 
  52.  
  53.     <a href="form.php">← Submit another form</a> 
  54.  
  55. </body> 
  56.  
  57. </html> 

⚠️ 关键注意事项

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

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

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

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

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

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

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

分享到: