
fetch 发送 json 数据时,php 默认无法通过 $_post 获取,需改用 php://input 读取原始请求体,或在前端改用 urlsearchparams 发送表单格式数据。
fetch 发送 json 数据时,php 默认无法通过 $_post 获取,需改用 php://input 读取原始请求体,或在前端改用 urlsearchparams 发送表单格式数据。
在使用 Fetch API 向 PHP 后端发送 POST 请求时,一个常见却容易被忽视的误区是:客户端发送的数据格式必须与服务端预期的解析方式严格匹配。你当前的代码中,前端通过 JSON.stringify() 将数据序列化为 JSON,并设置了 'Content-Type': 'application/json';但 PHP 服务端仍尝试从 $_POST 超全局数组中读取字段——这注定失败,因为 $_POST 仅自动填充 application/x-www-form-urlencoded 或 multipart/form-data 类型的请求体,对 application/json 完全不生效。
✅ 方案一:前端保持 JSON,后端适配(推荐用于 API 场景)
这是更现代、更规范的做法,尤其适用于前后端分离架构。只需修改 PHP 服务端代码,从原始输入流中解析 JSON:
<?php
header('Content-Type: application/json; charset=utf-8');
$a = "a>";
$json = file_get_contents("php://input"); // ← 关键:读取原始请求体
$data = json_decode($json, true);
// 安全检查:确保解析成功且为数组
if (json_last_error() !== JSON_ERROR_NONE || !is_array($data)) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'Invalid JSON']);
exit;
}
// 安全地提取字段(使用 null 合并操作符避免未定义索引警告)
$a .= $data['fromDate'] ?? '';
$a .= $data['toDate'] ?? '';
$a .= $data['apptmnt'] ?? '';
$a .= $data['total'] ?? '';
$a .= $data['lan'] ?? '';
$result = [
'success' => true,
'message' => $a,
'bookingCode' => '1234567'
];
echo json_encode($result);⚠️ 注意事项:
- 必须添加
header('Content-Type: application/json'),确保前端response.json()正确解析;- 务必校验
json_decode结果,防止空请求或非法 JSON 导致致命错误;- 使用
$data['key'] ?? ''替代isset($data['key'])判断,更简洁且防 Notice 级错误。
✅ 方案二:前端改用表单编码,后端保持 $_POST(兼容传统 PHP 表单逻辑)
若后端逻辑深度依赖 $_POST(如已存在大量验证/过滤逻辑),可将前端改为发送标准表单数据:
fetch('/api/apicreatebooking.php', {
method: 'POST',
body: new URLSearchParams({
fromDate: document.getElementById('fromDate').value,
toDate: document.getElementById('toDate').value,
apptmnt: document.querySelector('input[name="unit"]:checked')?.value || '',
total: document.getElementById('total').value,
lan: document.getElementById('lan').value
})
// 不再设置 Content-Type —— 浏览器会自动设为 application/x-www-form-urlencoded
})
.then(r => r.json())
.then(data => {
// 处理响应...
});此时 PHP 服务端无需修改,$_POST['fromDate'] 等即可正常工作。
? 根本原因总结
| 维度 | application/json |
application/x-www-form-urlencoded |
|---|---|---|
| PHP 自动填充 | ❌ 不填充 $_POST
|
✅ 填充 $_POST
|
| 获取方式 | file_get_contents('php://input') |
$_POST |
| 适用场景 | RESTful API、前后端分离 | 传统 PHP 表单提交、快速迭代 |
选择哪种方案取决于你的架构定位:追求标准化与可扩展性,选方案一;追求最小改动与向后兼容,选方案二。无论哪种,核心原则不变:前后端内容类型(Content-Type)与数据解析逻辑必须一致。

















