PHP 表单和用户输入
在 Web 开发中,表单(Forms)是用户与服务器交互的主要方式之一,PHP 负责处理用户输入数据。
1️⃣ HTML 表单基础
PHP 使用 $_GET 和 $_POST 变量获取用户输入。
HTML 表单示例:
<form action="process.php" method="post">
<label for="name">姓名:</label>
<input type="text" name="name" id="name" required>
<label for="email">邮箱:</label>
<input type="email" name="email" id="email" required>
<input type="submit" value="提交">
</form>
✅ 解释
action="process.php":表单提交到process.php处理。method="post":使用POST方法提交数据。required:字段不能为空。
2️⃣ 使用 $_POST 处理表单数据
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = $_POST['name'];
$email = $_POST['email'];
echo "姓名: " . htmlspecialchars($name) . "<br>";
echo "邮箱: " . htmlspecialchars($email);
}
?>
✅ 解释
$_POST['name']获取表单name输入值。htmlspecialchars()防止 XSS(跨站脚本攻击)。$_SERVER["REQUEST_METHOD"] == "POST"确保数据是通过POST方式提交。
3️⃣ 使用 $_GET 处理 URL 传参
<a href="process.php?name=Tom&email=tom@example.com">点击查看信息</a>
<?php
if ($_SERVER["REQUEST_METHOD"] == "GET") {
if (isset($_GET['name']) && isset($_GET['email'])) {
echo "姓名: " . htmlspecialchars($_GET['name']) . "<br>";
echo "邮箱: " . htmlspecialchars($_GET['email']);
} else {
echo "缺少参数!";
}
}
?>
✅ 解释
$_GET['name']通过 URL 传参。- 适用于 查询数据,如搜索引擎。
4️⃣ 表单数据验证
表单数据必须经过验证,以防止 SQL 注入、XSS 攻击、非法输入等。
📌 过滤非法输入
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = trim($_POST['name']);
$email = trim($_POST['email']);
if (empty($name) || empty($email)) {
die("姓名和邮箱不能为空!");
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
die("无效的邮箱格式!");
}
echo "姓名: " . htmlspecialchars($name) . "<br>";
echo "邮箱: " . htmlspecialchars($email);
}
?>
✅ 安全处理
trim()去除首尾空格。empty()判断是否为空。filter_var($email, FILTER_VALIDATE_EMAIL)确保邮箱格式正确。htmlspecialchars()防止 XSS。
5️⃣ $_REQUEST 变量
$_REQUEST 结合 $_GET 和 $_POST,但不推荐用于敏感数据:
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = $_REQUEST['name'] ?? '匿名';
echo "姓名: " . htmlspecialchars($name);
}
?>
✅ 说明
$_REQUEST['name'] ?? '匿名':如果name为空,默认值为 匿名。
6️⃣ 防止表单重复提交
用户刷新页面时,可能会导致表单重复提交,可以使用 header() 重定向 解决:
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = htmlspecialchars($_POST['name']);
echo "提交成功,姓名:" . $name;
// 避免表单重复提交
header("Location: success.php");
exit;
}
?>
✅ header("Location: success.php") 让用户跳转到 success.php,防止重复提交。
7️⃣ 文件上传
📌 HTML 文件上传表单
<form action="upload.php" method="post" enctype="multipart/form-data">
<label for="file">上传文件:</label>
<input type="file" name="file" id="file">
<input type="submit" value="上传">
</form>
📌 处理上传
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (isset($_FILES["file"]) && $_FILES["file"]["error"] == 0) {
$allowedTypes = ["image/jpeg", "image/png", "image/gif"];
$fileType = $_FILES["file"]["type"];
if (!in_array($fileType, $allowedTypes)) {
die("仅支持 JPG、PNG 和 GIF 格式!");
}
$uploadDir = "uploads/";
$filePath = $uploadDir . basename($_FILES["file"]["name"]);
if (move_uploaded_file($_FILES["file"]["tmp_name"], $filePath)) {
echo "文件上传成功: " . $filePath;
} else {
echo "文件上传失败!";
}
} else {
echo "请选择文件!";
}
}
?>
✅ 说明
$_FILES["file"]["error"] == 0确保无错误。in_array($fileType, $allowedTypes)限制文件格式。move_uploaded_file()移动文件到uploads/目录。
8️⃣ 防止 CSRF(跨站请求伪造)
📌 生成 CSRF 令牌
<?php
session_start();
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
?>
<form action="process.php" method="post">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
<input type="text" name="name">
<input type="submit" value="提交">
</form>
📌 验证 CSRF 令牌
<?php
session_start();
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die("非法请求!");
}
echo "安全提交";
}
?>
✅ 说明
$_SESSION['csrf_token']生成安全令牌。- 验证令牌,确保请求来自合法页面。
🔟 总结
| 功能 | 方法 |
|---|---|
| 处理表单数据 | $_POST['name'] 或 $_GET['name'] |
| 过滤输入 | htmlspecialchars()、filter_var() |
| 验证邮箱 | FILTER_VALIDATE_EMAIL |
| 防止重复提交 | header("Location: success.php") |
| 文件上传 | move_uploaded_file() |
| 防止 CSRF | 令牌验证 |
📌 推荐阅读
更多详细内容请关注其他相关文章!