[关闭]
@Chiang 2020-08-09T10:43:08.000000Z 字数 1931 阅读 563

PHP解析表单传输过来的json数组

2020-08 工作总结


这里说明下我在doitphp 框架下直接调用的self:getParams('param')方法

遇到的问题(这里只是举个例子并没有实际测试)

JavaScript 代码

  1. var httpRequest = new XMLHttpRequest();//第一步:创建需要的对象
  2. httpRequest.open('POST', 'url', true); //第二步:打开连接/***发送json格式文件必须设置请求头 ;如下 - */
  3. httpRequest.setRequestHeader("Content-type","application/json");//设置请求头 注:post方式必须设置请求头(在建立连接后设置请求头)
  4. var obj = { name: 'zhansgan', age: 18 };
  5. httpRequest.send(JSON.stringify(obj));//发送请求 将json写入send中
  6. /**
  7. * 获取数据后的处理程序
  8. */
  9. httpRequest.onreadystatechange = function () {//请求后的回调接口,可将请求成功后要执行的程序写在其中
  10. if (httpRequest.readyState == 4 && httpRequest.status == 200) {//验证请求是否发送成功
  11. var json = httpRequest.responseText;//获取到服务端返回的数据
  12. console.log(json);
  13. }
  14. };

PHP代码

传过来的json数组样式范例:

  1. [{"name":"zhansgan","age","18"},{"name":"zhansgan","age","18"}]
  2. $regionsReqs = self:getParams('regionsReqs');
  3. $regionsReqsJson = json_decode($regionsReqs,true);

哈哈这样居然解析不了,一脸蒙圈...

问题分析

JavaScript如果直接传对象数组过来的话是这样的,也不对

  1. [object, object]

查看下框架 getParams 方法的实现原理

  1. /**
  2. * 获取并分析$_GET或$_POST全局超级变量数组某参数的值
  3. *
  4. * 获取并分析$_POST['参数']的值 ,当$_POST['参数']不存在或为空时,再获取$_GET['参数']的值
  5. *
  6. * @access public
  7. *
  8. * @param string $key 所要获取的参数名称
  9. * @param mixed $default 默认参数, 注:只有$string不为数组时有效
  10. * @param boolean $isEncode 是否对符串进行htmlspecialchars()转码(true:是/ false:否)
  11. *
  12. * @return mixed
  13. */
  14. public static function getParams($key = null, $default = null, $isEncode = true) {
  15. //参数分析
  16. if (!$key) {
  17. return self::_params($isEncode);
  18. }
  19. $params = self::post($key, null, $isEncode);
  20. //当$_POST[$key]值为空时
  21. return (!is_null($params)) ? $params : self::get($key, $default, $isEncode);
  22. }

@param boolean $isEncode 是否对符串进行htmlspecialchars()转码(true:是/ false:否)

这段注释解释了原因,对接收的数据框架方法默认进行了htmlspecialchars(将特殊字符转换为 HTML 实体)

解决方案:

  • 方案1 方法调用传相关参数取消实体转换
  1. $regionsReqs = self:getParams('regionsReqs', false);
  • 方案2 把框架方法接收到的数据再转义回来
  1. $regionsReqs = self:getParams('regionsReqs');
  2. $regionsReqs = htmlspecialchars_decode($regionsReqs);
  3. $regionsReqsJson = json_decode($regionsReqs,true);

总结

这里主要就是两个函数的相互解析的问题
htmlspecialchars
htmlspecialchars_decode

项目中遇到的问题去看框架方法是如何实现的,这可能不是最优方案,但是这是最准确的方案

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注