php json_decode 无法解析,返回值null

今天工作中,遇到个很诡异的问题,在本地测试没有问题,传到线上测试服务器,运行出现了Bug。

我在做一个接口,使用php的curl扩展,向远程服务器post数据,在网上搜了很多关于json_decode解析返回null的解决办法,但是感觉跟自己的都不符合,在服务端打印出post过来的字符串, "{\"data\":[{\"xmon_task_id\":152,\"ip\":134744072,\"port\":80,\"xmon_list\":\"17,18,19,20,21,22\",\"updated_task_time\":1375779072,\"ip_char\":\"8.8.8.8\",\"rdlist_id\":\"6060\",\"is_main\":1,\"zr_id\":\"5821\",\"pause_flag\":0,\"operation_flag\":\"add_task\"}],\"key\":\"25a9368715693a50e6609beaae5e566a\"}" "

发现所有的双引号都被转义了,怪不得无法解析。在网上搜索了下,magic_quotes_gpc 这个选项导致的,我本地php.ini这个选项是关闭的,所以没有问题,但是线上测试服务器是新配置的,这个选项是打开的,所以就会出现不同的测试结果。在网上了找了下magic_quotes_gpc打开与否对程序的影响如下:

1. 对于PHP magic_quotes_gpc=on的情况, 我们可以不对输入和输出数据库的字符串数据作addslashes()和stripslashes()的操作,数据也会正常显示。
如果此时你对输入的数据作了addslashes()处理,那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠
2. 对于PHP magic_quotes_gpc=off 的情况
必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出,因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。
补充:
PHP magic_quotes_gpc作用范围是:WEB客户服务端;作用时间:请求开始时,例如当脚本运行时.
magic_quotes_runtime 作用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的;作用时间:每次当脚本访问运行状态中产生的数据

注意:

这个特性在PHP5.3.0中已经废弃并且在5.4.0中已经移除了(This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.)。所以没有理由再使用魔术引号,因为它不再是 PHP 支持的一部分。 不过它帮助了新手在不知不觉中写出了更好(更安全)的代码。 但是在处理代码的时候,最好是更改你的代码而不是依赖于魔术引号的开启。
 
最后贴出解决问题的方法:
function stripslashes_deep($value) {
  return is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value);
}
posted @ 2013-08-06 17:02  wangjunzi  阅读(2314)  评论(0编辑  收藏  举报