HTTP 请求方法实现,常见的方式包括 GET 和 POST。此外,还有 PUT、DELETE 等其他方法(通常用于 RESTful API,需结合其他技术实现)。以下是具体说明及对应的数据获取方式:
1. GET 方法
特点
数据通过 URL 传递,格式为
?key1=value1&key2=value2
。适合非敏感、非机密数据(如搜索关键词)。
有长度限制(取决于浏览器和服务器配置)。
HTML 表单示例
<form method="GET" action="process.php">
<input type="text" name="keyword">
<input type="submit" value="搜索">
</form>
PHP 获取数据
使用 $_GET
超全局数组:
$keyword = $_GET['keyword'] ?? '';
echo "搜索关键词:" . htmlspecialchars($keyword);
2. POST 方法
特点
数据通过 HTTP 请求体传输,不会暴露在 URL 中。
适合传输敏感数据(如密码、文件上传)。
无长度限制(但受服务器配置
post_max_size
限制)。
HTML 表单示例
<form method="POST" action="process.php">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit" value="登录">
</form>
PHP 获取数据
使用 $_POST
超全局数组:
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
echo "用户名:" . htmlspecialchars($username);
3. 文件上传(特殊 POST 方法)
特点
需设置表单
enctype="multipart/form-data"
。文件数据通过
$_FILES
超全局数组获取。
HTML 表单示例
<form method="POST" action="upload.php" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上传">
</form>
PHP 获取文件数据
$file = $_FILES['file'] ?? [];
if (!empty($file['name'])) {
$fileName = $file['name'];
$tmpPath = $file['tmp_name'];
move_uploaded_file($tmpPath, "uploads/$fileName");
echo "文件上传成功!";
}
4. 其他 HTTP 方法(PUT/DELETE)
特点
通常用于 RESTful API,需通过
AJAX
或前端框架(如 Fetch API)发送。PHP 默认不支持直接通过表单提交这些方法,需手动解析请求体。
PHP 获取数据
使用 php://input
流读取原始请求体,并解析数据:
if ($_SERVER['REQUEST_METHOD'] === 'PUT') {
$rawData = file_get_contents("php://input");
parse_str($rawData, $putData);
$value = $putData['key'] ?? '';
}
5. $_REQUEST 变量(不推荐)
特点
合并了
$_GET
、$_POST
和$_COOKIE
的数据。存在安全隐患(如变量覆盖),建议明确使用
$_GET
或$_POST
。
示例
$value = $_REQUEST['key'] ?? '';
关键区别总结
方法 数据位置 数据获取变量 适用场景 GET URL 参数 $_GET
搜索、分页、公开数据查询 POST HTTP 请求体 $_POST
登录、注册、敏感数据提交 文件上传 HTTP 请求体 (multipart) $_FILES
上传图片、文档等文件 PUT/DELETE HTTP 请求体 php://input
RESTful API 操作资源
安全注意事项
输入过滤 使用
filter_input()
或htmlspecialchars()
防止 XSS 攻击:$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
防止 SQL 注入 使用预处理语句(如 PDO 或 MySQLi)处理数据库操作:
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);CSRF 防护 添加 Token 验证,防止跨站请求伪造:
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
die("非法请求!");
}
}
完整示例:安全表单处理
<?php
session_start();
// 生成 CSRF Token
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 验证 CSRF Token
if (!isset($_POST['csrf_token']) || !hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
die("非法请求!");
}
// 过滤输入数据
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
$password = $_POST['password'] ?? '';
// 验证必填字段
if (empty($username) || empty($password)) {
die("用户名和密码不能为空!");
}
// 数据库操作(示例)
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
$user = $stmt->fetch();
// 验证密码
if ($user && password_verify($password, $user['password'])) {
echo "登录成功!";
} else {
echo "用户名或密码错误!";
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>登录</title>
</head>
<body>
<form method="POST">
<input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">
用户名:<input type="text" name="username" required><br>
密码:<input type="password" name="password" required><br>
<input type="submit" value="登录">
</form>
</body>
</html>
总结
GET 用于非敏感数据,通过
$_GET
获取。POST 用于敏感数据或文件上传,通过
$_POST
和$_FILES
获取。PUT/DELETE 需手动解析
php://input
。始终优先使用
$_GET
或$_POST
,避免$_REQUEST
。结合 输入过滤、预处理语句 和 CSRF Token