PHP 是一种开放源代码的通用脚本编制语言,它可以被嵌入 HTML 中来进行 Web 开发。 IBM Cloudscape 是 Apache Derby 开放源代码数据库的商业版本。
使用 PHP 由 Derby 数据库中所存储的数据动态构建 Web 页面不是很棒吗?ODBC 提供了中间链接,以便您可以准确地完成该工作。PHP 支持 ODBC,而 IBM DB2® ODBC 驱动程序可用于访问 Derby 数据库。这篇技术文章向您展示了如何将这三者联系起来。本文首先解释了如何配置 IBM DB2 ODBC 驱动程序以使用 Derby,接着展示了如何在 Windows 上安装 PHP 以及配置 Web 服务器,最后向您提供了在 Derby 数据库中执行 SQL 语句的 PHP 示例代码。
本小节中所描述的软件可以通过免费下载获得。
安装以下数据库选项中的 一种:
- Cloudscape 10.0(包括了 IBM DB2 JDBC Universal Driver)
- Apache Derby 和 IBM DB2 JDBC Universal Driver
此外,安装以下 全部软件:
- PHP 这篇技术文章中的指令是用 PHP 版本 4.3.29 和 5.0.2 测试的;我们推荐使用版本 4.3.29。
- IBM DB2 ODBC
- Web 服务器。这篇技术文章中的指令是基于 Apache HTTP Server 2.0.50 测试的。此外,它们对 IBM HTTP Server 2.0 也应该生效。
为了使用 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。
使用 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 连接
用本地主机(localhost)端口 1527 上运行的 Cloudscape Network Server 填充“User ID”和“Password”的值之后,单击“Connect”按钮来测试到 Cloudscape Data Source“DB1”的连接。如果该连接成功,就会出现一个弹出框告诉您成功的信息。
进入 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 的配置,让我们从命令行执行一个简单的脚本,以测试安装。
清单 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 |
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 的路径不正确。
将上面刚刚创建的 test.php 文件复制到 Web 服务器的
htdocs 目录下的目录中。
然后打开浏览器,并输入
http://<web_server_Name>/test.php,例如:
http://localhost/test.php |
这将显示 PHP 版本信息表。
本小节将测试到 Derby 的 PHP 连接。但是,首先要确保您可以使用
ij 这个 Derby SQL 脚本编制工具,建立到
DB1 数据库的 Derby Network Server 连接。如果
ij 不工作,那么您的 PHP 连接也很可能不会工作。下面展示了用于在 Network Server 上启动
ij 的
java 命令,但是为了易读性,已将之分为几行进行显示:
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 命令失败了,请检查:
- 您的 CLASSPATH 是否设置正确?
- 您是否启动了 Network Server?
如果
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 上去查找下载资源、常见问题解答、文档以及邮件列表。