Skip to content

第 9 章:表单与用户交互

9.1 GET 与 POST 区别

基本区别

特性GETPOST
数据传输方式通过 URL 传递通过 HTTP 请求体传递
数据可见性可见(URL 中显示)不可见(请求体中)
数据长度限制有限制(约 2048 字符)无限制
安全性较低(数据暴露在 URL 中)较高(数据不暴露)
缓存可缓存不可缓存
历史记录会被保存在浏览器历史中不会被保存在浏览器历史中

使用场景

  • GET:用于获取数据,如搜索、分页、筛选等
  • POST:用于提交数据,如登录、注册、表单提交等

9.2 表单提交 method="get" / "post"

GET 方式提交

html
<form action="process.php" method="get">
    <input type="text" name="username" placeholder="用户名">
    <input type="password" name="password" placeholder="密码">
    <button type="submit">登录</button>
</form>

提交后 URL 会变成:process.php?username=admin&password=123456

POST 方式提交

html
<form action="process.php" method="post">
    <input type="text" name="username" placeholder="用户名">
    <input type="password" name="password" placeholder="密码">
    <button type="submit">登录</button>
</form>

提交后数据在请求体中,URL 不会显示数据。

9.3 $_GET / $_POST / $_REQUEST 接收数据

接收 GET 数据

php
<?php
// 接收单个参数
$username = $_GET['username'] ?? '';
$password = $_GET['password'] ?? '';

// 检查参数是否存在
if (isset($_GET['username'])) {
    echo "用户名:" . $_GET['username'];
}
?>

接收 POST 数据

php
<?php
// 接收单个参数
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';

// 检查参数是否存在
if (isset($_POST['username'])) {
    echo "用户名:" . $_POST['username'];
}
?>

接收 REQUEST 数据

$_REQUEST 包含 GET、POST 和 COOKIE 数据,不推荐使用,因为安全性较低。

php
<?php
$username = $_REQUEST['username'] ?? '';
?>

9.4 表单验证(非空、格式、长度)

基本验证

php
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 接收数据
    $username = $_POST['username'] ?? '';
    $email = $_POST['email'] ?? '';
    $password = $_POST['password'] ?? '';
    
    // 验证非空
    if (empty($username)) {
        $errors[] = "用户名不能为空";
    }
    
    if (empty($email)) {
        $errors[] = "邮箱不能为空";
    }
    
    if (empty($password)) {
        $errors[] = "密码不能为空";
    }
    
    // 验证长度
    if (strlen($username) < 3 || strlen($username) > 20) {
        $errors[] = "用户名长度应在 3-20 个字符之间";
    }
    
    if (strlen($password) < 6) {
        $errors[] = "密码长度至少 6 个字符";
    }
    
    // 验证邮箱格式
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $errors[] = "邮箱格式不正确";
    }
    
    // 显示错误信息
    if (!empty($errors)) {
        foreach ($errors as $error) {
            echo "<p style='color: red;'>$error</p>";
        }
    } else {
        echo "表单提交成功!";
        // 处理表单数据...
    }
}
?>

9.5 防止 XSS(htmlspecialchars)

XSS 攻击

XSS(跨站脚本攻击)是一种注入攻击,攻击者通过在网页中注入恶意脚本,当用户浏览网页时执行。

防止 XSS 的方法

使用 htmlspecialchars() 函数将特殊字符转换为 HTML 实体。

php
<?php
// 接收数据并防止 XSS
$username = htmlspecialchars($_POST['username'] ?? '', ENT_QUOTES, 'UTF-8');
$message = htmlspecialchars($_POST['message'] ?? '', ENT_QUOTES, 'UTF-8');

// 显示数据
echo "用户名:$username";
echo "留言:$message";
?>

示例:防止 XSS 攻击

php
<?php
// 恶意输入
$malicious_input = '<script>alert("XSS 攻击!");</script>';

// 未处理的输出
echo "未处理:" . $malicious_input; // 会执行脚本

// 处理后的输出
echo "处理后:" . htmlspecialchars($malicious_input); // 不会执行脚本
?>

9.6 实操:登录表单、注册表单

创建 login.php 文件(登录表单)

php
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>登录表单</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
        }
        .form-container {
            width: 300px;
            margin: 0 auto;
            padding: 20px;
            border: 1px solid #ccc;
            border-radius: 5px;
            background-color: #f9f9f9;
        }
        input {
            width: 100%;
            padding: 10px;
            margin: 5px 0;
            box-sizing: border-box;
        }
        button {
            width: 100%;
            padding: 10px;
            margin: 10px 0;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 3px;
            cursor: pointer;
        }
        button:hover {
            background-color: #45a049;
        }
        .error {
            color: red;
            font-size: 12px;
        }
    </style>
</head>
<body>
    <h1>登录表单</h1>
    <div class="form-container">
        <?php
        $errors = [];
        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            // 接收数据
            $username = $_POST['username'] ?? '';
            $password = $_POST['password'] ?? '';
            
            // 验证
            if (empty($username)) {
                $errors[] = "用户名不能为空";
            }
            if (empty($password)) {
                $errors[] = "密码不能为空";
            }
            
            // 模拟验证
            if (empty($errors) && $username === 'admin' && $password === '123456') {
                echo '<p style="color: green;">登录成功!</p>';
            } elseif (empty($errors)) {
                $errors[] = "用户名或密码错误";
            }
        }
        
        // 显示错误
        if (!empty($errors)) {
            foreach ($errors as $error) {
                echo '<p class="error">' . $error . '</p>';
            }
        }
        ?>
        
        <form method="post">
            <input type="text" name="username" placeholder="用户名" value="<?php echo htmlspecialchars($_POST['username'] ?? '', ENT_QUOTES, 'UTF-8'); ?>"><br>
            <input type="password" name="password" placeholder="密码"><br>
            <button type="submit">登录</button>
        </form>
    </div>
</body>
</html>

创建 register.php 文件(注册表单)

php
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>注册表单</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
        }
        .form-container {
            width: 400px;
            margin: 0 auto;
            padding: 20px;
            border: 1px solid #ccc;
            border-radius: 5px;
            background-color: #f9f9f9;
        }
        input {
            width: 100%;
            padding: 10px;
            margin: 5px 0;
            box-sizing: border-box;
        }
        button {
            width: 100%;
            padding: 10px;
            margin: 10px 0;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 3px;
            cursor: pointer;
        }
        button:hover {
            background-color: #45a049;
        }
        .error {
            color: red;
            font-size: 12px;
        }
        .success {
            color: green;
            font-size: 12px;
        }
    </style>
</head>
<body>
    <h1>注册表单</h1>
    <div class="form-container">
        <?php
        $errors = [];
        $success = false;
        
        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            // 接收数据
            $username = $_POST['username'] ?? '';
            $email = $_POST['email'] ?? '';
            $password = $_POST['password'] ?? '';
            $confirm_password = $_POST['confirm_password'] ?? '';
            
            // 验证
            if (empty($username)) {
                $errors[] = "用户名不能为空";
            } elseif (strlen($username) < 3 || strlen($username) > 20) {
                $errors[] = "用户名长度应在 3-20 个字符之间";
            }
            
            if (empty($email)) {
                $errors[] = "邮箱不能为空";
            } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
                $errors[] = "邮箱格式不正确";
            }
            
            if (empty($password)) {
                $errors[] = "密码不能为空";
            } elseif (strlen($password) < 6) {
                $errors[] = "密码长度至少 6 个字符";
            }
            
            if ($password !== $confirm_password) {
                $errors[] = "两次输入的密码不一致";
            }
            
            // 模拟注册
            if (empty($errors)) {
                $success = true;
                // 实际应用中这里会将数据存入数据库
            }
        }
        
        // 显示错误
        if (!empty($errors)) {
            foreach ($errors as $error) {
                echo '<p class="error">' . $error . '</p>';
            }
        }
        
        // 显示成功信息
        if ($success) {
            echo '<p class="success">注册成功!</p>';
        }
        ?>
        
        <form method="post">
            <input type="text" name="username" placeholder="用户名" value="<?php echo htmlspecialchars($_POST['username'] ?? '', ENT_QUOTES, 'UTF-8'); ?>"><br>
            <input type="email" name="email" placeholder="邮箱" value="<?php echo htmlspecialchars($_POST['email'] ?? '', ENT_QUOTES, 'UTF-8'); ?>"><br>
            <input type="password" name="password" placeholder="密码"><br>
            <input type="password" name="confirm_password" placeholder="确认密码"><br>
            <button type="submit">注册</button>
        </form>
    </div>
</body>
</html>

访问页面

  1. 将文件保存到网站根目录
  2. 打开浏览器,访问 http://localhost/login.phphttp://localhost/register.php
  3. 测试表单功能

小结

通过本章的学习,你掌握了 PHP 处理表单的基本方法,包括 GET 和 POST 请求的区别、表单数据的接收、表单验证以及防止 XSS 攻击。这些知识是 PHP 开发 Web 应用的基础,在后续的学习中,你将经常使用这些技术来处理用户输入和表单提交。

© 2026 编程马·菜鸟教程 版权所有