
Fetch API 使用 JSON.stringify() 发送数据时,PHP 的 $_POST 无法自动解析,需改用 php://input 读取原始 JSON;或改用 URLSearchParams 发送表单格式数据以兼容 $_POST。
fetch api 使用 `json.stringify()` 发送数据时,php 的 `$_post` 无法自动解析,需改用 `php://input` 读取原始 json;或改用 `urlsearchparams` 发送表单格式数据以兼容 `$_post`。
在前端使用 fetch() 发起 POST 请求时,请求体格式(body)与服务端预期的数据解析方式必须严格匹配。你当前的代码发送的是标准 JSON(通过 JSON.stringify() 构造,并设置了 'Content-Type': 'application/json'),但 PHP 默认仅将 application/x-www-form-urlencoded 或 multipart/form-data 类型的请求自动解析到 $_POST 超全局数组中。而 application/json 请求体中的数据不会填充 $_POST——这是 PHP 的设计行为,而非 Bug。
✅ 方案一:前端改用 URLSearchParams(推荐用于简单表单场景)
这种方式保持后端无需修改,直接复用熟悉的 $_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
})
})
.then(response => response.json())
.then(data => {
console.log(data);
if (data.success) {
$('#bodyDiv').load('/presentation/mbooking_form_content2.php?bookingCode=' + data.bookingCode);
} else {
document.getElementById("messagesDiv").textContent = data.message;
}
})
.catch(err => console.error('Request failed:', err));
✅ 优势:无需改动 PHP 逻辑,
$_POST['fromDate']等可直接使用;语义清晰,天然支持表单字段编码(如空格、中文自动转义)。
✅ 方案二:后端适配 JSON 请求(推荐用于 API 化、前后端分离项目)
若坚持使用 JSON(更规范、支持嵌套结构、避免键名限制),则 PHP 必须主动读取原始请求体:
<?php header('Content-Type: application/json; charset=utf-8');
// 从原始输入流读取 JSON 字符串
$json = file_get_contents('php://input');
$data = json_decode($json, true);
// 验证 JSON 解析是否成功
if (json_last_error() !== JSON_ERROR_NONE) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'Invalid JSON']);
exit;
}
$a = 'a>';
$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);
⚠️ 注意事项:
- 务必检查
json_decode()结果,防止空/非法 JSON 导致null键访问错误;- 添加
header('Content-Type: application/json')确保前端response.json()正常解析;- 使用空合并操作符
??安全访问可能缺失的字段;- 不要依赖
$_POST或$_GET—— JSON 数据只存在于php://input流中(且仅可读取一次)。
? 验证与调试建议
- 前端:在
fetch前console.log(JSON.stringify({...}))确认数据结构; - 后端:临时添加
file_put_contents('debug.log', print_r($data, true), FILE_APPEND);记录实际接收到的数据; - 使用浏览器 DevTools 的 Network → Payload 标签页,确认请求头
Content-Type与请求体内容一致; - 若启用 CORS,请确保 PHP 响应头包含
Access-Control-Allow-Origin(开发阶段可设为*)。
两种方案本质是「前后端媒介协议对齐」问题。选择 URLSearchParams 更轻量快捷;选择 JSON + php://input 则更符合现代 RESTful API 实践。根据你的项目架构(传统 PHP 混合渲染 or 前后端分离)合理决策即可。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











