PHP V5.2 中的新增功能,第 3 部分: 使用新的 JSON 扩展

来源:百度文库 编辑:神马文学网 时间:2024/04/28 21:42:16
Ajax作为一种创建功能全面的 Web 应用程序的优秀方法,借助 XML 的力量将数据表单和功能分离,打破了 Web 浏览器的规则和限制,使Internet 的整体速度获得了提升。Ajax 的主要限制包括在 JavaScript 中处理 XML。XML的优势同样也使自己变得十分复杂。在您确保了 XML 文档的格式正确无误并且设置了错误处理之后,仍必须把 XML 置入某种 JavaScript可用的对象中。把 XML 整合到应用程序中以供使用并不像听起来那么简单。
由于 XML 不是 JavaScript 本来就有的,因此我们最好使用 XML 的固有语言,例如 PHP 和被转换为 JavaScript 的固有格式的简单数据。
我们遇到的另一个问题是不总是希望或需要在把数据装入 Ajax 应用程序之前将数据转换为XML。然而,在 Ajax 开发人员可以使用我们提供的数据之前,我们需要遵守标准。一旦我们在 PHP代码中创建了对象,我们可以将其序列化,并导出到应用程序的 Ajax 部分中,处理并取回。




回页首
JSON是一项旨在允许中间件创建使用 JavaScript 固有格式的对象的协议。它最强大的属性是它是一种轻量级协议。简单处理 RSS 聚合或recipe 列表时,您不需要在 JavaScript 中使用 XML 的全部功能。不需要验证格式或确保严格的数据键入。我们可以跳过与处理XML 相关的大量工作,即使术语 Ajax 包括 XML。为了编写更简练的代码,您可以使用 JSON 来简化过程。让我们来看一个显示来自 RSS 摘要数据库应用程序的数据的简单 XML 文档示例。
Listing 1 - XML Format Example



21
www.blah.com/story1.html
JSON is sweeping AJAX world
FALSE


22
www.blah.com/story2.html
JSON is great
FALSE


要获得此 XML文档,我们需要访问数据库,取出相关数据,并使用 PHP 在此 XML 文档中设定格式。虽然 Ajax 可以利用XML,但是在大多数情况下都是不必要的。控制结构所需的负载带宽量对于只需共享一些链接的简单应用程序来说完全没必要。此外,我们必须递归处理MySQL 结果,删除非法字符以及逐位构建我们的 XML 文档。
JSON 在这种情况下将提供帮助,因为我们可以使用 json_encode() 把任何 PHP 对象序列化,使该对象转换为 JSON 协议字符串,以供 Ajax 应用程序读取。这要比创建 XML 文档便捷得多,因为我们只需把 MySQL 结果直接传给函数。由于 MySQL 结果是以联合数组的形式传入的,因此没有任何中间步骤。
让我们来看一看如果把以上 XML 文档转换为 JSON 对象会发生什么情况(参见清单 2)。目前,数据库和数据格式都是任意的;我们将在稍后的部分中了解它们的实际情况。
//we assume that $results is the result of an SQL query but we will construct it now
$results = array("21" => array("url" => "www.blah.com/story1.html",
"title" => "JSON is sweeping AJAX world",
"viewed" => FALSE), "22" => array("url" => "www.blah.com/story2.html",
"title" => "JSON is great", "viewed" => FALSE));
//we now have a populated array object in $results resembling a possible MySQL result
$jsonObject = json_encode($results);
echo $jsonObject;
?>
全部都能理解么?结果没有使用递归。没有添加标记。只需将其传入 json_encode() 函数,然后它将从另一端作为 JSON 序列化对象传出。参见清单 3 以查看新对象。
{"21":{"url":"www.blah.com\/story1.html","title":"JSON is sweeping AJAX
world","viewed":false},"22":{"url":"www.blah.com\/story2.html",
"title":"JSON is great","viewed":false}}
我们有了一个包含数组对象并且以 JSON 格式序列化的字符串。关于此字符串需要注意几点:encode 函数已经自动把正斜杠转义为反斜杠,并且变量类型都是可以标识的,这取决于我们是否使用引号。由于数组中的 ID 号都使用了引号,因此那些 ID 号都被识别为字符串。布尔型 false 元素都被保留为布尔型。
现在我们已经序列化了对象,我们可以在 Ajax 应用程序的任意数目的 JSON 函数中使用它。




回页首
有两个函数用于 JSON:encode 和 decode。像您想象的一样,第一个函数将把任意类型的数据对象转换为一组序列化数据,以供 JavaScript 处理。第二个函数将把序列化数据解码,并将其转换为基本 PHP 对象或联合数组。我们已经见过使用 json_encode() 的示例,因此让我们来看一看 json_decode()。
$jsonObject = ‘{"21":{"url":"www.blah.com\/story1.html","title":"JSON is sweeping AJAX
world","viewed":false},"22":{"url":"www.blah.com\/story2.html","title":"JSON is
great","viewed":false}}‘;
$decodedObject = json_decode($jsonObject);
$decodedArray = json_decode($jsonObject, true);
print_r($decodedObject);
echo "

";
print_r($decodedArray);
?>
如上,我们有一个 PHP 脚本,该脚本将获取 $jsonObject 并将其解码回 PHP 固有对象。我们进行了两次解码。第一次,使用未经修改的用法,这将得到 stdClass 的对象;第二次,使用布尔型参数来创建联合数组。
stdClass Object ( [21] => stdClass Object ( [url] => www.blah.com/story1.html [title] =>
JSON is sweeping AJAX world [viewed] => ) [22] => stdClass Object ( [url] =>
www.blah.com/story2.html [title] => JSON is great [viewed] => ) )
Array ( [21] => Array ( [url] => www.blah.com/story1.html
[title] => JSON is sweeping AJAX world [viewed] => )
[22] => Array ( [url] => www.blah.com/story2.html [title] =>
JSON is great [viewed] => ) )
我们看到两个对象,使用 print_r() 列出。




回页首
在建议的 Ajax 应用程序中,我们的项目经理希望使用来自另一个应用程序提供的数据库的数据。存储 Web 服务器的 MySQL 数据库中选定RSS 摘要结果的 RSS 聚合器将经常检查并更新 RSS。要阅读 RSS,我们的应用程序将要求使用 Ajax接口。作为专业的后端程序员,我们将专注于从数据库中获得数据,并将其转为 JSON 格式。我们将把 Ajax 留给专家,但是我们必须把 Ajax准备好以供专家们处理。
首先,我们将设置 MySQL 数据库来存储 RSS 摘要信息,然后插入若干条记录以准备开始。然后,我们将编写一个 PHP 脚本,该脚本将进入数据库并为基于 JSON 的应用程序检索一些记录以供使用。




回页首
我们需要设置 MySQL 数据库并插入一些简单记录以供我们提取。为便于使用示例,我们将使用数据库名 “RSS_AGG”(参见清单6)。由于大多数主要关系数据库管理系统(Relational Database Management System,RDBMS)从一开始就支持PHP,因此在选择数据库时,PHP 具有极大的灵活性。一些 RDBMS 不支持 PHP,但是很多这样的 RDBMS 可以通过抽象类或扩展来提供PHP 支持。我使用了 MySQL,但是可以任意采用这段代码来支持您选择的数据库。
CREATE TABLE ‘feeds‘ (
‘id‘ int(11) NOT NULL auto_increment,
‘url‘ text NOT NULL,
‘title‘ text NOT NULL,
‘viewed‘ tinyint(1) NOT NULL,
PRIMARY KEY (‘id‘)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
INSERT INTO ‘feeds‘ (‘id‘, ‘url‘, ‘title‘, ‘viewed‘) VALUES
(1, ‘www.blah.com/story1.html‘, ‘JSON is sweeping AJAX world‘, 0),
(2, ‘www.blah.com/story2.html‘, ‘JSON is great‘, 0);
我们现在有一个可以通过 PHP 脚本访问的数据库。至于所有数据库交互,我们需要设置数据库连接并提取数据。
$username="username";
$password="password";
$database="rss_agg";
$sql="SELECT * FROM `feeds`";
mysql_connect(localhost, $username, $password);
mysql_select_db($database) or die("Unable to select database");
$result = mysql_query($sql);
mysql_close();
?>
在输出脚本的开头,我们只是创建变量来存储可以访问位于本地主机的数据库的用户名和密码。我们选择了数据库,命名为 rss_agg,并编写了一条十分简单的 SELECT语句从 feeds表中检索所有记录。接下来的三行将使用连接凭证来发起一个与数据库的连接,然后选择数据库。如果出于某种原因这个过程没有发生,我们将看到“Unable to select database” 结果。最后,我们将检索 SQL 语句的结果并关闭数据库连接。




回页首
需要先把 MySQL 结果转换为可用的 PHP 对象,然后才能把 MySQL 结果转换为 JSON 字符串。我们可以通过把它转为一个数组来完成以上操作。
$username="root";
$password="";
$database="rss_agg";
$sql="SELECT * FROM `feeds`";
$encodable = array();
mysql_connect(localhost, $username, $password);
mysql_select_db($database) or die("Unable to select database");
$result = mysql_query($sql);
while($obj = mysql_fetch_object($result))
{
$encodable[] = $obj;
}
$encoded = json_encode($encodable);
echo $encoded;
mysql_close();
?>
我们已经创建了一个数组对象来存储 json_encode() 可以读取和转换为 JSON 字符串格式的结果信息。while 语句将逐个遍历结果查询的每个元素并逐行构建 $encodable 数组。此对象完成后,我们只需通过 json_encode() 运行它并生成 $encoded 对象。现在,可以将此信息回转给浏览器,用来自对象的数据来响应请求的 JavaScript。请求 JavaScript 应用程序现在有一个完全相同的 PHP 对象副本,并使用 JavaScript 天生就能理解的方法列举了该副本。




回页首
JSON是一种有用的、轻量级协议,现在可用于 PHP V5.2,它可以轻松地实现从 PHP 应用程序中提取出数据,并将其放入 Ajax应用程序的过程。相应地,PHP 中的 JSON同样也是轻量级且十分有用的,只包含两个易于使用的函数。使用这些函数,我们可以转换和导出对象结构,还可以使用 json_encode() 使来自 PHP 数据库连接的数据可用于 Ajax 应用程序。在 Ajax 应用程序中处理完数据后,可以将数据返回 PHP 脚本并用 json_decode() 重新创建可用的对象数据结构。当把数据返回到 PHP 后,我们可以将其存储到数据库中,或使用 PHP 提供的众多选择中的任何其他数据处理方法。
学习
您可以参阅本文在 developerWorks 全球站点上的英文原文 。
阅读本系列的第 1 部分 和第 2 部分。
阅读PHP 5.2.0 发行说明。
从 PHP.net 获得JSON 函数 信息。
从 JSON.org 获得关于JSON 标准 的信息。
阅读标题为 “Converting XML to JSON in PHP” 的文章。
访问 developerWorksAjax 资源中心。
访问PHP.net 以获得 PHP 文档。
要获得过滤和验证的其他有用示例,请阅读 “Spam filtering techniques”。
要获得讨论 Register Globals 和安全问题的文章,请参阅 “审计 PHP,第 1 部分”。
要获得关于 PHP 应用程序安全的进一步讨论,请参阅 “确保 PHP 应用程序的安全”。
“A step-by-step how-to guide to install, configure, and test a Linux, Apache, Informix, and PHP server” 包含关于如何编译适用于 Linux 的 PHP 解析程序的部分。
在 “PHP V5 迁移指南” 中了解如何将在 PHP V4 中开发的代码迁移到 V5 中。
要获得学习使用 PHP 进行编程的教程,请查看 developerWorks 的 “学习 PHP” 系列。
Planet PHP 是 PHP 开发者社区新闻资源。
PHP.net 是 PHP 开发者的资源。
查看 “PHP 推荐读物列表”。
浏览 developerWorks 上的所有PHP 文章 和PHP 教程。
查看 IBM developerWorks 的PHP 项目资源 扩展 PHP 技巧。
收听针对软件开发人员的有趣访谈和讨论,一定要访问developerWorks podcast。
随时关注 developerWorks 的技术事件和网络广播。
查阅最近将在全球举办的面向 IBM 开放源码开发人员的研讨会、交易展览、网络广播和其他活动。
访问 developerWorks开源软件技术专区,获得丰富的 how-to 信息、工具和项目更新,帮助您用开放源码技术进行开发,并与 IBM 产品结合使用。
PHP V5.2 中的新增功能,第 3 部分: 使用新的 JSON 扩展 PHP V5.2 中的新增功能,第 4 部分: 使用新的 ZIP 扩展 PHP V5.2 中的新增功能,第 4 部分: 使用新的 ZIP 扩展 PHP V5.2 中的新增功能,第 2 部分: 使用新输入过滤扩展功能 PHP V5.2 中的新增功能,第 1 部分: 使用新的内存管理器 PHP V5.2 中的新增功能,第 1 部分: 使用新的内存管理器 PHP V5.2 中的新增功能,第 5 部分: 跟踪文件上传进度 使用 PHP 和 DHTML 设计 Web 2.0 应用程序,第 1 部分: 使用这些技术打造有特色的应用 使用 PHP 和 DHTML 设计 Web 2.0 应用程序,第 2 部分: 使用 JavaScript 创建 HTML 动态元素 使用 PHP 和 DHTML 设计 Web 2.0 应用程序,第 2 部分: 使用 JavaScript 创建 HTML 动态元素 phplibclamav-PHP的杀毒扩展 PHP的GZIP压缩页面例子,使用zlib扩展实现页面GZIP压缩输出 hello world: websphere portal v5 最简单的 portlet:第 1 部分,创建和部署 hello world: websphere portal v5 最简单的 portlet:第 1 部分,创建和部署 Struts 2中使用JSon ajax支持 审计 PHP,第 1 部分: 理解 register_globals 审计 PHP,第 1 部分: 理解 register_globals Google 官方发布在任意网站使用 Google Scribe 功能的扩展 PowerPoint功能扩展的几个常用方法2 Office 2010 的新增功能 Office 2010 的新增功能 Photoshop CS5新增功能实例精解(一)第二部分 WebSphere Application Server Community Edition 中的高级管理,第 2 部分: 使用线程池、集群和配置插件 <转>股软 扩展数据 EXTDATA 功能与使用简介