$_post为空是因为小程序默认content-type为application/json,php需用file_get_contents('php://input')读取并json_decode解析,而非依赖$_post。

小程序 form-data 提交到 PHP 后端,$_POST 为空?
小程序使用 wx.request 发起 POST 请求时,默认 Content-Type 是 application/json,但很多开发者误用 FormData 或 uploadFile 混淆了提交方式。结果 PHP 端收不到 $_POST,$_FILES 也为空——根本不是 PHP 解析问题,而是前端没发对。
关键判断:先看请求的 Content-Type 和实际 payload 格式:
- 若 Content-Type 是
application/json,PHP 必须用file_get_contents('php://input')读原始体,再json_decode - 若 Content-Type 是
multipart/form-data(比如用wx.uploadFile传表单+文件),PHP 才会自动填充$_POST和$_FILES - 若 Content-Type 是
application/x-www-form-urlencoded,则$_POST可用,但小程序需手动拼 query string 或用URLSearchParams
PHP 怎么安全接收并解析小程序传来的 JSON 表单
小程序最常用方式是 JSON.stringify 后 POST 到接口,此时后端不能依赖 $_POST。必须主动读取原始输入流,并做基础校验。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 用
$raw = file_get_contents('php://input')获取原始数据,不要直接用$_POST - 加空值判断:
if (!$raw) { http_response_code(400); exit('empty body'); } - 用
json_decode($raw, true),并检查json_last_error()是否为JSON_ERROR_NONE - 字段过滤建议用
filter_var或白名单数组键校验,避免直接写入数据库
示例片段:
$raw = file_get_contents('php://input');
if (!$raw) {
die('no data');
}
$data = json_decode($raw, true);
if (json_last_error() !== JSON_ERROR_NONE) {
die('invalid json');
}
$user_id = $data['user_id'] ?? null;
$mobile = filter_var($data['mobile'] ?? '', FILTER_SANITIZE_STRING);
小程序上传文件 + 表单字段,PHP 怎么同时拿到 $_POST 和 $_FILES
必须用 wx.uploadFile,且 formData 参数传普通字段(如 { openid: "xxx", remark: "test" })。此时请求是标准 multipart/form-data,PHP 自动解析。
注意点:
- 小程序端
uploadFile的name字段(如file)会成为 PHP 中$_FILES['file']的 key -
formData里的键名,就是$_POST的键名,大小写敏感 - PHP 配置要检查:
file_uploads = On、post_max_size和upload_max_filesize要够大 - 上传后
$_FILES['file']['error'] === UPLOAD_ERR_OK才表示成功,否则要查错误码
为什么小程序提交后 PHP 收到的是乱码或空字符串?
常见原因不是编码设置错,而是小程序发送时未指定字符集或 PHP 未正确处理 UTF-8。尤其含中文字段时容易出问题。
排查方向:
- 确认小程序请求 header 里有
Content-Type: application/json; charset=utf-8(JSON 方式) - PHP 文件本身保存为 UTF-8 无 BOM;输出前不要 echo 任何非 UTF-8 字符(包括注释里的中文)
- 如果用了
iconv或mb_convert_encoding强转,优先用mb_detect_encoding判断原始编码,而不是盲目转 - 数据库写入前,确保连接层用了
utf8mb4(如 PDO DSN 加;charset=utf8mb4)
真正麻烦的不是“怎么解”,而是“谁在中间改了编码”——Nginx、PHP-FPM、MySQL 连接、甚至小程序开发工具的调试器都可能悄悄转码。建议从 bin2hex($raw) 开始逐层打日志,比猜快得多。











