 | 级别: 初级 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 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
此外,安装以下
全部软件:
配置 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 连接
用本地主机(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 上启动
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 命令失败了,请检查:
如果
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 执行基本的数据库操作。
参考资料
关于作者  | |  | Moira Casey 是 DB2 方面的咨询工程师。在过去的 6 年中,她一直是 DB2 的测试工程师,最近开始从事 Cloudscape 的测试。 |
对本文的评价
|  |