资讯专栏INFORMATION COLUMN

JS+PHP+MYSQL处理JSON的全面总结

anRui / 1358人阅读

摘要:结论把存入数据库前必须做次处理中文处理包含中文的字符串时,会将中文字符转换为的形式,而且通过是不能恢复的。处理特殊字符通过解决中文问题会带来新问题,的特殊字符处理。

开发过程中经常碰到要把前端的json格式的数据传递到后端php,php做一些业务处理后把数据存到mysql,然后,php再从mysql中取出数据返回到前端。虽然这是一个再基础不过的处理过程,但还是有不少问题需要认真研究。下面从几个环节看看可能出现的各种问题。

存入mysql前

假设前端传入的数据是:

{"html":"a"b"}

json_decode后,PHP对象是:

object(stdClass)#3 (1) {
  ["html"]=>
  string(3) "a"b"
}

注意要处理的数据中包含了双引号,这个字符在json中需要转意,在mysql中也需要转意。假如要把这个对象转换为json串存入mysql,先用json_encode处理:

{"html":"a"b"}

注意:双引号前面加上了反斜杠。再用real_escape_string处理:

{"html":"a"b"}

注意:所有的双引号和反斜杠(json_encode加上的那个)都加上了反斜杠。存入数据库的内容:

{"html":"a"b"}

按照这样的过程处理数据是正常的,从数据库取出后,用json_decode可以恢复原来的数据。但是如果在存入数据库前没有做real_escape_string的处理,直接存入数据库,那么数据库的内容:

{"html":"a"b"}

注意:这时a和b之间的双引号前面的反斜杠被mysql去掉了,数据库中的内容已经不是合法的json串。

结论1:把json存入mysql数据库前必须做1次real_escape_string

处理中文

json_encode处理包含中文的字符串时,会将中文字符转换为unicode的形式(uXXXX),而且通过json_decode是不能恢复的。例如处理前的对象是:

object(stdClass)#3 (1) {
  ["html"]=>
  string(6) "你好"
}

json_encode后的json串是:

{"html":"u4f60u597d"}

real_escape_string处理后存入mysql数据库:

{"html":"u4f60u597d"}

这样带来的问题是在mysql中就无法直接对这个串做处理,例如:

like "%你%"

解决这个问题的方法是,在进行json_encode前先对要处理的对象的值用urlencode处理一遍,json_encode后再用urldecode恢复回来,这样的到json串是:

{"html":"你好"}

结论2:通过urlencode解决json_encode将中文字符编码为unicode的形式。

处理特殊字符

通过urlencode解决中文问题会带来新问题,json的特殊字符处理。例如:双引号会被编码为“%22”,json_encode不会对%22特殊处理,【你"好】本应该编码为【你"好】,对双引号进行转义,但是结果是【你"好】,已经不是一个合法的json字符串。

解决这个问题前首先要搞清楚json中有哪些特殊字符,看下图:

来自:http://www.json.org/

解决这个问题的思路是在进行urlencode之前,先在这些特殊字符前加上反斜杠,这样urldecode之后就有了转义的反斜杠。

$str = str_replace(array("", """, "
", "
", "	"), array("", """, "
", "
", "	"), $str);

执行这个操作时要注意,必须先替换反斜杠,再替换其它特殊字符,否则,给特殊字符添加的反斜杠又会被再加上反斜杠。另一个问题注意要用双引号,php中单引号的内容不会转义,双引号才会。

总结:通过上述3个方面的处理,应该可以正确的处理json的问题了。但是,也许应该直接写一个拼接json串的方法,彻底不用json_encode,这样效率更高些,以后有机会试试。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/88048.html

相关文章

  • JS+PHP+MYSQL处理JSON全面总结

    摘要:结论把存入数据库前必须做次处理中文处理包含中文的字符串时,会将中文字符转换为的形式,而且通过是不能恢复的。处理特殊字符通过解决中文问题会带来新问题,的特殊字符处理。 开发过程中经常碰到要把前端的json格式的数据传递到后端php,php做一些业务处理后把数据存到mysql,然后,php再从mysql中取出数据返回到前端。虽然这是一个再基础不过的处理过程,但还是有不少问题需要认真研究。下...

    骞讳护 评论0 收藏0
  • PHP超时处理全面总结

    摘要:的毫秒级超时也有问题。。中超时实现一初级最简单的超时实现秒级超时思路很简单链接一个后端,然后设置为非阻塞模式,如果没有连接上就一直循环,判断当前时间和超时时间之间的差异。实际处理这个调用的部件在完成后,通过状态通知和回调来通知调用者。 概述 在PHP开发中工作里非常多使用到超时处理到超时的场合,我说几个场景: 异步获取数据如果某个后端数据源获取不成功则跳过,不影响整个页面展现 为了保...

    I_Am 评论0 收藏0
  • 后端知识点总结——NODE.JS基础

    摘要:后端知识点总结基础不是是一种软件开发平台,它的竞争对象历史第一次有一种语言可以通吃前后端网站阿里云镜像版本年初年中年底最新版本功能强大可靠,适合大型企业级项目简单易用适合互联网项目易用适合平台性能好适合服务器端密集型项目不适合密集型项目密集 后端知识点总结——NODE.JS基础 1.Node.js Node.js不是JS,是一种软件开发平台,它的竞争对象JSP/PHP/ASP.NET...

    Freeman 评论0 收藏0
  • php之道》读后总结 php学习纲要

    摘要:日期和时间使用类完成读取设置比较和计算日期与时间。单元测试单元测试是从编写开始,贯穿于整个开发周期的一种用于保证函数类和方法的行为与预期一致的编程方法。是应用的单元测试框架的业界标准,其他几个可选框架是行为驱动开发行为驱动开发有两种方式和。 《php之道》阅读地址:http://wulijun.github.io/php-the-right-way/#code_style_guide ...

    gitmilk 评论0 收藏0
  • JavaScript 进阶知识 - Ajax篇

    摘要:注意事项以下版本要设置默认编码,,否则程序可能无法正确显示中文。组成部分协议是对请求和响应的报文内容进行了约束和规范。请求报文请求是由客户端发起,其规范格式为请求行请求头请求主体。 showImg(https://segmentfault.com/img/remote/1460000013696283?w=1920&h=1080); Ajax 前言 前面我们已经学习了js基础知识和一些...

    Dongjie_Liu 评论0 收藏0

发表评论

0条评论

anRui

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<