PHP表单验证失败留本页、通过后跳转新页预览实现方案
PHP表单验证通过后跳转独立预览页实现方案
预期逻辑
- 验证未完成/输入不合法:同页展示错误提示,用户留在表单页重新输入,已填合法内容保留
- 所有字段验证通过:跳转至独立预览页,展示用户提交的全部合法数据
核心问题
你当前参考示例编写的代码存在两个致命逻辑问题:
- 跳转判断位置错误:无错误即跳转的逻辑写在了POST请求判断的外层,用户首次GET访问表单页时,所有错误变量初始值为空,会直接触发跳转,根本看不到表单。
- 跨页数据传递缺失:就算把跳转逻辑移到POST验证块内,单纯的header重定向不会自动携带表单数据,预览页无法拿到用户提交的内容,自然没法正常展示。
实现步骤
1. 修正表单页逻辑
把跳转判断完全放入POST验证流程内部,通过Session跨页传递验证通过的合法数据(比URL传参更安全,无长度限制、不暴露敏感信息)。
表单页(命名为form.php)完整代码:
<?php // 顶部必须先开启会话,且前面不能有任何输出(包括空格、HTML) session_start(); // 初始化错误提示、表单值变量 $nameErr = $emailErr = $genderErr = $websiteErr = ""; $name = $email = $gender = $comment = $website = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { // 字段校验逻辑 if (empty($_POST["name"])) { $nameErr = "姓名为必填项"; } else { $name = test_input($_POST["name"]); } if (empty($_POST["email"])) { $emailErr = "邮箱为必填项"; } else { $email = test_input($_POST["email"]); // 可额外增加邮箱格式校验:if(!filter_var($email, FILTER_VALIDATE_EMAIL)) $emailErr = "邮箱格式不合法"; } if (empty($_POST["website"])) { $website = ""; } else { $website = test_input($_POST["website"]); // 可额外增加URL格式校验 } if (empty($_POST["comment"])) { $comment = ""; } else { $comment = test_input($_POST["comment"]); } if (empty($_POST["gender"])) { $genderErr = "性别为必填项"; } else { $gender = test_input($_POST["gender"]); } // 所有错误提示为空,说明校验通过 if($nameErr == "" && $emailErr == "" && $genderErr == "" && $websiteErr == "") { // 将合法数据存入会话 $_SESSION['valid_form_data'] = [ 'name' => $name, 'email' => $email, 'website' => $website, 'comment' => $comment, 'gender' => $gender ]; // 跳转至预览页,跳转后必须终止后续代码执行 header("Location: preview.php"); exit(); } } // 输入过滤函数 function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ?> <!-- 表单区域,同页展示错误提示,保留已填内容 --> <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 姓名:<input type="text" name="name" value="<?php echo $name;?>"> <span style="color: red;">* <?php echo $nameErr;?></span> <br><br> 邮箱:<input type="text" name="email" value="<?php echo $email;?>"> <span style="color: red;">* <?php echo $emailErr;?></span> <br><br> 个人网址:<input type="text" name="website" value="<?php echo $website;?>"> <span style="color: red;"><?php echo $websiteErr;?></span> <br><br> 备注:<textarea name="comment" rows="5" cols="40"><?php echo $comment;?></textarea> <br><br> 性别: <input type="radio" name="gender" <?php if (isset($gender) && $gender=="female") echo "checked";?> value="female">女 <input type="radio" name="gender" <?php if (isset($gender) && $gender=="male") echo "checked";?> value="male">男 <input type="radio" name="gender" <?php if (isset($gender) && $gender=="other") echo "checked";?> value="other">其他 <span style="color: red;">* <?php echo $genderErr;?></span> <br><br> <input type="submit" value="提交"> </form>
2. 编写独立预览页
新建preview.php作为预览页面,增加非法访问拦截:如果用户没有经过表单校验直接访问该页,自动跳回表单页。
预览页完整代码:
<?php session_start(); // 非法访问拦截:没有校验通过的表单数据则跳回表单页 if(!isset($_SESSION['valid_form_data'])) { header("Location: form.php"); exit(); } // 取出表单数据,读取后立即清除会话数据,避免重复提交 $formData = $_SESSION['valid_form_data']; unset($_SESSION['valid_form_data']); ?> <h2>提交信息预览</h2> <ul> <li>姓名:<?php echo $formData['name'];?></li> <li>邮箱:<?php echo $formData['email'];?></li> <li>个人网址:<?php echo $formData['website'] ?: '未填写';?></li> <li>备注:<?php echo $formData['comment'] ?: '未填写';?></li> <li>性别:<?php echo $formData['gender'];?></li> </ul> <p><a href="form.php">返回修改信息</a></p>
注意事项
- 所有调用
session_start()的页面,该行代码必须放在文件最顶部,前面不能有任何输出(包括空格、HTML标签、echo打印的内容),否则会触发会话启动错误。 - 执行
header()跳转后必须加exit()终止后续代码运行,否则会出现逻辑漏洞。 - 跨页传递表单数据优先使用Session,不要将参数拼接在跳转URL后,避免敏感信息泄露、参数长度超限问题。
内容的提问来源于stack exchange,提问作者XYZ.Currate
相关产品推荐
相关产品推荐

