PHP处理DELETE请求需先用$_SERVER['REQUEST_METHOD']确认方法为DELETE,再通过file_get_contents('php://input')读取JSON数据并解析,同时正确响应CORS预检OPTIONS请求,最后校验参数与权限后执行安全删除。

PHP本身不直接区分DELETE请求和其他HTTP方法,关键在于正确接收并解析JS发送的DELETE请求数据。核心是:确保前端用fetch或axios发DELETE请求,后端用$_SERVER['REQUEST_METHOD']判断方法,并通过file_get_contents('php://input')读取请求体(尤其是JSON格式)。
确认请求确实到达PHP且方法为DELETE
浏览器或curl发出的DELETE请求必须被Web服务器(如Apache、Nginx)正常转发,不能被重写或拦截。在PHP脚本开头加调试代码验证:
var_dump($_SERVER['REQUEST_METHOD']); // 应输出 string(6) "DELETE" var_dump($_POST); // 通常为空 — DELETE一般不用application/x-www-form-urlencoded
如果输出不是"DELETE",检查:
- 前端是否真的发了DELETE(而非GET/POST伪装)
- Web服务器配置是否允许DELETE方法(部分共享主机默认禁用)
- 是否有.htaccess或Nginx规则误将DELETE转为GET
读取DELETE请求中的数据(特别是JSON)
DELETE请求常携带JSON数据(如{ "id": 123 }),但PHP不会自动解析到$_POST或$_GET。需手动读取原始输入流:
立即学习“PHP免费学习笔记(深入)”;
$rawData = file_get_contents('php://input');
$data = json_decode($rawData, true);
if (json_last_error() === JSON_ERROR_NONE && is_array($data)) {
$id = $data['id'] ?? null;
// 后续执行删除逻辑,如数据库操作
}
注意:php://input只能读取一次,且仅对application/json等非表单类型有效;若前端用Content-Type: application/x-www-form-urlencoded发DELETE(不推荐),可用parse_str($rawData, $data)解析。
处理跨域(CORS)与预检请求(OPTIONS)
前端若跨域发DELETE,浏览器会先发OPTIONS预检。PHP需响应预检请求,否则DELETE不会发出:
// 允许DELETE方法和自定义头(如Authorization)
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
header('Access-Control-Allow-Origin: https://your-frontend-domain.com');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(200);
exit;
}
未正确处理OPTIONS会导致控制台报错“CORS header ‘Access-Control-Allow-Origin’ missing”,DELETE根本不会到达PHP。
安全与实际删除逻辑示例
拿到ID后,务必做参数校验、权限检查和防SQL注入。不要直接拼接SQL:
if (!is_numeric($id) || $id <= 0) {
http_response_code(400);
echo json_encode(['error' => 'Invalid ID']);
exit;
}
// 假设已验证用户有权限删除该资源
$stmt = $pdo->prepare("DELETE FROM posts WHERE id = ? AND user_id = ?");
$stmt->execute([$id, $currentUserId]);
if ($stmt->rowCount() > 0) {
http_response_code(200);
echo json_encode(['success' => true]);
} else {
http_response_code(404);
echo json_encode(['error' => 'Not found or no permission']);
}



















