<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[沧海一粟]]></title> 
<link>http://www.dzhope.com/index.php</link> 
<description><![CDATA[Web系统架构与服务器运维,php开发]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[沧海一粟]]></copyright>
<item>
<link>http://www.dzhope.com/post//</link>
<title><![CDATA[AJAX集成数据库（一）]]></title> 
<author>jed &lt;jed521@163.com&gt;</author>
<category><![CDATA[代码编程]]></category>
<pubDate>Fri, 13 Oct 2006 06:31:07 +0000</pubDate> 
<guid>http://www.dzhope.com/post//</guid> 
<description>
<![CDATA[ 
	一、引言<br/><br/>　　如今，有相当多的Web应用程序，如Backpack，Blinksale和Gmail，都把数据库技术与AJAX集成到一起。通过提供与数据库通讯而不用刷新浏览器这种强有力的技术，这种集成对web应用程序和用户体验产生巨大的影响-这意味着，在用户继续其它交互的同时可以实现实时的数据传输。<br/><br/>　　本文将集中讨论上述技术集成机理。同时提供了完整的参考源码。这个示例是一个简单的职务记录应用程序，其中每个职务包含一个标题，描述和日期-允许用户添加、编辑和删除职务。所有这些都是你与数据库记录数据打交道时的基本操作，但是这个应用程序更进了一步。一个职务可以变化成一个可编辑的表单-它将被从数据库中加以保存或删除，以及以其新状态显示而不需要刷新浏览器并中断用户操作。<br/><br/>　　在本文中，我假定你已经初步了解AJAX、MySQL和PHP，或一类似的服务器端语言。如果你还没有创建过XML HTTP Request对象，那么可以先参考我的文章“怎样使用AJAX”。下面，首先让我们讨论数据库的问题。<br/><br/>　　二、创建数据库<br/><br/>　　你需要做的第一件事是创建数据库表来为这些职务存储数据。我创建了一个叫informit_ajax的MySQL表-它拥有ID，title，description和date字段-这些都是在本文中不断重复出现的变量。下面是创建该表的代码：<br/><br/><div class="code"><br/>CREATE TABLE ′informit_ajax′ (<br/>′id′ int(11) NOT NULL auto_increment,<br/>′date′ datetime NOT NULL default &#039;0000-00-00 00:00:00&#039;,<br/>′description′ longtext NOT NULL,<br/>′title′ varchar(100) NOT NULL default &#039;&#039;,<br/>PRIMARY KEY (′id′)<br/>) TYPE=MyISAM; <br/><br/>　　<br/></div><br/> &nbsp; 你可以用任何MySQL查询工具或开发应用程序所用的语言来执行这段代码。一旦准备好数据库，接下来就需要创建向PHP后台发出请求的前端文件。<br/><br/>　　三、发出请求<br/><br/>　　这里的索引HTML文件是一简单的数据占位符-它将被从数据库中加以分析。该文件包含到JavaScript和CSS文件的参考；还包含一个发出首次请求的onload处理器和三个div标签：<br/><br/>　　· Layout-用于把页面内容居中<br/><br/>　　· loading-在被请求的数据加载期间加载消息，它将为HTTPRequest对象所接收<br/><br/>　　· posts-用于显示每一个分析后的职务数据<br/><br/><div class="code"><br/>＜head＞<br/>＜title＞How to Integrate a Database with AJAX＜/title＞<br/>＜link href=&quot;css/layout.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /＞<br/>＜script src=&quot;js/request.js&quot;＞＜/script＞<br/>＜script src=&quot;js/post.js&quot;＞＜/script＞<br/>＜/head＞ <br/>＜body onload=&quot;javascript:makeRequest(&#039;services/post.php?method=get&#039;);&quot;＞<br/>＜div id=&quot;layout&quot; align=&quot;center&quot;＞<br/>＜div id=&quot;posts&quot;＞＜/div＞<br/>＜p＞＜input type=&quot;button&quot; value=&quot;add a post&quot; onmousedown=&quot;javascript:makeRequest(&#039;services/post.php?method=save&#039;);&quot; /＞＜/p＞<br/>＜p＞＜div id=&quot;loading&quot;＞＜/div＞＜/p＞<br/>＜/div＞<br/><br/>＜/body＞ <br/><br/></div><br/><br/>　　当页面装载时产生第一个请求。这个请求发送一个get查询到一个我们稍后会创建的PHP类；但是首先我们需要为请求的响应创建分析方法。JavaScript请求文件负责处理所有的基础工作，例如创建对象，发送请求以及检查准备状态等。当从Request对象收到响应时，我用这个JavaScript职务文件来处理这些职务的HTML生成。onResponse方法是相当强壮的，因为它以文本和表单两种版本处理每个职务的HTML页面生成，并且把它们放置到它们自己定制的div标签中；这样以来，我们就可以容易地在用户交互期间定位它们。通过这种方法，我们可以在每个职务的文本和表单版本之间进行切换-这可以通过点击一个"edit this post"链接来实现。下面是针对每个职务创建的HTML页面的代码，你可以在本文相应的下载源文件中看到完整的方法实现。<br/><br/><div class="code"><br/>var html = &quot;＜div class=&#039;post&#039; id=&#039;post_&quot;+ i +&quot;&#039; &quot;+ postDisplay +&quot;＞&quot;<br/>+ &quot;＜div class=&#039;title&#039; id=&#039;title_&quot;+ i +&quot;&#039;＞&quot;+ _title +&quot;＜/div＞&quot;<br/>+ &quot;＜div class=&#039;description&#039; id=&#039;description_&quot;+ i +&quot;&#039;＞&quot;+ _description +&quot;＜/div＞&quot;<br/>+ &quot;＜div class=&#039;date&#039; id=&#039;date_&quot;+ i +&quot;&#039;＞&quot;+ _date +&quot;＜/div＞&quot;<br/>+ &quot;＜a href=&#92;&quot;javascript:toggle(&#039;&quot;+ i +&quot;&#039;);&#92;&quot;＞edit this post＜/a＞＜br/＞&quot;<br/>+ &quot;＜/div＞&quot;<br/>+ &quot;＜div class=&#039;post&#039; id=&#039;formPost_&quot;+ i +&quot;&#039; &quot;+ formPostDisplay +&quot;＞&quot;<br/>+ &quot;＜div class=&#039;title&#039;＞＜input type=&#039;text&#039; name=&#039;title&#039; id=&#039;formTitle_&quot;+ i +&quot;&#039; size=&#039;60&#039; value=&#039;&quot;+ _title +&quot;&#039;＞＜/div＞&quot;<br/>+ &quot;＜div class=&#039;description&#039;＞＜textarea type=&#039;text&#039; id=&#039;formDescription_&quot;+ i +&quot;&#039; wrap=&#039;virtual&#039; cols=&#039;60&#039; rows=&#039;15&#039;＞&quot;+ _description +&quot;＜/textarea＞＜/div＞&quot;<br/>+ &quot;＜div class=&#039;date&#039;＞&quot;+ _date +&quot;＜/div＞&quot;<br/>+ &quot;＜input type=&#039;button&#039; name=&#039;cancel&#039; value=&#039;cancel&#039; onclick=&#92;&quot;javascript:toggle(&#039;&quot;+ i +&quot;&#039;);&#92;&quot;＞&quot;<br/>+ &quot;＜input type=&#039;button&#039; name=&#039;delete&#039; value=&#039;delete this post&#039; onclick=&#92;&quot;javascript:deletePost(&quot;+ _id +&quot;);&#92;&quot;＞&quot;<br/>+ &quot;＜input type=&#039;button&#039; name=&#039;submit&#039; value=&#039;save this post&#039; onclick=&#92;&quot;javascript:saveNewPost(&quot;+ _id +&quot;,&quot;+ i +&quot;);&#92;&quot;＞&quot;<br/>+ &quot;＜/div＞&quot;<br/>+ &quot;＜p＞&quot;nbsp;＜/p＞&quot;; <br/><br/></div><br/>　　每个职务的文本版本简单地显示标题，描述和日期以及一个"edit this post"链接。每个职务的表单版本有三个按钮：<br/><br/>　　·"cancel"按钮-简单地把职务的状态切换回文本版本。<br/><br/>　　·"delete this post"按钮-把当前职务的ID发送给PHP对象以从数据库中把它删除。<br/><br/>　　·"save this post"按钮-允许用户把新的或编辑过的职务保存到服务器。<br/><br/>　　处理服务器端请求通讯的核心方法有onResponse，saveNewPost，deletePost和getPost方法；还有存储当前正操作的职务索引的一个getter和一个setter方法。这些getter/setter方法把当前索引值提供给这些核心方法，这样正确的职务就可以用基于该索引的正确信息进行更新。下面是针对每个核心方法（不包括onResponse，因为我们以前观察过它的功能)的简短描述和代码示例：<br/><br/>　　· 下面的saveNewPost方法通过收集并把表单输入值发送给PHP对象来保存新的职务并且把getPost方法设置为onreadystatechange的回叫方法：<br/><br/><div class="code"><br/>function saveNewPost(_id, _index)&#123;<br/>　var newDescription = document.getElementById(&quot;formDescription_&quot;+ _index).value;<br/>　var newTitle = document.getElementById(&quot;formTitle_&quot;+ _index).value;<br/>　setIndex(_index);<br/>　sendRequest(&quot;services/post.php?method=save&quot;id=&quot;+ _id +&quot;&quot;title=&quot;+ newTitle +&quot;&quot;description=&quot;+ newDescription, getPost);<br/>&#125; <br/><br/></div><br/><br/>　　· 下面的getPost方法是一个回调方法-它负责当从PHP对象收到响应时更新单独的职务：<br/><br/><div class="code"><br/>function getPost()&#123;<br/>　if(checkReadyState(request)) &#123;<br/>　　var response = request.responseXML.documentElement;<br/>　　var _title = response.getElementsByTagName(&#039;title&#039;)&#91;getIndex()&#93;.firstChild.data;<br/>　　var _description = response.getElementsByTagName(&#039;description&#039;)&#91;getIndex()&#93;.firstChild.data;<br/>　　var _date = response.getElementsByTagName(&#039;date&#039;)&#91;getIndex()&#93;.firstChild.data;<br/><br/>　　document.getElementById(&quot;title_&quot;+ getIndex()).innerHTML = _title;<br/>　　document.getElementById(&quot;description_&quot;+ getIndex()).innerHTML = _description;<br/>　　document.getElementById(&quot;date_&quot;+ getIndex()).innerHTML = _date;<br/>　　toggle(getIndex());<br/>　&#125;<br/>&#125; <br/><br/></div><br/>　　· 下面的deletePost方法把当前索引作为一个请求发送给PHP对象，这最终将删除数据库中的记录并以更新的职务进行响应：<br/><br/><div class="code"><br/>function deletePost(_id)&#123;<br/>　sendRequest(&quot;services/post.php?method=delete&quot;id=&quot;+ _id, onResponse);<br/>&#125; <br/><br/></div><br/><br/>　　令人惊讶的是，最复杂的部分已经结束了。下面让我们分析最为关键的部分-数据库交互。<br/>Tags - <a href="http://www.dzhope.com/tags/ajax/" rel="tag">ajax</a> , <a href="http://www.dzhope.com/tags/%25E6%2595%25B0%25E6%258D%25AE%25E5%25BA%2593/" rel="tag">数据库</a>
]]>
</description>
</item><item>
<link>http://www.dzhope.com/post//#blogcomment</link>
<title><![CDATA[[评论] AJAX集成数据库（一）]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.dzhope.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>