在PHP中,$_POST是一个超全局变量,用于收集通过HTTP POST方法提交的表单数据。与$_GET不同,POST方法适合传输敏感信息和大量数据。
$_POST是PHP预定义的超全局数组变量,专门用于接收通过method="post"提交的表单数据。
post_max_size配置项进行调整。
创建一个使用POST方法的HTML表单:
<!DOCTYPE html>
<html>
<head>
<title>用户注册</title>
</head>
<body>
<form action="process.php" method="post">
<div>
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required>
</div>
<div>
<label for="password">密码:</label>
<input type="password" id="password" name="password" required>
</div>
<div>
<label for="email">邮箱:</label>
<input type="email" id="email" name="email" required>
</div>
<button type="submit">提交</button>
</form>
</body>
</html>
<?php
// 检查是否有POST数据提交
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// 接收表单数据
$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];
// 验证数据(实际应用中应进行更严格的验证)
if (!empty($username) && !empty($password) && !empty($email)) {
echo "注册成功!<br>";
echo "用户名:" . htmlspecialchars($username) . "<br>";
echo "邮箱:" . htmlspecialchars($email) . "<br>";
// 在实际应用中,这里应该将数据存入数据库
// 并且密码应该使用password_hash()进行哈希处理
} else {
echo "请填写所有必填字段!";
}
} else {
echo "无效的请求方法!";
}
?>
接收POST数据时,必须进行验证:
<?php
// 验证电子邮件格式
if (isset($_POST['email'])) {
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "邮箱格式正确:$email";
} else {
echo "无效的邮箱格式";
}
}
// 验证数字
if (isset($_POST['age'])) {
$age = filter_var($_POST['age'], FILTER_SANITIZE_NUMBER_INT);
if (filter_var($age, FILTER_VALIDATE_INT,
array("options" => array("min_range" => 1, "max_range" => 120)))) {
echo "年龄有效:$age";
} else {
echo "无效的年龄";
}
}
?>
<?php
// 使用预处理语句防止SQL注入
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 准备SQL语句
$stmt = $conn->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $username, $email, $hashed_password);
// 设置参数并执行
$username = $_POST['username'];
$email = $_POST['email'];
$hashed_password = password_hash($_POST['password'], PASSWORD_DEFAULT);
$stmt->execute();
echo "新记录插入成功";
$stmt->close();
$conn->close();
?>
| 特性 | $_POST | $_GET |
|---|---|---|
| 数据位置 | HTTP请求主体中 | URL查询字符串中 |
| 数据可见性 | 不可见(相对安全) | 可见在URL中 |
| 数据大小限制 | 较大(默认8MB) | 较小(受URL长度限制) |
| 缓存 | 通常不缓存 | 可被缓存 |
| 适用场景 | 表单提交、敏感数据 | 页面跳转、搜索查询 |
| 书签支持 | 不支持 | 支持 |
$_REQUEST是一个包含$_GET、$_POST和$_COOKIE数据的超全局数组。
<?php
// 使用$_REQUEST接收数据(可以接收GET或POST方法提交的数据)
if (isset($_REQUEST['name'])) {
$name = htmlspecialchars($_REQUEST['name']);
echo "你好,$name!";
}
// 注意:使用$_REQUEST时要注意数据来源的优先级
// 可以通过php.ini中的request_order配置项调整
?>
$_REQUEST同时包含GET和POST数据,使用时需要特别小心,建议明确使用$_GET或$_POST以避免安全风险。
<?php
session_start();
// 处理登录表单
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['login'])) {
$username = trim($_POST['username']);
$password = $_POST['password'];
// 简单的验证(实际应用中应该查询数据库)
if ($username === 'admin' && $password === '123456') {
$_SESSION['username'] = $username;
$_SESSION['login_time'] = time();
echo "登录成功!欢迎 $username";
} else {
echo "用户名或密码错误!";
}
}
// 检查用户是否已登录
if (isset($_SESSION['username'])) {
echo "当前登录用户:" . $_SESSION['username'];
}
?>
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_FILES['file'])) {
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["file"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));
// 检查文件是否为真实图片
if (isset($_POST["submit"])) {
$check = getimagesize($_FILES["file"]["tmp_name"]);
if ($check !== false) {
echo "文件是一个图片 - " . $check["mime"] . ".";
$uploadOk = 1;
} else {
echo "文件不是图片。";
$uploadOk = 0;
}
}
// 检查文件大小
if ($_FILES["file"]["size"] > 500000) {
echo "抱歉,文件太大。";
$uploadOk = 0;
}
// 允许的文件格式
if ($imageFileType != "jpg" && $imageFileType != "png" &&
$imageFileType != "jpeg" && $imageFileType != "gif") {
echo "抱歉,只允许 JPG, JPEG, PNG & GIF 文件。";
$uploadOk = 0;
}
// 检查上传是否成功
if ($uploadOk == 0) {
echo "抱歉,文件上传失败。";
} else {
if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_file)) {
echo "文件 " . basename($_FILES["file"]["name"]) . " 上传成功。";
} else {
echo "抱歉,上传文件时发生错误。";
}
}
}
?>
htmlspecialchars()防止XSS攻击password_hash()进行哈希处理可能原因:
post_max_size设置过小POST方法相比GET方法更安全,因为数据不显示在URL中。但POST数据仍然可能被拦截,敏感数据传输应该使用HTTPS协议。
<?php
// 查看所有POST数据
echo "<pre>";
print_r($_POST);
echo "</pre>";
// 或者使用var_dump
var_dump($_POST);
?>