You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 01:12:26