Oracle Account
Manage your account and access personalized content.
Sign up for an Oracle Account
Sign in to Cloud
Access your cloud dashboard, manage orders, and more.
Sign up for a free trial
2007 年 2 月发表
近来一段时间,Ajax(异步 JavaScript 和 XML)风靡 Web 开发界。正如 Google 的一些特性(Suggest、Maps、Gmail 等)所展示的那样,Ajax 可以在无需用户提交表格或单击链接的情况下执行服务器请求。换句话说,Web 浏览器可以执行服务器请求并处理响应,无需用户进行任何操作,甚至感觉不到该操作正在发生。使用 Ajax 最直接的好处就是非常方便,而且相当酷。
在本文中,我将讨论使用 Ajax 创建简单的 Web 页到 JavaScript 函数、XMLHttpRequest、PHP 脚本,最后到 Oracle 数据库所需要的所有必要代码。对于代码,我将从整体角度讨论各段代码:每段代码的功能及其重要性。通过阅读该方法文档,您不仅可以获得一些示例代码,还希望您更深入地了解整个 Ajax 概念。
我将用到的示例是一个注册表单(或者说是其中的一小部分)。我必须确保 users 表中的电子邮件地址都是唯一的,从而使用户无法用同一地址多次注册。这通常是用户将表单提交给处理 PHP 脚本后验证过程的一部分。但用户为什么必须等待才能进行验证呢?相反,如果一旦用户输入其电子邮件地址并进入下一表单域,就立即验证该电子邮件地址那该多好呀。为此,我仍需查询该数据库,这就需要用到 Ajax 了。
本例简化的表结构可以使用以下 SQL 语句创建(无需其他表,我已经清除了标识键等内容)。
CREATE TABLE users (
email VARCHAR2(60)
显然,您可以以多种方式对此进行扩展。但目前,重要的是该示例代码假设您已经建立了这样的一个表并能够从 PHP 脚本连接它。该表必须包含一些记录才能使本示例完好运行,因此您应该按如下方式填充该表:
INSERT INTO users (email) VALUES ('this@that.com')
INSERT INTO users (email) VALUES ('me@school.edu')
INSERT INTO users (email) VALUES ('fake@address.net')
当创建并填充该表之后,就可以开始进行编码了。正如我提到的,这里涉及到两个脚本。要开发和测试所有内容,您需要:
创建查询 Oracle 数据库的 PHP 脚本。
手动测试 PHP 脚本查看其运行情况。
编写与 PHP 脚本交互的 JavaScript 代码。
将 HTML 表单联接到 JavaScript。
测试整个程序。
第 1 步:编写数据库查询
整个 PHP 脚本称为 ajax.php。(参见
示例代码 zip
。)该脚本的目的是在 Oracle 中运行一个查询并基于查询结果打印一条消息。这是非常基本的 Oracle、SQL 和 PHP 操作,但我将通过它来阐明正在进行的操作。
该脚本需要在该 URL 中接收一个电子邮件地址,它保存在变量 $_GET['email'] 中。然后该脚本连接到 Oracle 数据库。该查询还计算 users 表中有多少记录包含该电子邮件地址:
SELECT COUNT(*) AS NUM_ROWS FROM users WHERE email='{$_GET['email']}'
这应该返回 0 或 1(或者什么也不返回)。该查询在 Oracle 中执行,其结果绑定到 PHP $rows 变量。现在 $rows 表示数据库中有多少记录包含该电子邮件地址。对于 Ajax,该脚本的重要部分如下所示。
if ($rows > 0) {
echo 'Email address has already been registered!';
} else {
echo 'Email address is available!';
将基于 $rows 的值打印这两条消息中的一条。这就是该页面的全部内容了!其中完全不需要 HTML,因为该脚本不会用作标准的 Web 页面。
如果您想改进此脚本,可以检验该电子邮件地址是否匹配电子邮件地址的正则表达式模式。如果是这样,正常执行查询;否则,输出一个语句表明它不是有效的电子邮件地址。至少,您可能想防止 SQL 注入攻击。(也就是,在没有有效性保证时避免在查询中使用 $_GET 变量。)
第 2 步:测试 PHP 脚本
由于整个 Ajax 程序涉及几种技术(HTML、JavaScript、PHP、SQL 和 Oracle),您最好逐步测试每个部分。否则,您可能很难知道问题到底发生在哪里。测试这个 PHP 脚本应该相当容易:
确保您已经在 Oracle 中创建了该表并填充了它。
编辑 ajax.php,以便它针对您的 Oracle 安装使用有效的连接参数。
将脚本保存为 ajax.php。
将其放置在您 Web 服务器的适当目录中。
从您 Web 浏览器访问 http://yoururl/ajax.php?email=X。
将 X 替换为数据库中的一个现有电子邮件地址(例如,http://yoururl/ajax.php?email=this@that.com)。您应该看到“Email address has already been registered!”消息。然后使用一个还未存储的电子邮件地址。您应该看到“Email address is available!”。当这些正常运行后,您就可以进入本例的实际 Ajax 部分了。
第 3 步:编写 JavaScript
该过程的这一部分可能是最难的,除非您已经进行过大量的 JavaScript 编程。在任何情况中,JavaScript 代码都是 Ajax 过程的核心,因为是它在执行和处理 PHP 页面的请求。我将详细介绍该代码。
JavaScript 代码将定义三个函数。第一个函数创建一个请求对象变量:
function createRequestObject() {
var ro;
if (navigator.appName == "Microsoft Internet Explorer") {
ro = new ActiveXObject("Microsoft.XMLHTTP");
} else {
ro = new XMLHttpRequest();
return ro;
您无需任何修改就能将此代码用于任何 Ajax 应用程序。如果使用的 Web 浏览器是 Microsoft Internet Explorer,则 ro 变量初始化为类型 Microsoft.XMLHTTP 的 ActiveXObject。对于其他所有浏览器,ro 是直接的 XMLHttpRequest 对象类型。这对它来说实在没有其他意义。该 ro 变量现在是一个具有执行异步请求所需所有功能的对象。创建该请求对象变量之后,该函数将返回该变量。
当首次加载该页面时,该函数立即由 JavaScript 代码调用:
var http = createRequestObject();
现在 http 代表该对象,而且在其他函数中全局可用。
第二个是调用 PHP 脚本的函数:
function sendRequest(email) {
http.open('get', 'ajax.php?email=' + encodeURIComponent(email));
http.onreadystatechange = handleResponse;
http.send(null);
该函数接受一个参数(将验证的电子邮件地址)。然后它打开一个到 PHP 脚本的连接。正如 open() 方法中的第一个参数所示的,该请求的类型将是 get 而非 post。把该电子邮件地址附加到该 URL 后,得到一个诸如 ajax.php?email=this@that.com 的页面请求。如您所知,这是 PHP 脚本的正确调用方式。encodeURIComponent() 函数只是对提交的值进行编码以使它是 URL 安全的。该函数的第三行告诉该对象当发出请求后应该调用哪个 JavaScript 函数。最后一行实际发出请求。
再重复一下,第一个函数 createRequestObject() 创建所需的对象变量。第二个函数 sendRequest() 发出 PHP 脚本的实际请求。现在我们需要一个处理该请求的函数:
function handleResponse() {
if (http.readyState == 4) {
document.getElementById('email_label').innerHTML = http.responseText;
前一个函数告诉请求对象当发出请求后调用该函数。该函数首先检查请求是否成功发出。如果成功发出,http.readyState 将等于 4。它也可以等于 0 到 3 之间的整数(如果您感兴趣,可以在线搜索其实际含义),但等于 4 意味着请求成功。该请求的结果将存储在 http.responseText 属性中,结果是 PHP 脚本返回的两条消息之一。具体说来,如果该请求成功,则 http.responseText 将是“Email address has already been registered!”或“Email address is available!”。
此时,JavaScript 知道 PHP 脚本的结果是什么。您只需用 JavaScript 通知用户该结果。一个简单的方法是使用一个 alert() 对话框:
alert(http.responseText);
如果您将此置于该条件中,当您在测试整个应用程序时将看到该结果。(实际上,alert() 是一个极佳的调试工具,它可以揭示 JavaScript 代码的实际运行情况。)但是,我发现这些警告对于最终用户来讲有些烦人,我宁愿在该表单的电子邮件输入旁打印该消息。为此,我选用了 DOM(文档对象模型)。具体地讲,我将 http.responseText 指定给页面上一个称为 email_label 的元素。您将在第 4 步中看到这一点。
哟!希望您能跟得上。再说一遍,这是本系列最重要、最复杂的一部分。JavaScript 使用这三个函数进行以下三个操作:定义浏览器特定的请求对象;向 PHP 脚本发出请求;处理请求结果。如果您对其中的任何函数感到困惑,或者在需要创建更复杂的 Ajax 应用程序时,您可能需要研究一下 JavaScript 和 DOM。
第 4 步:创建一个具有 JavaScript 功能的 HTML 表单
正如我前面写到的,本例的前提是一个至少接受一个电子邮件地址的注册表单。最小的表单可能是:
<form action="somepage.php" method="post">
Email Address: <input name="email" type="text" size="30" maxlength="60" <//><br <//>
First Name:<input name="first_name" type="text" size="20" maxlength="20"<//><br <//>
(表格的其他内容……)
</form>
就这样!嗯,内容不多。您可能想要更多的输入(一个“submit”按钮,等等)。但就本例而言已经足够了。为了避免混淆,需要注意这里的动作属性和方法属性与 ajax.php 脚本(不处理该表单的提交)毫无关系。
此外,还需要两个操作。首先,该表单必须设法调用发出请求的 JavaScript 代码。为此,可以使用若干技巧:创建一个可点击的链接,等待点击提交按钮,等等。我已经确定,当用户输入一个电子邮件地址并前进到下一表单元素时就调用该 JavaScript。这需要 onchange() 方法(我将把它添加到电子邮件输入中):
Email Address: <input name="email" type="text" size="30" maxlength="60"
onchange="sendRequest(this.form.email.value)" <//>
当用户在该输入中更改值时(包括首次输入任何内容,然后切换或点击到另一个输入),将调用 JavaScript sendRequest() 函数。它接受一个参数(电子邮件表单输入的值)。如果您回头看看 JavaScript 代码,可以了解这里键入的值是如何发送给该函数(该函数进而发送给 PHP 脚本)。
另外,该 HTML 表单还需要一个位置供 JavaScript“写”接收的消息以便用户能看到。正如 handleResponse() 函数所示的,将把该消息赋给一个称为 email_label 的元素的 innerHTML。为此,在电子邮件地址输入后我对该 ID 添加了一个 span 标记:
<span id="email_label"></span>
这是为了将 HTML 表单连接到 JavaScript。(有关最终代码,请查看
示例代码 zip
中的清单 1。)现在我们来看一下它是如何工作的!
第 5 步:测试 Ajax 程序
完成 HTML 和 JavaScript 之后,您应该将它保存为 ajax.html(或其他任何实际内容),然后将其放在与 PHP 脚本相同的目录中。通过在您的 Web 浏览器中运行它来加载表格,注意这是通过 URL 来进行的,而非从文件系统打开它(例如,访问 http://yoururl/ajax.html)。在相应的输入中键入未使用过的电子邮件地址,然后切换或点击到下一输入。使用一个存储了的电子邮件地址重复操作。
以下两个屏幕快照显示了您应该看到的结果。非常神奇!
在本文中,您已经看到如何使用 PHP 和 Oracle 轻松实现一个 Ajax 程序。这样,服务器端验证将在客户端中实现(但如果禁用了 JavaScript,您仍需保留服务器端验证)。我认为,这个具体示例为最终用户演示了一个极佳的特性,使他们免于:
检查电子邮件地址是否已被注册
重复这个过程
此外,我认为该示例和概念总得来说都非常酷。而在 Web 上,这是个很重要的因素。
当然,您可以通过 Ajax、PHP 和 Oracle 进行其他大量工作。本文中的示例只将一段数据发送到 PHP 脚本,且只检索了一个字符串。其实,您可以发送和接收更多内容。如果您有大量数据要返回调用页面,您可以让 PHP 以 XML 格式返回数据,然后使用 JavaScript 分析并显示这些数据。如果您在线搜索,您将发现大量不同的示例。
Larry Ullman
是
DMC Insights Inc.
(一家专门研究信息技术的公司)数字媒体技术部门的总监以及 Web 开发人员主管。Larry 居住在华盛顿特区的郊外,并曾经编写过多部有关 PHP、SQL、Web 开发和其他计算机技术方面的书籍。
将您的意见发送给我们