一、引言
如今,有相当多的web应用程序,如backpack,blinksale和gmail,都把数据库技术与
ajax集成到一起。通过提供与数据库通讯而不用刷新浏览器这种强有力的技术,这种集成对web应用程序和用户体验产生巨大的影响-这意味着,在用户继续其它交互的同时可以实现实时的数据传输。
本文将集中讨论上述技术集成机理。同时提供了完整的参考源码。这个示例是一个简单的职务记录应用程序,其中每个职务包含一个标题,描述和日期-允许用户添加、编辑和删除职务。所有这些都是你与数据库记录数据打交道时的基本操作,但是这个应用程序更进了一步。一个职务可以变化成一个可编辑的表单-它将被从数据库中加以保存或删除,以及以其新状态显示而不需要刷新浏览器并中断用户操作。
在本文中,我假定你已经初步了解
ajax、mysql和php,或一类似的服务器端语言。如果你还没有创建过xml http request对象,那么可以先参考我的文章“怎样使用
ajax”。下面,首先让我们讨论数据库的问题。
二、创建数据库 你需要做的第一件事是创建数据库表来为这些职务存储数据。我创建了一个叫informit_
ajax的mysql表-它拥有id,title,description和date字段-这些都是在本文中不断重复出现的变量。下面是创建该表的代码:
create table ′informit_ajax′ (
′id′ int(11) not null auto_increment,
′date′ datetime not null default '0000-00-00 00:00:00',
′description′ longtext not null,
′title′ varchar(100) not null default '',
primary key (′id′)
) type=myisam;
你可以用任何mysql查询工具或开发应用程序所用的语言来执行这段代码。一旦准备好数据库,接下来就需要创建向php后台发出请求的前端文件。
三、发出请求 这里的索引html文件是一简单的数据占位符-它将被从数据库中加以分析。该文件包含到javascript和css文件的参考;还包含一个发出首次请求的onload处理器和三个div标签:
· layout-用于把页面内容居中
· loading-在被请求的数据加载期间加载消息,它将为httprequest对象所接收
· posts-用于显示每一个分析后的职务数据
<head>
<title>how to integrate a database with ajax</title>
<link href="/webjx/css/layout.css" rel="stylesheet" type="text/css" />
</head>
<body onload="javascript:makerequest('services/post.php?method=get');">
<p><input type="button" value="add a post" onmousedown="javascript:makerequest('services/post.php?method=save');" /></p>
<p></p>
</body>
当页面装载时产生第一个请求。这个请求发送一个get查询到一个我们稍后会创建的php类;但是首先我们需要为请求的响应创建分析方法。javascript请求文件负责处理所有的基础工作,例如创建对象,发送请求以及检查准备状态等。当从request对象收到响应时,我用这个javascript职务文件来处理这些职务的html生成。onresponse方法是相当强壮的,因为它以文本和表单两种版本处理每个职务的html页面生成,并且把它们放置到它们自己定制的div标签中;这样以来,我们就可以容易地在用户交互期间定位它们。通过这种方法,我们可以在每个职务的文本和表单版本之间进行切换-这可以通过点击一个"edit this post"链接来实现。下面是针对每个职务创建的html页面的代码,你可以在本文相应的下载源文件中看到完整的方法实现。
var html = ""
+ ""+ _title +""
+ ""+ _description +""
+ ""+ _date +""
+ "edit this post<br/>"
+ ""
+ ""
+ "<input type='text' name='title' id='formtitle_"+ i +"' size='60' value='"+ _title +"'>"
+ "<textarea type='text' id='formdescription_"+ i +"' wrap='virtual' cols='60' rows='15'>"+ _description +"</textarea>"
+ ""+ _date +""
+ "<input type='button' name='cancel' value='cancel' onclick=\"javascript:toggle('"+ i +"');\">"
+ "<input type='button' name='delete' value='delete this post' onclick=\"javascript:deletepost("+ _id +");\">"
+ "<input type='button' name='submit' value='save this post' onclick=\"javascript:savenewpost("+ _id +","+ i +");\">"
+ ""
+ "<p>"nbsp;</p>";
每个职务的文本版本简单地显示标题,描述和日期以及一个"edit this post"链接。每个职务的表单版本有三个按钮:
·"cancel"按钮-简单地把职务的状态切换回文本版本。
·"delete this post"按钮-把当前职务的id发送给php对象以从数据库中把它删除。
·"save this post"按钮-允许用户把新的或编辑过的职务保存到服务器。
处理服务器端请求通讯的核心方法有onresponse,savenewpost,deletepost和getpost方法;还有存储当前正操作的职务索引的一个getter和一个setter方法。这些getter/setter方法把当前索引值提供给这些核心方法,这样正确的职务就可以用基于该索引的正确信息进行更新。下面是针对每个核心方法(不包括onresponse,因为我们以前观察过它的功能)的简短描述和代码示例:
· 下面的savenewpost方法通过收集并把表单输入值发送给php对象来保存新的职务并且把getpost方法设置为onreadystatechange的回叫方法:
function savenewpost(_id, _index){
var newdescription = document.getelementbyid("formdescription_"+ _index).value;
var newtitle = document.getelementbyid("formtitle_"+ _index).value;
setindex(_index);
sendrequest("services/post.php?method=save"id="+ _id +""title="+ newtitle +""description="+ newdescription, getpost);
}
· 下面的getpost方法是一个回调方法-它负责当从php对象收到响应时更新单独的职务:
function getpost(){
if(checkreadystate(request)) {
var response = request.responsexml.documentelement;
var _title = response.getelementsbytagname('title')[getindex()].firstchild.data;
var _description = response.getelementsbytagname('description')[getindex()].firstchild.data;
var _date = response.getelementsbytagname('date')[getindex()].firstchild.data;
document.getelementbyid("title_"+ getindex()).innerhtml = _title;
document.getelementbyid("description_"+ getindex()).innerhtml = _description;
document.getelementbyid("date_"+ getindex()).innerhtml = _date;
toggle(getindex());
}
}
· 下面的deletepost方法把当前索引作为一个请求发送给php对象,这最终将删除数据库中的记录并以更新的职务进行响应:
function deletepost(_id){
sendrequest("services/post.php?method=delete"id="+ _id, onresponse);
}
令人惊讶的是,最复杂的部分已经结束了。下面让我们分析最为关键的部分-数据库交互。
四、与数据库交互
为了实现与数据库的交互,你需要创建方法用于检索,插入,代替和删除职务。我选择创建一个post类,其中有get,save和delete方法来处理这些交互。这个类还有一个到数据库连接文件(用于连接到数据库)的参考。你必须用自己的数据库信息来代替登录,口令和数据库名。