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

PHP表单输入验证:无效输入时阻止页面跳转并显示错误

解决PHP表单验证不阻止跳转的问题

你的核心问题是表单直接跳转到结果页,未在当前页面完成完整验证就提交。按以下步骤修改即可解决:

1. 调整表单提交逻辑,验证通过再跳转

把表单的action设为当前页面(留空或写<?php echo $_SERVER['PHP_SELF']; ?>),提交后先在当前页完成所有验证,只有所有字段合法时才跳转到结果页。

2. 新增验证通过标记,控制页面跳转

在PHP代码开头定义$isValid = true,只要任意字段验证失败,就把$isValid设为false。验证完成后,仅当$isValid为true时,用header()跳转并传递合法参数。

3. 修正原代码中的小错误

  • 出生日期验证里错误将$dob赋值为$lname,需改为$dob = input($_GET["dob"]);
  • 地址验证正则有多余空格,且逻辑反向,调整为允许包含指定字符,不包含则报错
  • 表单中"Larst Name"拼写错误,改为"Last Name"

修改后的表单页面代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>FG4</title>
    <style>
        .error {color: red}
    </style>
</head>
<body>
<?php
$fname = $lname = $gender = $mail = $dob = $address = "";
$fnameErr = $lnameErr = $genderErr = $mailErr = $dobErr = $addressErr = "";
$isValid = true; // 验证通过标记

if ($_SERVER["REQUEST_METHOD"] == "GET" && isset($_GET["submit"])) {
    // 验证FirstName
    if (empty($_GET["fname"])) {
        $fnameErr = "Please enter your first name.";
        $isValid = false;
    } else {
        $fname = input($_GET["fname"]);
        if (!preg_match("/^[a-zA-Z-' ]*$/",$fname)) {
            $fnameErr = "Please enter a valid name";
            $isValid = false;
        }
    }

    // 验证LastName
    if (empty($_GET["lname"])) {
        $lnameErr = "Please enter your last name.";
        $isValid = false;
    } else {
        $lname = input($_GET["lname"]);
        if (!preg_match("/^[a-zA-Z-' ]*$/",$lname)) {
            $lnameErr = "Please enter a valid name";
            $isValid = false;
        }
    }

    // 验证Gender
    if (empty($_GET["gender"])) {
        $genderErr = "Please select a gender.";
        $isValid = false;
    } else{ 
        $gender = input($_GET["gender"]);
    }

    // 验证Email
    if (empty($_GET["mail"])) {
        $mailErr = "Please enter your email.";
        $isValid = false;
    } else {
        $mail = input($_GET["mail"]);
        if (!preg_match("/@gmail.com$|@yahoo.com$/", $mail)) { // 加$确保域名在结尾
            $mailErr = "Please enter a valid email.";            
            $isValid = false;
        }
    }

    // 验证Date of Birth
    if (empty($_GET["dob"])) {
        $dobErr = "Please select your date of birth.";
        $isValid = false;
    } else{
        $dob = input($_GET["dob"]); // 修正原赋值错误
    }
    
    // 验证Address
    if (empty($_GET["address"])) {
        $addressErr = "Please enter your address.";
        $isValid = false;
    } else {
        $address = input($_GET["address"]);
        // 调整正则,允许包含#、数字、大小写字母
        if (!preg_match("/[#0-9a-zA-Z]/",$address)) {
            $addressErr = "Please enter a valid address";
            $isValid = false;
        }
    }

    // 所有验证通过才跳转
    if ($isValid) {
        $params = http_build_query([
            'fname' => $fname,
            'lname' => $lname,
            'gender' => $gender,
            'mail' => $mail,
            'dob' => $dob,
            'address' => $address
        ]);
        header("Location: trial.php?$params");
        exit; // 跳转后终止脚本
    }
}

function input($data) {
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}
?>

<form method="get" action="<?php echo $_SERVER['PHP_SELF']; ?>">  
    First Name: <input type="text" name="fname" value="<?php echo $fname; ?>"> <!-- 保留用户输入 -->
    <span class="error">* <?php echo $fnameErr;?></span>
    <br><br>

    Last Name: <input type="text" name="lname" value="<?php echo $lname; ?>"> <!-- 修正拼写错误 -->
    <span class="error">* <?php echo $lnameErr;?></span>
    <br><br>

    Gender: <input type="radio" name="gender" value="male" <?php echo ($gender == 'male') ? 'checked' : ''; ?>> Male
            <input type="radio" name="gender" value="female" <?php echo ($gender == 'female') ? 'checked' : ''; ?>> Female
    <span class="error">* <?php echo $genderErr;?></span>
    <br><br>

    Email: <input type="text" name="mail" value="<?php echo $mail; ?>">
    <span class="error">* <?php echo $mailErr;?></span>
    <br><br>

    Date of Birth: <input type="date" name="dob" value="<?php echo $dob; ?>">
    <span class="error">* <?php echo $dobErr;?></span>
    <br><br>

    Address: <br><textarea name="address" rows="5" cols="40"><?php echo $address; ?></textarea>
    <span class="error"><?php echo $addressErr;?></span>
    <br><br>

    <input type="submit" name="submit" value="Submit">  
</form>
</body>
</html>

修改后的结果页(trial.php)代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Result</title>
</head>
<body>
<?php
// 二次验证,防止直接访问结果页
$fname = $lname = $gender = $mail = $dob = $address = "";
$hasError = false;

if ($_SERVER["REQUEST_METHOD"] == "GET") {
    // 验证每个参数合法性
    if (empty($_GET['fname']) || !preg_match("/^[a-zA-Z-' ]*$/", $_GET['fname'])) {
        $hasError = true;
    } else {
        $fname = htmlspecialchars($_GET['fname']);
    }

    if (empty($_GET['lname']) || !preg_match("/^[a-zA-Z-' ]*$/", $_GET['lname'])) {
        $hasError = true;
    } else {
        $lname = htmlspecialchars($_GET['lname']);
    }

    if (empty($_GET['gender']) || !in_array($_GET['gender'], ['male', 'female'])) {
        $hasError = true;
    } else {
        $gender = htmlspecialchars($_GET['gender']);
    }

    if (empty($_GET['mail']) || !preg_match("/@gmail.com$|@yahoo.com$/", $_GET['mail'])) {
        $hasError = true;
    } else {
        $mail = htmlspecialchars($_GET['mail']);
    }

    if (empty($_GET['dob'])) {
        $hasError = true;
    } else {
        $dob = htmlspecialchars($_GET['dob']);
    }

    if (empty($_GET['address']) || !preg_match("/[#0-9a-zA-Z]/", $_GET['address'])) {
        $hasError = true;
    } else {
        $address = htmlspecialchars($_GET['address']);
    }

    if ($hasError) {
        header("Location: form.php"); // 替换为你的表单页面文件名
        exit;
    }

    // 验证通过显示内容
    echo "<h2> Final Output:</h2>";
    echo "First Name :$fname";
    echo "<br>";
    echo "Last Name :$lname";
    echo "<br>";
    echo "Gender  :$gender";
    echo "<br>";
    echo "Email :$mail";
    echo "<br>";
    echo "Date of Birth :$dob";
    echo "<br>";
    echo "Address :$address";
} else {
    header("Location: form.php");
    exit;
}
?>
</body>
</html>

额外优化说明

  • 表单输入框保留用户已输入的值,避免验证失败后重新填写
  • 性别单选框保留用户之前的选择
  • 结果页添加二次验证,防止直接通过URL访问
  • 邮箱正则加$确保域名在结尾,避免类似test@gmail.com.cn的错误通过验证

内容的提问来源于stack exchange,提问作者stor-ige

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:45:35