踏踏实实干工作,推进开源大发展!

使用PHP操作DB2 Express C的五种方法

2007-03-08 11:19:32 / 个人分类:PHP

  • 文件版本: V1.0
  • 开发商: 本站原创
  • 文件来源: 本地
  • 界面语言: 简体中文
  • 授权方式: 免费
  • 运行平台: Win9X/Win2000/WinXP
  最近IBM推出了一个令人十分震惊的数据产品DB2 Express C。这个产品的性能和其他的DB2版本差不多,而更吸引眼球的是它竟然是完全免费的。这对于以MySQL为首的开源数据库是一个不小的冲击,恐怕以后LAMP(Linux+Apache+MySQL+PHP)要变成LADP(Linux+Apache+DB2+PHP)了。为了提前应对这个变化,让我们先来看一看PHP操作DB2 Express C的各种方法。

    PHP在它发展的13年的时间演化出了非常多的数据库接口。本文就以Windows+PHP5.2为例来讨论在PHP中常用的五种操作DB2 Express C的方式。

    在讨论之前,让我们先使用下面的DB2 SQL语句建立一个表,在本文中将会经常使用这个表。

create table mytablea
{
id
int primary key,
name varchar(
20) not null,
age
int not null,
phone varchar(
30) not null,
salary
int }

    一、ODBC方式

    DB2 Express C和其他的数据库(SQL Server、Oracle)一样,也提供了ODBC驱动。但DB2的ODBC驱动并未随安装程序打包,在使用时需要从IBM的网站下载。网址如下:
    http://www.ibm.com/developerworks/cn/db2/v9/index_download.html

    PHP从3.0.6开始引入了访问ODBC API的函数。所有的访问ODBC API的函数都以odbc_开头。在使用这些函数之前,必须在本机上建立一个用户或系统的DB2 ODBC数据源。如图1所示。本文所建立的数据源名是mydb2。

       首先使用odbc_connect函数连接mydb2数据源。odbc_connect函数的定义如下:
       odbc_connect ( "数据源名", "用户名", "密码","游标类型"[可选])

        下面是连接mydb2的语句。
       $conn = odbc_connect("mydb2", "db2admin", "mypassword",SQL_CUR_USE_ODBC );
        其中db2admin是DB2 Express C在安装时默认的用户名。

    PHP还为我们提供了另外一个带缓冲的连接数据库的方法。odbc_pconnect。这个方法和odbc_connect的差不多,只是在当前php文件执行完后,这个连接并不释放。如果下一次仍然使用mydb2数据源的话,将继续使用这个连接。这样可以提高Web程序的执行效率。
    一般对数据库的操作无外乎两种,一是执行如delete、update和insert等不返回结果的SQL,另外一种是执行返回结果的SQL语句,如select。
    第一种情况可以使用odbc_do来执行。

odbc_do($conn, "delete * from mytable where id > 1000");
odbc_do($conn,
"insert into mytable values(2000, 'mike', 30, '12345678', 3000)");

    第二种情况可以使用odbc_exec来执行。
    $result = odbc_exec($conn, "select * from mytable where id = 2000");
    如果odbc_exec执行成功,则返回查询的结果。
    输出$result的方法很多,在这里我只给出将结果转换成数组的方法,其他的方法请参阅PHP手册。

var $fetch=array();
fetch
=odbc_fetch_array($result, 2); // 将第2行的每个字段的值保存在数组fetch中 $field1 = odbc_result($Query_ID, 1);
$field2
= odbc_result($Query_ID, "salary");
print $field1 .
"," . $field2;

    其中odbc_result既可以根据字段的索引,又可以根据字段的名得到字段值。

    最后使用odbc_close关闭数据库连接。

  

二、ADO方式

    如果在Windows中连接数据库,ADO无疑是最常用的数据库接口。如果在一种语言中可以调用ADO API,就意味着这种语言几乎可以连接任何数据库。
在ADO中最常用的是OLE DB驱动,DB2也提供了如图2所示的OLE DB驱动。


    由于PHP可以调用COM组件,因此,可以通过PHP的COM类来建立一个ADO对象,并通过DB2的OLE DB来连接DB2 Express C。

<? $conn = @new COM("ADODB.Connection") or die("ADO 对象创建失败!");
$rs
= @new COM("ADODB.RecordSet") or die("ADO 记录集创建失败!");
$conn
->open("Provider=IBMDADB2.DB2;UserID=db2admin;Password=mypassword; Data Source=test;Location=localhost;"); $rs = $conn->Execute("SELECT * FROM mytable ORDER BY salary DESC;");
$row
=1;
echo
"<table border=1>";
while(!$rs->EOF)
{
   echo
"<tr>";
  
for($col=0;$col<$rs->Fields->Count;$col++)
  
{
      echo
"<td>";
      echo $rs
->Fields[$col]->Name.":".$rs->Fields[$col]->Value;
      echo
"</td>";
   }
   $row++;
   echo
"</tr>";
   $rs
->MoveNext();
}
echo "</table>";
$rs
->Close;
$conn
->Close;
?>

    以上代码将mytable中的数据按salary排序,并以表格形式输出到IE中。
    虽然使用COM来建立ADO对象显得更直接,但如果这样用,PHP程序的跨平台特性就被破坏了。如果既想使用ADO,又想保持PHP的跨平台特性,可以使用一个开源的PHP库:ADODB。这个库可以从http://php.weblogs.com/adodb免费下载。

include("adodb.inc.php");
// 这里必须使用db2,通知ADODB要使用DB2的ADO连接字符串 $db = NewADOConnection('db2');
$db
->Connect("localhost", "db2admin", "mypassword", "test"); // test为数据库名 $result = $db->Execute("SELECT * FROM mytable");
if ($result === false) die("failed");
while (!$result->EOF) {
for ($i=0, $max=$result->FieldCount(); $i < $max; $i++)
print $result
->fields[$i].' ';
$result
->MoveNext();
print
"<br>n";
}

    使用ADODB之前,必须使用include来引用 adodb.inc.php。

  
三、PECL扩展方式
    PHP最大的卖点之一就是支持扩展功能,在PHP5中的ext目录是PHP的所有的扩展。而有一些扩展是专为数据库而做的。其中以db2_开头的一系列函数可以操作DB2 Express C。

    PECL的DB2扩展和ODBC的函数名类似,如连接数据库的叫db2_connect。
    db2_connect ( string database, string username, string password [, array options] )
    上面是db2_connect的原型。其中第一个参数database并不是传统意义上的数据库名。它还可以包括用户名和密码等信息。下面是database字符串的完成格式。
"DRIVER={IBM DB2 ODBC DRIVER}; DATABASE=database;HOSTNAME=hostname;PORT=port;PROTOCOL=TCPIP;UID=username;PWD=password;"

    如果在database中提供了用户名和密码,db2_connect中的username和password必须为null或空串。

    下面是两个连接DB2数据库的例子
    database字符串中只含有数据库名
<?php
$database
= 'test';
$user
= 'db2admin';
$password
= 'mypassword';
$conn
= db2_connect($database, $user, $password);
if ($conn) {
echo
"数据库连接成功";
db2_close($conn);
}
else {
echo
"数据库连接失败.";
}
?>

    database字符串中含有用户名和密码

<?php
$database
= 'test';
$user
= 'db2admin';
$password
= 'mypassword';
$hostname
= 'localhost';
$port
= 50000; // 为DB2 Express C的默认端口号 $conn_string = "DRIVER={IBM DB2 ODBC DRIVER};DATABASE=$database;" .
"HOSTNAME=$hostname;PORT=$port;PROTOCOL=TCPIP;UID=$user;PWD=$password;";
$conn
= db2_connect($conn_string, '', '');
if ($conn) {
echo
"数据库连接成功";
db2_close($conn);
}
else {
echo
"数据库连接成功";
}
?>

    从DB2 Express C中取数据
<?php
$database
= 'test';
$user
= 'db2admin';
$password
= 'mypassword';
$conn
= db2_connect($database, $user, $password);
$sql
= "SELECT name FROM mytable WHERE salary <= 2000 ORDER BY name DESC"; if ($conn) {
require_once(
'prepare.inc');
$stmt
= db2_exec($conn, $sql, array('cursor' => DB2_SCROLLABLE));
while ($row = db2_fetch_array($stmt)) {
print
"$row[0]\n";
}
}
?>

    关闭数据库连接
<?php
$conn
= db2_connect('test', 'db2admin', 'mypassword');
$rc
= db2_close($conn);
if ($rc) {
echo
"数据库连接成功关闭.";
}
?>

  四、利用其他语言操作DB2 Express C数据库

    这种方法听起来就很奇妙。而PHP就是这个奇妙世界的中心。在PHP中可以象在Java或.net中一样调用各自的类似。
在PHP中可以通过Java类直接调用java中的任何class类。下面是一个PHP调用Java类的例子。
<?php
$stack
= new Java('java.util.Stack'); // 可以将java.util.Stack换成任何的java类 $stack->push(1);
$result
= $stack->pop();
$ex
= java_last_exception_get();
if (!$ex) {
echo
"$result\n";
}

$result
= @$stack->pop();
$ex
= java_last_exception_get();
if ($ex) {
echo $ex
->toString();
}
java_last_exception_clear();
?>

    可以根据PHP的这个功能通过Java的JDBC来操作DB2数据库。这样做有一个好处,就是JDBC无需其他的库就可以访问数据库,因此,就不需要DB2的ODBC或OLE DB驱动了。关于JDBC如何连接数据库请参与相关的文档,本文不再详述。
调用.net的库和调用Java的库类似。
<?php
// 要使用DOTNET方法 $stack = new DOTNET("mscorlib", "System.Collections.Stack");
$stack
->Push(".Net");
$stack
->Push("Hello ");
echo $stack
->Pop() . $stack->Pop();
?>

    在使用Java和DOTNET方法之前,机器上必须安装JDK或.net framework。

   五、PDO方式

    我们在上面已经了解了PHP操作DB2 Express C数据库的四种方法。除了这四种方法,PHP还有其他的方法来操作数据库,如DB、Perl DBI等。虽然方法很多,也很灵活,但这也给开发人员带来了不便。使开发人员在选择数据操作方式上不知所措。为止,在PHP5.1以后的版本集成了PDO(PHP Data Object),使得数据库接口统一为一种。

    PDO充分利用了PHP5的面向对象特性。在使用PDO之前必须要下载和安装PDO(在windows版本的PHP5中PDO并未随安装包一起发布)。下载地址:http://snaps.php.net/win32/。在下载完后,在windows目录下的php.ini中加入一个extension=php_pdo_odbc.dll(在上述的四种方法和PDO方式其实在底层都是使用DB2的ODBC驱动来操作数据库)。
通过PDO访问DB2 Express C有三种方法:

    1. 直接将参数传入构造函数

$pdo_conn = new PDO('odbc:mydb2', 'db2admin', 'mypassword');

其中mydb2是为DB2 Express C建立的数据源。

2. 通过文件数据源连接DB2数据库

$pdo_conn
= new PDO("url:file://usr/local/db2.dsn");

其中db2.dsn是为DB2 Express C建立的文件数据源。

3. 将连接字符串引用php.ini中

在php.ini中加入如下的信息
[PDO]
pdo.dsn.mydb2
= " odbc:mydb2; username=db2admin; password=mypassword"
$pdo_conn
= new PDO('mydb2', 'db2admin', 'mypassword');

    上面三种方法虽然都是使用的DB2数据源,但在后面的操作中(如查询数据等)的接口和其他的数据库完全一致。如下面是使用$pdo_conn来查询test中的mytable表中的数据。

TAG: PHP DB2

我来说两句

-5 -3 -1 - +1 +3 +5