$_POST 是 PHP 中的一个超全局变量(Superglobal Variable),用于收集通过 HTTP POST 方法提交的表单数据。POST 方法将数据封装在 HTTP 请求体中,适合处理敏感信息(如密码)或大数据量(如文件上传),不会在 URL 中显示。$_POST 是一个关联数组,键是表单字段的 name 属性,值是用户输入的数据。
$_POST 是一个关联数组,键对应表单字段的 name 属性。例如:
<form action="process.php" method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" value="提交">
</form>
PHP 代码(process.php):
<?php
$username = $_POST['username'] ?? ''; // 获取 username
$password = $_POST['password'] ?? ''; // 获取 password
echo "用户名: $username, 密码: $password";
?>
$email = $_POST['email'] ?? ''; // 如果 email 未设置,返回空字符串
echo "邮箱: $email";
if (isset($_POST['name'])) {
$name = $_POST['name'];
echo "姓名: $name";
} else {
echo "未提供姓名";
}
$name = filter_var($_POST['name'] ?? '', FILTER_SANITIZE_STRING);
$name = htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
echo "清理后的姓名: $name";
<input type="checkbox" name="hobbies[]" value="reading"> 阅读
<input type="checkbox" name="hobbies[]" value="gaming"> 游戏
PHP 获取:
$hobbies = $_POST['hobbies'] ?? [];
foreach ($hobbies as $hobby) {
echo "爱好: $hobby<br>";
}
// 输出:
// 爱好: reading
// 爱好: gaming
以下是一个使用 $_POST 处理用户注册表单的完整示例,包含验证、清理和数据库存储。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>用户注册</title>
<style>
.error { color: red; }
label { display: inline-block; width: 100px; }
input { margin-bottom: 10px; }
</style>
</head>
<body>
<h2>用户注册</h2>
<form action="register.php" method="post">
<?php
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
?>
<input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($_SESSION['csrf_token']); ?>">
<label for="name">姓名*:</label>
<input type="text" id="name" name="name" value="<?php echo isset($_POST['name']) ? htmlspecialchars($_POST['name']) : ''; ?>">
<br>
<label for="email">邮箱*:</label>
<input type="email" id="email" name="email" value="<?php echo isset($_POST['email']) ? htmlspecialchars($_POST['email']) : ''; ?>">
<br>
<label for="password">密码*:</label>
<input type="password" id="password" name="password">
<br>
<input type="submit" value="注册">
<p>* 表示必需字段</p>
</form>
</body>
</html>
<?php
// 启动会话以验证 CSRF 令牌
session_start();
// 初始化错误数组
$errors = [];
// 检查请求方法
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 验证 CSRF 令牌
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
$errors[] = "CSRF 验证失败";
} else {
// 获取并清理输入
$name = trim($_POST['name'] ?? '');
$email = trim($_POST['email'] ?? '');
$password = $_POST['password'] ?? '';
// 清理输入数据
$name = filter_var($name, FILTER_SANITIZE_STRING);
$email = filter_var($email, FILTER_SANITIZE_EMAIL);
// 验证必需字段
if (empty($name)) {
$errors[] = "姓名是必需字段";
}
if (empty($email)) {
$errors[] = "邮箱是必需字段";
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = "无效的邮箱格式";
}
if (empty($password)) {
$errors[] = "密码是必需字段";
} elseif (strlen($password) < 6) {
$errors[] = "密码长度至少为 6 位";
}
// 如果没有错误,处理数据
if (empty($errors)) {
try {
// 连接数据库
$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "pass");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 检查邮箱唯一性
$stmt = $pdo->prepare("SELECT COUNT(*) FROM users WHERE email = :email");
$stmt->execute(['email' => $email]);
if ($stmt->fetchColumn() > 0) {
$errors[] = "邮箱已被注册";
} else {
// 插入数据
$stmt = $pdo->prepare("INSERT INTO users (name, email, password) VALUES (:name, :email, :password)");
$stmt->execute([
'name' => $name,
'email' => $email,
'password' => password_hash($password, PASSWORD_DEFAULT)
]);
echo "注册成功!";
$_SESSION['csrf_token'] = bin2hex(random_bytes(32)); // 重置 CSRF 令牌
exit;
}
} catch (PDOException $e) {
$errors[] = "数据库错误: " . $e->getMessage();
}
}
}
}
// 显示错误并回显表单
if (!empty($errors)) {
echo "<div class='error'><ul>";
foreach ($errors as $error) {
echo "<li>$error</li>";
}
echo "</ul></div>";
}
include 'register.html';
?>
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
$name = htmlspecialchars($_POST['name'] ?? '', ENT_QUOTES, 'UTF-8');
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->execute(['name' => $name, 'email' => $email]);
<input type="email" name="email" required>
$_POST 是 PHP 中处理表单数据的核心工具,适合处理敏感信息和复杂表单。通过清理输入、验证数据、结合数据库操作和安全措施(如 XSS、SQL 注入和 CSRF 防护),开发者可以构建安全、用户友好的应用。上述示例展示了从表单设计到数据处理的完整流程,可作为用户注册、登录等场景的参考。

