首页->正文

转义符导致json和parse_str解析的两则问题

2011-08-27 -Web开发 标签: php javascript

一:json解析问题
网站开发和qq账号的联合登录,调用上直接使用了qq开放平台提供的函数。但后来提交测试后,发现含有转义符(\)的昵称无法正常解析,直接返回了null,原因是返回的json用户信息格式中“\”未转义导致,看以下的测试例子:
<?php
//用户的昵称为\abc
$arr = array('nickname' => "\abc");
$arr_js = json_encode($arr);
echo $arr_js, "\n";
var_dump(json_decode($arr_js, 1));
echo "\n";

//如果输出的json直接赋值,仍提示错误
$s = '{"nickname":"\\abc"}';
echo $s, "\n";
var_dump(json_decode($s, 1));
print_josn_error();
echo "\n";

//增加转义后格式正常,和输出内容一致
$s = '{"nickname":"\\\abc"}';
echo $s, "\n";
var_dump(json_decode($s, 1));
print_josn_error();

//以下为php手册中提供的代码
function print_josn_error(){
     switch (json_last_error()) {
          case JSON_ERROR_NONE:
               echo ' - No errors';
          break;
          case JSON_ERROR_DEPTH:
               echo ' - Maximum stack depth exceeded';
          break;
          case JSON_ERROR_STATE_MISMATCH:
               echo ' - Underflow or the modes mismatch';
          break;
          case JSON_ERROR_CTRL_CHAR:
               echo ' - Unexpected control character found';
          break;
          case JSON_ERROR_SYNTAX:
               echo ' - Syntax error, malformed JSON';
          break;
          case JSON_ERROR_UTF8:
               echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
          break;
          default:
               echo ' - Unknown error';
          break;
     }
     echo "\n";
}


如果php版本为5.3及以上(json_last_error函数5.3以下未提供)的话可以看到如下结果
{"nickname":"\\abc"}
array(1) {
  ["nickname"]=>
  string(4) "\abc"
}

{"nickname":"\abc"}
NULL
- Syntax error, malformed JSON

{"nickname":"\\abc"}
array(1) {
  ["nickname"]=>
  string(4) "\abc"
}
- No errors

从输出结果中看到,在php中正确的json输出格式为{"nickname":"\\abc"},而实际qq接口中却返回了{"nickname":"\abc"}。
还有一个问题就是如果把正确格式的json赋值给变量,即:$s = '{"nickname":"\\abc"}';
这时json_decode后发现仍然为空,json_last_error提示“Syntax error, malformed JSON”,为什么呢?看echo的输出,发现“\\”输出后显示为“\”,所以还要增加一个转义符(\),以符合json的格式要求。

二:parse_str中转义符的问题
使用parse_str解析某接口返回值,返回的变量中发现“\”字符都被统一加上了转义符“\”,查看线上环境php配置中是开启了magic_quotes_gpc,但是magic_quotes_gpc影响的只是GPC(GET、POST、COOKIE)数据,为什么parse_str中的数据同样被转义了。查看手册,果然提到了:

The magic_quotes_gpc setting affects the output of this function, as parse_str()
uses the same mechanism that PHP uses to populate the $_GET, $_POST, etc. variables.

因此,magic_quotes_gpc同样会影响parse_str的返回,可要记住了!

注:magic_quotes_gpc自5.3.0起已经废弃。

顺便提一下,magic_quotes_gpc的可修改范围为PHP_INI_PERDIR,不可以在代码中通过ini_set进行修改,全部的定义及配置范围定义说明见:
http://www.php.net/manual/zh/ini.list.php
http://www.php.net/manual/zh/configuration.changes.modes.php

下一篇 电脑视频输出至电视--续

上一篇 万网域名转入godaddy流程

相关文章

Ubuntu下编译安装PHP

使用curl_multi_init并发请求

页面跳转的方式总结

php增加Last-Modified为何无效

用xhprof分析php代码

文章分类

开发小提示

  • 1:Mongodb中通过db.yourCollectionName. dataSize()查看某个文档的大小
  • 2:linux下用reset命令恢复查看二进制文件导致的命令行乱码
  • 3:查看MySQL表的索引情况show index from tableName
  • 更多...

交流

  • wangnow(a)126.com