php获取http参数需按请求方式区分:get用$_get,post表单用$_post,json等非表单数据必须用file_get_contents('php://input')配合json_decode();$_request不推荐。

PHP怎么获取HTTP请求参数
PHP获取参数不是统一用一个函数,得看请求方式和数据格式。GET参数直接从 $_GET 拿,POST表单数据走 $_POST,但如果是前端用 fetch 或 axios 发的 Content-Type: application/json 请求,$_POST 是空的——这时候必须手动读原始输入流。
-
file_get_contents('php://input')是唯一可靠方式,适用于 JSON、纯文本等非表单类请求体 -
$_REQUEST不推荐,它混了 GET/POST/COOKIE,顺序和覆盖逻辑容易出错 - 用
$_SERVER['REQUEST_METHOD']先判断是 GET、POST 还是 PUT/DELETE,再决定怎么取
json_decode() 处理失败的常见原因
拿到原始 JSON 字符串后,json_decode() 返回 null 却不报错,是最常踩的坑。根本原因几乎都是编码或格式问题。
- 前端发的 JSON 里有中文但没设 UTF-8 编码,或 PHP 文件本身不是 UTF-8(BOM头也会导致解析失败)
- 用了
JSON_UNESCAPED_UNICODE但没传第二个参数true,结果返回对象而非数组,后续用$data['key']会报错 - 忘记检查
json_last_error(),比如错误码JSON_ERROR_SYNTAX对应的是 JSON 格式错误,不是 PHP 语法问题
把 PHP 参数安全转成 JSON 输出
用 json_encode() 输出时,重点不是“能不能转”,而是“转出来能不能被前端正确解析”。默认行为在生产环境经常翻车。
- 含中文时务必加
JSON_UNESCAPED_UNICODE,否则变成\u4f60\u597d,前端要额外处理 - 数据库查出来的
datetime字段是字符串,但带时区或微秒可能触发json_encode()报错,建议提前用date('c', strtotime($str))标准化 - 资源类型(如
mysqli_result)或闭包不能直接 encode,会静默转成空对象或报错,需显式转换为数组 - 输出前记得设 header:
header('Content-Type: application/json; charset=utf-8');,否则某些浏览器或框架会当文本处理
调试时快速验证参数和 JSON 流程
别靠猜。本地调试时,把关键步骤打点输出,比看文档更快定位问题。
立即学习“PHP免费学习笔记(深入)”;
var_dump($_SERVER['REQUEST_METHOD']);
var_dump(file_get_contents('php://input'));
$data = json_decode(file_get_contents('php://input'), true);
var_dump(json_last_error(), json_last_error_msg());
var_dump($data);
如果 file_get_contents('php://input') 是空字符串,说明不是 POST/PUT 请求,或者 Nginx/Apache 配置限制了请求体大小(如 client_max_body_size)。这些细节,不打出来根本看不到。











