PHP表单处理程序无法解析JavaScript XMLHttpRequest发送的JSON数据
问题根因
- PHP端传参错误:需要解析的JSON字符串存放在
$_GET数组的data字段中,你错误将整个$_GET数组传入json_decode,数组无法被JSON解析工具识别,返回null,后续字段取值自然为空。 - 前端未做URL编码:JSON字符串包含双引号、空格等特殊字符,直接拼接到GET请求URL中会被自动转义或截断,导致后端拿到的JSON格式损坏,解析失败。
- 缺少错误校验:未判断
json_decode的解析结果合法性,无法快速定位问题。
修复步骤
1. 前端代码修改
对拼接的JSON字符串做URL编码,修改请求初始化代码:
const prospectJson = JSON.stringify(prospect); // 新增encodeURIComponent编码处理 xhr.open('get', 'inc/contact_form_handler.php?data=' + encodeURIComponent(prospectJson), false); xhr.send();
2. 后端代码修改
从data字段取JSON字符串解析,新增解析校验逻辑:
/* get form data JSON */ $prospectArray = $_GET; print_r($prospectArray); // 先校验参数存在性 if (!isset($prospectArray['data'])) { http_response_code(400); exit('缺少必要的data参数'); } // 从data字段取JSON字符串解析 $arr = json_decode($prospectArray['data'], true); // 校验解析结果合法性 if (json_last_error() !== JSON_ERROR_NONE || !is_array($arr)) { http_response_code(400); exit('JSON解析失败:' . json_last_error_msg()); } // 正常赋值 $firstName = $arr["first_name"]; $lastName = $arr["last_name"]; $email = $arr["email"]; $projectDescription = $arr["project_description"];
可选优化
提交表单数据更推荐使用POST请求,GET请求有长度限制,且参数会留在服务器访问日志中,安全性和适用性都弱于POST。
内容的提问来源于stack exchange,提问作者bsp70
相关产品推荐
相关产品推荐

