PHP处理JSON

编程相关2 Comments »

PHP5.2以上版本中可使用函数json_encodejson_decode操作JSON。

json_encode 用于将数组转化为JSON对象

json_decode 用于将JSON对象转化为PHP对象或者数组

两者的使用说明,可以参见手册上的函数说明。

下面介绍几个实例和应用中需要注意的地方。

  1. json_encode 只作用于utf8编码的数据,非utf8编码数据需要转换
    数组转化为utf8:
    $encodedArray = array_map(utf8_encode, $rawArray);
  2. json_decode也只能作用于utf8编码的数据,否则返回结果可能为NULL
    $contents = file_get_contents($url);
    $contents = utf8_encode($contents);
    $results = json_decode($contents);
  3. php中的对象名要用双引号,否则json_decode会出错
    Bad(s) (return NULL):
    {30:'13',31:'14',32:'15'}
    {[30:'13',31:'14',32:'15']}
    {["30":"13","31":"14","32":"15"]}
     
    Good :
    [{"30":"13","31":"14","32":"15"}]

相关资源:JSON在线验证

Related posts

在SmartTemplate中使用Begin End处理数组

编程相关No Comments »

SmartTemplate是一种PHP模板引擎,可以将php代码中的变量通过assgine函数赋值给模板输出变量。当php代码中欲输出的变量为数组时,怎样才能在模板中正确的输出呢?

使用Begin….End语句,可以读取一个整数索引数组的值,而数组中的元素则必须为字符串索引的数组。上面的话不好理解,给两个例子:

$users = array(
array( 'NAME' => 'John Doe', 'GROUP' => 'ADMIN' ),
array( 'NAME' => 'Jack Doe', 'GROUP' => 'SUPPORT' ),
array( 'NAME' => 'James Doe', 'GROUP' => 'GUEST' ),
array( 'NAME' => 'Jane Doe', 'GROUP' => 'GUEST' ),
); 
 
$links = array(
array(
'TITLE' => 'PHP',
'URL' => 'http://www.php.net/',
),
array(
'TITLE' => 'Apache',
'URL' => 'http://www.apache.org/',
),
array(
'TITLE' => 'MySQL',
'URL' => 'http://www.mysql.com/',
),
);

在模板文件中使用Begin…End语句,

<!-- BEGIN users --> 
<tr class="col{ROWBIT}"> 
<td> {ROWCNT} </td> 
<td> {NAME} </td> 
<td> {GROUP} </td> 
</tr> 
<!-- END users --> 
 
<!-- BEGIN links -->
<a href="{URL}"> {TITLE} </a>
<!-- END links -->

ROWCNT : 此元素在父数组中的具体位置 (0,1,2,3,…n)
ROWBIT : 此元素在子数组中的位置. (0,1,0,1,0,1,…)

最后输出的结果为

 
<tr class="col0"> 
<td> 0 </td> 
<td> John Doe </td> 
<td> ADMIN </td> 
</tr> 
<tr class="col1"> 
<td> 1 </td> 
<td> Jack Doe </td> 
<td> SUPPORT </td> 
</tr> 
<tr class="col0"> 
<td> 2 </td> 
<td> James Doe </td> 
<td> GUEST </td> 
</tr> 
<tr class="col1"> 
<td> 3 </td> 
<td> Jane Doe </td> 
<td> GUEST </td> 
</tr>
 
<a href="http://www.php.net/"> PHP </a>
<a href="http://www.apache.org/"> Apache </a>
<a href="http://www.mysql.com/"> MySQL </a>

参考:smarttemplate中文文档(部分)

Related posts

windows主机安装PHP5+Mysql5需要注意的问题

软硬维护2 Comments »

安装php5和mysql5可以直接下载安装包,并执行安装程序。因为php5默认是不支持mysql的,所以需要对php.ini进行设置。

如果你用IIS作为web server,则在windows目录下找php.ini。如果是apache作为web server,则在apache安装目录下找php.ini。

然后修改php.ini,将;extension=php_mysql.dll这行最前端的“;”去掉。接着就是需要注意的地方了,一定要copy php目录下的libmysql.dll到window系统目录中,否则无法加载。最后重启Apache,使用phpinfo查看一下,mysql是否加载成功。

===2009.9.3 更新===
今日发现使用PHP5.2.10版本+MySQL5.1.3版本时会因为PHP和MySQL的版本问题,引起php_mysql无法加载的情况。
使用php_mysqli模块,访问phpMyAdmin时出现提示:Your PHP MySQL library version 5.0.67 differs from your MySQL server version 5.1.30.
经查询,发现时由于PHP5.2版本中的php_mysql扩展无法支持MySQL5.1.3
经重新安装低版本的MySQL5.0后,php_mysql可以正常加载,且phpMyAdmin也未出现其他异常提示

Related posts

ntwdblib.dll引起的php无法加载mssql扩展

软硬维护No Comments »

今天在测试机上使用PHP连接MS SQL Server,按照老办法无非就是以下三个步骤就能搞定

  1. 在Apache的httpd.conf中找到PHPIniDir的位置,然后找出php.ini来
  2. 去掉php.ini中“;extension=php_mssql.dll” 前方的分号
  3. 重启Apache

但是今天试了多次,仍然在phpinfo中无法看到成功加载mssql的信息。Google了一下,发现问题是由Windows目录下的ntwdblib.dll版本太早而引起的。如果你发现服务器上的该文件版本小于 80.194.0,则很有可能造成PHP无法加载mssql扩展的问题。

要解决也很简单,可以找一台安装SQL Server的机器,copy该机上的同名文件,或在 这里 下载一个新版本的覆盖服务器上的同名文件即可。

参考文章:http://www.userscape.com/helpdesk/index.php?pg=kb.page&id=13

Related posts

在Joomla单元/分类介绍中插入模块

应用心得No Comments »

近来在测试Joomla,想实现的一个功能是将Joomla中的模块加入到单元/分类的介绍中,在后台管理中似乎没有这样的设置,而修改模板index.html文件,增加新的position也无法达到想要的效果。最后在Joomla!中文技术讨论区中寻求帮助,终于找到了解决方法。

一、最新版(1.5.3以上)中,可以在单元/分类介绍中直接加入如下代码:

{loadposition ***}

然后在模块管理中,将希望插入到介绍部分的模块位置设置为***(与loadposition后面的位置一致)。这样就可以在介绍部分插入相应的模板了,但是因为css的问题,模块样式会消失。要如何实现css,我还没有测试,大概可以通过模块管理中的css后缀,进行修改。

二、其他版本(1.5.*)安装loadmodule_for_category_description_v1.5插件,可以在文章中任意位置加入模块

  1. 下载安装。安装时,在joomla后台管理:扩展-》安装卸载—》上传压缩包文件-》选择下载好的zip文件进行安装
  2. 在扩展-》插件管理中启用loadmodule for Section/Category Description
  3. 在分类介绍模板中增加触发器
    • 打开<Joomla root folder>/components/com_content/views/category, 找到view.html.php
    • 打开该文件,转到39行,在其后加入下面的代码
    • $category    =&amp; $this-&gt;get('Category');
      $dispatcher    =&amp; JDispatcher::getInstance();
      JPluginHelper::importPlugin('content');
      $results = $dispatcher-&gt;trigger('onBeforeDisplayTitle', array (&amp; $category));
    • 保存
  4. 在单元介绍模板中增加触发器
    • 打开<Joomla root folder>/components/com_content/views/section, 找到view.html.php
    • 打开该文件,转到39行,在其后加入下面的代码
    • $section    =&amp; $this-&gt;get('Section');
      $dispatcher    =&amp; JDispatcher::getInstance();
      JPluginHelper::importPlugin('content');
      $results = $dispatcher-&gt;trigger('onBeforeDisplayTitle', array (&amp; $section));
    • 转到87行,加入
    • $dispatcher =&amp; JDispatcher::getInstance();
      JPluginHelper::importPlugin('content');
      for($i = 0; $i &lt; count($categories); $i++)
      {
      $category =&amp; $categories[$i];
      $category-&gt;link = JRoute::_('index.php?view=category&amp;id='.
      $category-&gt;slug);
      $results=$dispatcher-&gt;trigger('onBeforeDisplayTitle', array(&amp;$category));
      }
      if ($total == 0) {
      $params-&gt;set('show_categories', false);
      }
    • 保存
  5. 在单元/分类介绍,或者文章内容的任意地方加入{loadposition ***},然后再在模块管理中设置模块位置为***,就可以实现在介绍或者文章中插入模块。

参考内容:

更新:
文章中提到新增加的模块css问题,可以在单元/分类介绍中使用HTML编辑,这样就可以设置新加入模块的css了,例如:

<div class = "module heading">
{loadposition ***}
</div>

Related posts

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS 登录