飘飘悠悠 发表于 2015-2-4 00:14:13

PHP网站制作之利用PHP和AJAX的XML编程

刚开始觉得自己对这些多少有些基础,很简单,但是看了老师那么熟练的进行网页布局的时候,突然之间发现,其实,我的基础并没有自己想像的那么好,自己设计的页面其实并不好看,就连表格的边框为1像素都不会弄。ajax|xml|编程    在 SOA 架构中,法式员常常利用 XML 在使用法式之间互换布局化和半布局化的数据。XML 及其相干手艺 ― 文档对象模子(Document Object Model,DOM)、XPath、HTTP、XQuery 和可扩大款式表言语转换(Extensible Stylesheet Language Transformations,XSLT) ― 为疾速使用法式开辟供应了一个壮大的情况。构建在这些手艺之上的使用法式将占用更小的内存空间,需求更低的保护本钱,同时又具有更高的品德和天真性。

  DB2 和其他关系数据库的 XML 方面的特征已相当做熟,因而除存储和办理关系数据以外,它们仍是存储和办理 XML 数据的幻想选择。DB2 9 XML 撑持(称为 pureXML)供应了以纯 XML 的模式(换句话说,就是带正文的、树型的分层存储)存储 XML 的才能。在 DB2 9 中,XML 数据可以用 XML 形式索引,可以从关系数据组合而成,可以分化为关系数据,可以查询和转换,可以自力宣布,或经由过程夹杂利用 SQL/XML 和 XQuery 与关系数据组合起来。

  Web 阅读器也正在为客户机剧本供应更多的功效来无效地处置 XML。经由过程利用异步 JavaScript 和 XML(Asynchronous JavaScript and XML,Ajax),Web 页面如今可以直接对使用办事器停止近程进程挪用,而且可以在任何前往的 XML 数据上利用 DOM API。

  本文将展现若何使用 DB2 XML、Ajax 和 PHP Hypertext Preprocessor (PHP) 供应的功效来编写复杂的基于 XML 的使用法式。经由过程示例场景的匡助,您将进修若何在 JavaScript 中挪用 PHP 使用法式;若何利用 DOM 和 SimpleXML API 修正 XML 数据;若何将 XML 从客户机传送到使用法式再到数据库;和若何创立 PHP Web 办事来利用 SQL/XML 和 XQuery 宣布关于 XML 数据的呈报。

  XML 长处

  大多半使用法式都用于创立、存储、把持和出现营业数据。对象包装是指将营业数据绑在一同,使营业逻辑更轻易处置它们。这些包装器对象的良多功效都是依据关系和格局化划定规矩来供应营业数据的布局,并使营业逻辑可以把持、宣布和串行化封装的数据。

  图 1. 基于对象包装器的使用法式
  


  图 1 阐释了利用对象包装器的一个示例人寿保险使用法式。每一个方框暗示一个对象,每一个对象最少有:

  ・一个机关函数

  ・Getter 和 Setter 办法

  ・验证代码

  ・外部对象条理的串行化

  这些对象与实践的营业逻辑没有关系。对象包装是为了使营业逻辑更轻易办理营业数据。包装数据所需的代码比营业逻辑要多很多。更多的代码将招致更多的 bug、更大的固定性、更多的保护和更高的本钱。

  假如对象中的数据变量可以格局化为 XML 布局,而且对象的次要感化是将这些数据表露给营业逻辑并让营业逻辑把持它们,那末可以用 DOM 取代对象。

  图 2. 基于 XML 的使用法式
  


  图 2 展现了一个利用 XML 和 DOM 包装器的示例保险使用法式。图 1 中的一切数据包装器对象都用一个 DOM 对象取代。营业数据是用 XML 建模的,DOM 供应了需要的 API 来:

  ・创立新的 XML 对象。

  ・更新 XML 对象的值。

  ・导航 XML 对象。

  ・利用 XPath 在对象条理中搜刮。

  ・串行化和反串行化 XML 对象条理(换句话说,就是内建耐久性)。

  经由过程利用 XML,可以免利用大多半用于办理营业数据的包装器对象。使用法式将变得加倍简约,而且更多地将重点放在营业逻辑上,而不是数据办理上。

  XML 和架构

  将 XML 引入架构中可觉得暗示营业数据带来一种尺度化的体例。XML 可以供应数据的布局;XML 形式施加布局和格局化划定规矩;DOM API 和 XQuery、XPath 及 XSLT 之类的言语使营业逻辑可以无效地把持、宣布和串行化数据。因为营业数据的 XML 暗示在客户机、两头层和数据库中都是分歧的,因而把持这些对象的代码也是相似的。

  我将展现若何在三层情况中构建基于 XML 的使用法式,这个三层情况由以下几个局部构成:

  ・Web 客户机:Asynchronous JavaScript and XML (Ajax),DOM

  ・使用办事器:PHP 和 SimpleXML

  ・数据库: DB2 9 和 SQL/XML,XQuery
  基于 ACORD 人寿数据模子的场景

  咱们来思索一个复杂的人寿保险场景,在这个场景中,起首创立一个暗示新保单的 XML 文档,然后查询和把持这个文档,别的还将这个文档从一层挪动到另外一层。这个文档基于协作运营研讨与开展协会(Association for Cooperative Operations Research & Development,ACORD)用于人寿保险标准的 XML,它界说了安康保险和年金保险需求互换的数据。

  为了请求一个新的保险,客户需求供应一些根基信息。局部信息是在一个 PHP 使用法式中填写的,还有一局部是在客户机阅读器中填写的。然后,保单存储在一个 DB2 XML 列中。在 DB2 9 中,XML 类型的列在外部将 XML 数据存储为一棵解析后的树,与关系数据存储在分歧的中央。这类办法是 DB2 9 独有的,更早的 DB2 版本则利用关系存储基本举措措施来存储 XML。

  上面是保单 XML 文档在客户机与使用法式之间的流程:

  ・在 Web 客户机中,客户更新页面并单击 Submit。

  ・Web 客户机向 PHP 收回一个 XMLHTTP 恳求,以取得新的空白保单文档。

  ・PHP 使用法式翻开一个空白的保单文档,用一个全局唯一标识符(GUID)更新它,然后将该文档前往给 Web 客户机。

  ・Web 客户机利用 Ajax 捕获前往的事务,并检索 XML DOM,然后用 Web 页面中输出的信息填充该文档。

  ・Web 客户机利用 XMLHTTP 将更新后的 XML 发送给 PHP 使用法式。

  图 3. 创立新的保单恳求的 Web 站点。
  


  图 3 展现了用于创立新的保单恳求的 Web 页面。当用户单击 Submit 按钮后,JavaScript 函数 submitPolicy() 被挪用(见清单 1)。该函数向 PHP 使用法式 createNewPolicy.php 收回一个 HTTP 恳求,以取得一个空白的保单。它还设置一个回调函数 fillPolicy(),用于捕获从 HTTP 恳求前往的事务。

  


  当第一个恳求抵达两头层的 PHP 使用办事器时,一个新的 XML 保单文档被装载到 SimpleXML 对象中。经由过程利用 SimpleXML API,用 PHP 使用法式中创立的 GUID 更新 TransRefGUID 元素。

  header('Content-type: text/xml');

  $fileContents = file_get_contents("$basedir/acord.xml");

  $dom = simplexml_load_string($fileContents);

  $dom->TXLifeRequest->TransRefGUID=$guid;

  echo $dom->asXML();

  然后,这个文档被发送到客户机。

  关于本文,咱们假定 GUID 是经由过程某种机制(例如工夫和随机数的组合)创立的。更主要的是了解若何将暗示保单的 XML 文档视作内存中的营业对象条理布局,和若何利用 SimpleXML API (或 DOM/XPath)来导航和更新这个对象。

  填充根基客户信息

  在 Web 客户机中,fillPolicy() 函数读取前往的值。如今,包括前往 XML 的内存中暗示的 DOM 对象可用于把持保单文档。客户在 Web 页面上输出的信息被直接用于更新 DOM。当利用客户信息更新了保单以后,利用 XMLHTTP 将修正后的 DOM 对象提交回 PHP 使用法式(见清单 2)。即便是 HTML 组件值也是用 DHTMLDocument Object Model (DOM) 读取的。

  

  将保单存储在 DB2 中

  PHP 使用法式将传入的 XML 文档直接存储在数据库中,而不需求解析它(见清单 3)。DB2 的 pureXML 撑持将隐式地解析传入的 XML,并将其存储在一个类 DOM 的分层布局中。如今,可以在 XQuery 语句中利用 XPath 之类的 XML 导航手艺(就像在 DOM 中利用的那样)来查询 XML。DB2 9 还供应了在该条理布局中的任何节点上索引的才能。

  


  公然 XML 文档上的办事

  新的保单存储在 DB2 9 中今后,保险代办署理可以查询该保单,以决意是不是承受这个保险。用于取得关于新保单呈报的查询经由过程 Web 办事公然给客户机使用法式。

  这个例子中的 Web 办事是用 PHP 编写的,它为挪用完成办事的营业和转换逻辑的 DB2 存储进程供应了一个简约的接口。每一个 DB2 存储进程由一个 SQL/XML 查询构成,它过滤和转换存储在数据库中的 XML 保单,以创立一个输入 XML 文档。然后,该 PHP Web 办事将 XML 文档前往给客户机。

  咱们来剖析每一个存储进程,看看那些无效地构成 Web 办事完成的查询。

  


  列出一切新客户保险的 DB2 查询。包括该查询的存储进程是listAllNewCustomers(见清单 4)。该查询搜刮 ACORD 表的 INFO 列中的一切保单文档。在每一个 XML 文档中,DB2 进一步向下剖析,以便只前往 PolicyStatus/@tc 属性的代码值被设为 12(也就是建议的值)的那些文档。查询输入是一个 XML 文档,它有一个根节点 newpolicylist,该节点包括一系列的用于每一个新保单的 TXLife 子节点(见图 4)。

  图 4. 前往新保单列表的 SQL/XML 查询
  


  注重这个查询第一次若何利用 DB2 XQuery 函数 db2-fn:xmlcolumn 来导航关系形式,以定位到 XML 列 DB2ADMIN.ACORD.INFO。当它抵达 XML 列时,它进一步利用 XPath 在 XML 形式中导航到恰当的节点(相似于利用 PHP、JavaScript 或其他言语导航 DOM)。

  列出有风险客户的提议保险的 DB2 查询。该查询只列出有风险的新客户(也就是说,他们关于某个医疗成绩的回覆是 yes)。该查询包括在一个名为 listAtRiskNewCustomers 的存储过程当中(见清单 5)。 注重:WHERE 子句同时反省谜底和保单形态。

  


  评价有风险新客户的风险度的 DB2 查询。关于以上列表中的每一个保单,在保单的安康风险区域只能列出回覆为 yes 的成绩。该查询还前往 policytype,以显示该保单值几何钱,以便评价风险。包括该查询的存储进程(见清单 6)是 getRiskQuestions(guid)。 注重:您需求一个撑持 XML 类型的 DB2 驱动法式版本。不然,在每一个存储过程当中都需求利用 XMLSerialize 来从 XMLQuery 中串行化 XML 值。请参阅 developerWorks 文章 “联合利用 DB2 原生 XML 与 PHP” 以取得更具体的信息。

  

  创立 Web 办事

  用于 getnewpolicyinfo Web 办事的 PHP 代码是一个瘦包装器,它反省所需保单呈报的类型,并挪用恰当的存储进程。然后,将存储进程所前往的值发送回客户机(见清单 7)。注重用 PHP 创立 Web 办事是何等复杂。最初三即将该功效公然为一个 Web 办事。在任何客户机中,包含在 PHP 使用法式中,都可以挪用 Web 办事,如清单 8 所示。

  


  


  停止语

  在曩昔几年中,各使用法式层的 XML 撑持都已成熟,这招致一种壮大的开辟情况的呈现,这类开辟情况可以改动企业使用的设计体例。XML 使开辟人员可觉得营业文档界说划定规矩和布局,还可以在内存中将文档实例化为分层对象,开辟人员可以在任何层利用尺度 API 对这类对象停止导航、修正和串行化。Ajax 使基于 Web 的客户机剧本可以挪用 DOM API,还可以对两头层停止近程进程挪用。PHP 为处置 XML 和 Web 办事供应了最复杂的办法之一,因而十分合适基于 XML 的使用法式开辟。XML 演化的最初一链是数据库层。DB2 9 使数据库层能把持 XML。因而这个演化周期宣布停止。完成一个功能齐全的动态站点

飘灵儿 发表于 2015-2-4 10:03:42

有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。

活着的死人 发表于 2015-2-9 22:03:46

装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。

再现理想 发表于 2015-2-14 17:29:24

使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。

飘飘悠悠 发表于 2015-2-25 03:37:32

曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线\\\\\\\'_\\\\\\\' ;

admin 发表于 2015-3-7 16:21:48

说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年具体的记不清啦,囧。

若相依 发表于 2015-3-7 16:21:49

其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。

乐观 发表于 2015-3-15 09:26:16

基础有没有对学习php没有太大区别,关键是兴趣。

冷月葬花魂 发表于 2015-3-20 11:38:10

写的比较杂,因为我也是个新手,不当至于大家多多指正。

若天明 发表于 2015-3-27 15:11:06

建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。

第二个灵魂 发表于 2015-3-28 06:44:23

作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。

简单生活 发表于 2015-4-1 08:08:42

Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81

小女巫 发表于 2015-4-4 09:59:13

我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。

谁可相欹 发表于 2015-4-8 18:26:25

在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。

小妖女 发表于 2015-4-11 05:10:15

,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。

灵魂腐蚀 发表于 2015-4-27 04:42:59

首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。

精灵巫婆 发表于 2015-5-1 05:10:29

写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。

变相怪杰 发表于 2015-6-8 23:33:08

写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。

分手快乐 发表于 2015-6-12 07:10:13

写的比较杂,因为我也是个新手,不当至于大家多多指正。
页: [1]
查看完整版本: PHP网站制作之利用PHP和AJAX的XML编程