IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >

将 PHP 应用程序连接到 Apache Derby

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

Moira Casey (caseymo@us.ibm.com), 质量保证, IBM

2004 年 11 月 01 日

超文本处理器(Hypertext Processor,PHP)是一种用于构建 Web 页面的开放源代码的脚本编制语言。通过 PHP 和开放数据库连接(Open Database Connectivity,ODBC),您可以由 IBM® Cloudscape™ 和 Apache Derby 数据库中所存储的数据动态生成 Web 页面。本文将确定如何在 Windows® 上安装和配置 PHP。同时,通过学习如何连接 Derby 数据库以及插入数据和查询数据来理解 PHP 脚本编制语言。

概述

PHP 是一种开放源代码的通用脚本编制语言,它可以被嵌入 HTML 中来进行 Web 开发。 IBM CloudscapeApache Derby 开放源代码数据库的商业版本。

使用 PHP 由 Derby 数据库中所存储的数据动态构建 Web 页面不是很棒吗?ODBC 提供了中间链接,以便您可以准确地完成该工作。PHP 支持 ODBC,而 IBM DB2® ODBC 驱动程序可用于访问 Derby 数据库。这篇技术文章向您展示了如何将这三者联系起来。本文首先解释了如何配置 IBM DB2 ODBC 驱动程序以使用 Derby,接着展示了如何在 Windows 上安装 PHP 以及配置 Web 服务器,最后向您提供了在 Derby 数据库中执行 SQL 语句的 PHP 示例代码。





回页首


软件需求

本小节中所描述的软件可以通过免费下载获得。

安装以下数据库选项中的 一种

  1. Cloudscape 10.0(包括了 IBM DB2 JDBC Universal Driver)
  2. Apache DerbyIBM DB2 JDBC Universal Driver

此外,安装以下 全部软件:





回页首


配置 IBM DB2 ODBC 客户机

为了使用 IBM DB2 ODBC 驱动程序及 Derby 数据库,IBM DB2 客户机软件需要知道 Derby 数据库位于何处及其名称是什么,并且还需要知道它是一个 ODBC 数据源。本小节展示了如何通过 编目该节点来提供所有这些信息。

本小节中的指令假定下列内容:

  • Derby Network Server 在默认端口 1527 上运行。
  • 您已经创建了名为 DB1 的 Derby 数据库。
  • Derby 数据库与正在运行的 Web 服务器位于同一台机器上(“localhost”)。

首先,指定运行远程数据库的主机和端口。本例中,Derby 数据库位于本地机器上(“localhost”),Network Server 侦听默认端口 1527。您还需要为该节点提供一个名称;例如,称之为 CNS

打开 db2cmd 窗口,并编目 CNS 节点以访问端口 1527 上的 localhost,如下所示:

db2 catalog tcpip node CNS remote localhost server 1527

接着,提供该数据库的名称,以在 CNS 节点上进行访问,如下所示:

db2 catalog db DB1 at node CNS authentication server 

最后,将该数据库编目为一个 ODBC 数据源。您可以使用 Windows ODBC Data Source Administrator,或者通过使用下面所示的 CLP 命令来完成该工作:

db2 catalog system odbc data source DB1

为了检查前几个步骤是否正确工作,以便为 DB1 数据库创建 ODBC 数据源,请发出以下命令:

db2 list system odbc data sources

如果这些步骤都正确工作,您就会看到确实存在 IBM DB2 ODBC DRIVER 类型的数据源名称 DB1

如果该节点或数据库已经被编目,上面所显示的命令就会失败。如果您碰到了任何故障,下列 DB2 UDB 命令就会展示如何取消它们的编目,并返回刚刚开始的状态:

db2 uncatalog node CNS
db2 uncatalog db DB1

关于 IBM DB2 UDB catalog 命令的完整描述,请参阅 IBM DB2 Universal Database Command Reference

验证 Derby 的 ODBC 设置是否已经生效

使用 Windows 中的 ODBC Data Sources 工具来设置 DB1,以便快速确定 ODBC 是否可以连接 Derby 数据源(Data Source)。若要在 Windows XP 中访问该工具,请进入 Start --> Control Panel --> Administrative Tools --> Data Sources (ODBC)。这将打开 ODBC Data Source Administrator。选择 ‘System DSN’选项卡,如果已经正确编目了 DB1 数据源,您就会在该列表中看到它。

突出显示“Name”列下的 DB1,并单击左边的 “Configure...”按钮。您将看到出现一个类似于以下图像的窗口。


图 1. 确认到 Derby 数据源的 ODBC 连接
ODBC 数据源连接

用本地主机(localhost)端口 1527 上运行的 Cloudscape Network Server 填充“User ID”和“Password”的值之后,单击“Connect”按钮来测试到 Cloudscape Data Source“DB1”的连接。如果该连接成功,就会出现一个弹出框告诉您成功的信息。





回页首


安装 PHP

进入 http://www.php.net/downloads.php。对于 Windows,选择 Windows Binaries 下的 PHP 4.3.9 zip 包。该安装推荐集成 PHP 和 Apache,这是为了配置 Apache 以便将 PHP 用作动态共享对象(Dynamic Shared Object)或服务器模块(Server Module)。并非所有可从 www.php.net 上获得的 PHP 版本都支持 Apache 模块(Module)。您需要 4.3.9 zip 包以获得所需的 Apache dll。PHP 4.3.9 安装程序包仅支持 CGI,而 CGI 使得您的 Web 浏览器易受安全性问题的影响并易受到攻击。此外,服务器模块提供了好得多的性能。

将 php-4.3.9-Win32.zip 文件解压至一个目录中。

接着,在您解压 PHP 的位置上查找名为 php.ini-recommended 的文件。将该文件复制到名为 php.ini 的文件中。

现在,打开 php.ini,并编辑“doc_root”行以指向 Apache 文档根目录。下面是一个示例条目:
doc_root ="C:\Program Files\Apache Group\Apache2\htdocs"

现在,将 sapi 目录下的文件 php4apache2.dll 复制到上一级的 PHP 主目录中。

为了用命令行版本的 PHP 来测试脚本,就必须使用安装了 PHP 的 cli 目录下的 php.exe 文件。此外,为了使用命令行版本, php4ts.dll 文件也必须位于同一目录中。因此,应该用另一名称保存 PHP 主目录中的 php.exe,并且应将 cli 目录下的 php.exe 移至主目录下。现在, php4ts.dll 以及原先位于 cli 目录下的 php.exe 文件就都在 PHP 主目录中了。

现在已经完成了 PHP 的配置,让我们从命令行执行一个简单的脚本,以测试安装。





回页首


从命令行测试 PHP

清单 1 中的代码是一个简单的 PHP 脚本,用于测试您的 PHP 环境。


清单 1:PHP 环境测试
<!-- begin of test.php-->
<?php phpinfo(); ?>
<!--end of script-->

将清单 1 的内容复制到一个名为 test.php 的文件中,并将之保存在 PHP 主目录中。现在,请确保 PHP 主目录下的 php.exe 在您的路径中,或者指定到它的全路经并运行该脚本。下面是运行 test.php 文件的命令,以及运行该脚本的部分示例输出清单。

C:\php-4.3.9-Win32>php.exe test.php
<!-- begin of test.php-->
phpinfo()
PHP Version => 4.3.9
System => Windows NT ELIZA2 5.1 build 2600
Build Date => Sep 21 2004 14:03:10
Server API => Command Line Interface
Virtual Directory Support => enabled
Configuration File (php.ini) Path => C:\php-4.3.9-Win32\php.ini
PHP API => 20020918
PHP Extension => 20020429
Zend Extension => 20021010
Debug Build => no
Thread Safety => enabled
Registered PHP Streams => php, http, ftp, compress.zlib





回页首


配置 Web 服务器

httpd.conf 文件用于配置 Web 服务器,它位于该 Web 服务器的安装目录路径中。对于 Apache,该文件位于 ..\Apache2\conf 目录下。

对于 Windows,为了使用 4.3.9 zip 文件中附带的用于 Apache 的 PHP 模块,要编辑 httpd.conf 文件。在 Dynamic Shared Object 部分的末尾,其他所有的“LoadModule”语句之后要添加下列命令:

LoadModule php4_module "c:/php-4.3.9-Win32/php4apache2.dll"
AddType application/x-httpd-php .php
# configure the path to php.ini
PHPIniDir "C:/php-4.3.9-Win32"

在以上条目中,LoadModule 部分指定了到动态共享对象 php4apache2.dll 的路径,该对象是您解压的 PHP 发行版所附带的。PHPIniDir 指向 php.ini 文件,该文件是您原先从名为 php.ini-recommended 的文件复制的。

一旦添加了这些条目,为了让这些更改起作用,您就需要停止并重新启动 Apache。如果进行这些更改之后,您无法启动 Apache Web 服务器,就请在 logs/error.log 文件中查找问题。很可能是到该 dll 的路径不正确。





回页首


测试 PHP 和 Web 服务器

将上面刚刚创建的 test.php 文件复制到 Web 服务器的 htdocs 目录下的目录中。 然后打开浏览器,并输入 http://<web_server_Name>/test.php,例如:

http://localhost/test.php

这将显示 PHP 版本信息表。





回页首


测试 PHP/Web 服务器/Derby

本小节将测试到 Derby 的 PHP 连接。但是,首先要确保您可以使用 ij 这个 Derby SQL 脚本编制工具,建立到 DB1 数据库的 Derby Network Server 连接。如果 ij 不工作,那么您的 PHP 连接也很可能不会工作。下面展示了用于在 Network Server 上启动 ijjava 命令,但是为了易读性,已将之分为几行进行显示:

C:\>java -Dij.driver=com.ibm.db2.jcc.DB2Driver 
      -Dij.protocol=jdbc:derby:net://localhost:1527/ 
      -Dij.user=APP -Dij.password=APP  org.apache.derby.tools.ij
ij version 10.0 (C) Copyright IBM Corp. 1997, 2004.
ij> connect 'DB1';

如果 ij 命令失败了,请检查:

如果 ij 测试成功了,您就可以准备执行清单 2 了,该清单包含了一个简单的 PHP 脚本,用于创建一个表,对该表执行插入,然后从中取数据。这个名为“DB1”的数据库是在 Windows 的 ODBC Data Source 管理器中定义的。

  • 将清单 2 的内容复制到一个名为 phptest.php 的文件中。
  • 将该脚本置于 Web 服务器的 htdocs 目录中。
  • 在 Web 浏览器中运行该脚本。例如, http://web_server_Name/phptest.php。这将显示一个格式化的结果集。
  • 如果发生错误,或者没有显示预期的结果集,就请检查位于 Web 服务器的 log 目录下的 error.log 文件。
  • 为了检查 PHP、ODBC 和 Derby 是否都已经配置正确,而不让 Web 服务器参与,就请尝试从命令行运行下列脚本。
    例如: C:\php-4.3.9-Win32\php.exe phptest.php
    如果它执行正确,就会显示一个带有结果集的 html 表。


清单 2:Derby 测试
<!---------------- begin script phptest.php----------------->
<?php
$username = "dbadmin";
$password = "testpw";
$dbname = "DB1";
putenv("DB2INSTANCE=DB2");
/* connect to the database with a specified username and password */
$dbconn = odbc_connect($dbname,$username,$password);
/* override the auto commit option, set autocommit to TRUE */
odbc_autocommit($dbconn, TRUE);
if ($dbconn != 0)
{
/* Create the STAFF table */
CreateTable($dbconn);
/* Insert rows into the STAFF table */
BasicInsert($dbconn);
/* Select from the STAFF table */
SelectTable($dbconn);
/* Drop the STAFF table */
DropTable($dbconn);
}
/* disconnect from the database */
DbDisconn($dbconn);
/*******************************************************************************
** Description : This routine uses the odbc_exec function to prepare and 
** execute the SQL statement to CREATE the STAFF table.
*******************************************************************************/
function CreateTable($dbconn)
{
$statement = "CREATE TABLE STAFF
(ID SMALLINT NOT NULL,
NAME VARCHAR(9),
DEPT SMALLINT,
JOB CHAR(5),
SALARY DECIMAL(7,2)) ";
$result = odbc_exec($dbconn, $statement);
} /* CreateTable */
/*******************************************************************************
** Description : This routine uses the odbc_exec function to prepare and 
** execute the SQL statement to INSERT rows into the STAFF table.
** The odbc_errormsg function will return the last error message.
*******************************************************************************/
function BasicInsert($dbconn)
{
$statement = "INSERT INTO STAFF(id, name, dept, job, salary) " .
" VALUES (380, 'Pearce', 38, 'Clerk', 13217.50), ".
" (310, 'Brown', 37, 'Clerk', 20000.00), " .
" (390, 'Hachey', 38, 'Mgr', 21270.00), " .
" (400, 'Wagland', 38, 'Clerk', 14575.00) ";
$result = odbc_exec($dbconn, $statement);
if ($result == 0)
{
$sqlerror = odbc_errormsg($dbconn);
print "** Error INSERTING into table. $sqlerror **";
}
} /* BasicInsert */
/*******************************************************************************
** Description : This routine uses the odbc_do function to execute a query 
** on the given connection.
** The odbc_result_all function prints the result as an HTML table. 
** odbc_result_all has an optional
** string argument called format. This option allows for overall table 
** formatting, such as BORDER style.
*******************************************************************************/
function SelectTable($dbconn)
{
//SQL query
$Query = "Select id, name, dept, job, salary from STAFF";
//execute query
$queryexe = odbc_do($dbconn, $Query);
//output results to standard output
odbc_result_all($queryexe, "BORDER=1");
} /* SelectTable */
/*******************************************************************************
** Description : This routine uses the odbc_exec runction to prepare and 
** execute the SQL statement to DROP the STAFF table.
** The odbc_errormsg function will return the last error message.
*******************************************************************************/
function DropTable($dbconn)
{
$statement = "DROP TABLE STAFF" ;
$result = odbc_exec($dbconn, $statement);
} /* DropTable */
/*******************************************************************************
** Description : This routine uses the odbc_commit function to commit 
** non-committed transactions.
** The odbc_close() function will close down the given connection 
** to the database server
********************************************************************************/
function DbDisconn($dbconn)
{
/* commit all non-committed transactions to release database locks */
if (!odbc_commit($dbconn))
{
print "Error on commit\n";
}
odbc_close($dbconn);
} /* DbDisconn */
?>





回页首


结束语

本文介绍了如何安装和配置 PHP,描述了如何使用 IBM DB2 ODBC 驱动程序为 ODBC 编目 Derby 节点,并演示了如何用 PHP 执行基本的数据库操作。



参考资料

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • IBM Cloudscape discussion forum 上与作者和其他读者分享你的问题和观点。

  • 要学习关于 IBM Cloudscape 的更多知识,请访问 developerWorks Cloudscape 专区。 你可以找到技术文章、培训资源、相关下载以及产品信息等资源。

  • php.net 上去查找下载资源、常见问题解答、文档以及邮件列表。


关于作者

Moira Casey 是 DB2 方面的咨询工程师。在过去的 6 年中,她一直是 DB2 的测试工程师,最近开始从事 Cloudscape 的测试。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?







回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款