多数大学生出来选择的工作和专业无关
首页 > 专业知识

疑难答疑 PHP服务端返回Json问题

时间:2019-01-17 20:24:35 [来源]:郑州PHP培训学校

   疑难答疑 PHP服务端返回Json问题

  我们将会在这篇文章中为大家详细解读有关PHP服务端返回Json问题,主要是以一个范例来讲解在返回汉字时出现空字符的解决办法。
  我们需要在不断的经验积累中去完善我们的编程思路,灵活运用PHP语言来帮助我们实现需要的功能。用Extjs接收PHP服务端返回的Json结果时,发现只要是汉字(从SQLServer取得)都是空字符,对于这个PHP服务端返回Json问题,非常苦恼。
  后来看json_encode的文档才知道,它只能编码UTF-8的字符。这个问题就是返回的字符是GB2312,怎么变为UTF-8,并且最好是将整个数组进行UTF-8的转换。经过搜索有以下代码解决PHP服务端返回Json问题:
  function encodeUTF8($array)
  {
  foreach($array as $key=>$value)
  {
  if(!is_array($value))
  {
  $array[$key]=mb_convert
  _encoding($value,"UTF-8","GBK");
  }
  else
  {
  encodeUTF8($array[$key]);
  }
  }
  return $array;
  }
  每次返回结果时:
  echo '{"total":"'.$rscount.'
  ","results":'.json_encode
  (encodeUTF8($result)).'}';
  以上这段代码就是PHP服务端返回Json问题的具体解决方法。
  概论为什么PHP全局变量不能生效
  我们应当通过尽量减少多级和函数中include文件来防范PHP全局变量不能生效这一问题。实在不行,我们就尽量不用全局变量。
  对于一个新手在实际操作PHP语言定义一个全局变量的时候,往往会出现很多问题。比如,他们会一直以为,全局变量(使用global声明)是在程序的所有地方都可以用的(不然怎么能叫全局?呵)。
  但在实际操作时,会接连碰到几次全局变量无效的郁闷的事,下面就重点看一下PHP全局变量不能生效的原因及解决办法。
  1.PHP全局变量不能生效错误重现
  问题出现在用我的简易框架时,在view中使用原来第三方定义好的函数时(此函数比较独立),下面模拟一下:
  t1.php
  < ?
  run(); //执行
  function run(){
  include 'func.php';
  showGlobal();
  }
  ?>
  func.php1
  < ?
  $vars = 'I am global!';
  function showGlobal(){
  global $vars;
  print('我使用全局变量:'.$vars);
  }
  ?>
  很简单的两个文件(第一次发现问题时,远比这复杂,在一层层排错后,得出最少化的问题重现环境),func.php是定义好的第三方函数,该函数使用了一些全局变量,如果这时把这两个文件放在一起,执行一下t1.php,会发现showGlobal里的$vars是显示不出来的,global失效了?
  2.PHP全局变量不能生效错误原因
  搜索后发现,php.net上很早就有人提出过,也有人给出了解释:
  原来,在t1.php的run函数中include func.php时,func.php中的变量$vars的作用域只是在run之内,而在showGlobal中使用global声明的$vars是要求属于t1.php的不是run函数的,所以为空)3.PHP全局变量不能生效解决方法
  知道原因后,解决就很简单,可以把include 从run中移出来,这样,func.php中的$vars就属于t1.php了;也可以在run里用global声明一下$vars,这样也可以把原来属于run的$vars声明为全局(属于t1.php);虽然问题可以简决,但用起来还是很不爽, 因为在我的phpec框架中,include的情况比较普遍,不可能把view中按需include的移到外层去,使用global的话,我在使用第三方函数时,又不会也不想去了解它用了什么全局变量,而且,层次结构一多,就….
  PHP全局变量不能生效的原因总结:
  1)尽量减少多级和函数中include文件.
  2)尽量不用全局变量
  如何正确解决PHP缺少JSON包问题
  PHP缺少JSON包这一问题的解决办法由很多种,我们可以通过本文介绍的这几种方法按自己的需求来自行选择,以达到一个完美的效果。
  PHP语言为我们带来了许多方便之处,但是在实际操作中发现,它并不是很容易掌握的。在我的一个网站项目开发中,没有PHP5.2的环境。因此就会发生PHP缺少JSON包的问题。
  这一问题的替代办法就是重写PHP json 的json_decode 和 json_encode方法。
  这两个PHP缺少JSON包的解决方法主要就是把数组,字符串,或者对象 转换成 json格式的数据(特殊的一种结构体格式) 。首先需要的是json_encode方法, 此方法 主要将 数组,字符串,对象等转换成json格式。解决此问题的方法:
  a. 简单版:
  直接针对自己的问题需要(自己只需要将简单的数组进行操作),可以直接将此数组进行拼串。
  b。完善的 encode方法:
  解决PHP缺少JSON包的问题的简单方法就是 利用别人以完成的开源代码:
  首先想到 zend framework。 拿来 zf_json 包中的 Decoder.PHP, 和 Encoder.PHP。 Decoder.PHP其实只要将其中某个protect方法的 protect去掉就行。 具体操作忘了,读者自行调试来解决。改写好Decoder 类后,调用如下:
  $filepath = $_SERVER['DOCUMENT_ROOT'];
  include $filepath.'/inc/json/Encoder.PHP';$encoder = new Zend_Json_Encoder(false);
  $json = $encoder ->encode($result);
  header("X-JSON: $json");
  json_decode方法同上,如果是PHP使用。
  由于很多使用json的地方还是在ajax调用中, 所以一些ajax '框架' 提供了decode方法来解决PHP缺少JSON包这一问题:
  比如在prototype中, 如果PHP页面包含了prototype.js, 那么就可以直接来调用 function(transport, json) { 。。操作} 在其中取json数据 就是 json.a , json.b 等了。
  除了PHP缺少JSON包这一问题的出现外,可能遇到问题,编码。
  zend framework返回的汉字编码估计不大对应(不是说它不是utf-8)我的页面编码(utf-8),因此会有问题出现。因此对于某些验证返回的报错信息(汉字)会有影响。在这里的替代方法就是使用传统的接口返回数字代码形式(通信网关经常采用的方法),比如返回 json.code 有 0,1,2,3等多种可能。则在js端处理时, 0表示成功,1表示非法的客户端数据,等等。 问题得到完美解决。

上一篇:PHP命名空间规则解析及高级功能

下一篇:PHP文件系统相关函数的功能详解