关键在前后端数据格式匹配:发JSON时PHP须用file_get_contents("php://input")解析,发表单数据则直接读$_POST,传FormData需分别取$_POST和$_FILES。

JS 用 fetch 调用 PHP 接口,关键在前后端数据格式匹配和接收方式一致。不配对就会发出去了、PHP 却收不到——不是 JS 没发,而是 PHP 没“认出”。
确认请求方式与 Content-Type 匹配
PHP 对不同 Content-Type 的处理机制完全不同:
-
发 JSON(
application/json):前端用JSON.stringify(),PHP 必须用file_get_contents("php://input")+json_decode()解析;$_POST为空。 -
发表单数据(
application/x-www-form-urlencoded):前端拼接key=value&key2=value2或用URLSearchParams,PHP 可直接读$_POST['key']。 -
发 FormData(
multipart/form-data):前端传new FormData(form),PHP 从$_POST(普通字段)和$_FILES(文件)中分别取值。
前端 fetch 写法示例(按场景选一种)
✅ 推荐使用 async/await 提升可读性,同时加基础错误处理:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
-
传 JSON 数据:
<!-- JS -->const data = { name: "张三", email: "zhang@example.com" };<br> fetch("save.php", {<br> method: "POST",<br> headers: { "Content-Type": "application/json" },<br> body: JSON.stringify(data)<br> }).then(r => r.json()).then(console.log).catch(console.error); -
传表单键值对:
const params = new URLSearchParams();<br> params.append("name", "张三");<br> params.append("email", "zhang@example.com");<br> fetch("save.php", { method: "POST", body: params })<br> .then(r => r.text()).then(console.log); -
传整个表单(含文件):
const form = document.querySelector("#myForm");<br> fetch("upload.php", { method: "POST", body: new FormData(form) })<br> .then(r => r.json()).then(console.log);
PHP 端必须对应接收
别只写 JS,PHP 怎么收决定成败:
立即学习“PHP免费学习笔记(深入)”;
-
收 JSON:
<!-- save.php -->header("Content-Type: application/json; charset=utf-8");<br> $input = file_get_contents("php://input");<br> $data = json_decode($input, true);<br> if (json_last_error() !== JSON_ERROR_NONE) {<br> http_response_code(400);<br> echo json_encode(["error" => "Invalid JSON"]);<br> exit;<br> }<br> $name = $data["name"] ?? "";<br> // 后续处理…<br> echo json_encode(["status" => "ok"]); -
收表单或 FormData:
header("Content-Type: application/json; charset=utf-8");<br> $name = $_POST["name"] ?? "";<br> $email = $_POST["email"] ?? "";<br> // 若有文件:<br> $file = $_FILES["avatar"] ?? null;<br> echo json_encode(["received" => true]);
调试时先确认基础通路
遇到“没反应”或“500”,优先检查这几项:
- PHP 文件路径是否正确?用浏览器直接访问该地址,看是否返回空白页或报错(说明 PHP 环境正常)。
- 打开浏览器开发者工具 → Network 标签页,点击请求,看 Headers 中的 Request URL、Method、Content-Type 是否符合预期;再看 Response 是不是 200 或具体错误信息。
- 在 PHP 开头临时加
file_put_contents("debug.log", print_r($_POST, true), FILE_APPEND);,确认数据是否进来了。 - 跨域问题?若前端域名和 PHP 域名不同,PHP 需加响应头:
header("Access-Control-Allow-Origin: *");(上线前请限制来源)。


















