Appearance
第 9 章:表单与用户交互
9.1 GET 与 POST 区别
基本区别
| 特性 | GET | POST |
|---|---|---|
| 数据传输方式 | 通过 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>访问页面
- 将文件保存到网站根目录
- 打开浏览器,访问
http://localhost/login.php和http://localhost/register.php - 测试表单功能
小结
通过本章的学习,你掌握了 PHP 处理表单的基本方法,包括 GET 和 POST 请求的区别、表单数据的接收、表单验证以及防止 XSS 攻击。这些知识是 PHP 开发 Web 应用的基础,在后续的学习中,你将经常使用这些技术来处理用户输入和表单提交。
