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


最近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。

图1

首先使用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驱动。

图2

由于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。

四、利用其他语言操作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表中的数据。

<?php

$sql = 'select id, name, salary from mytable order by salary desc';

foreach ($pdo_conn->query($sql) as $row) ...{

print $row['id'] . "\t";

print $row['name'] . "\t";

print $row['salary'] . "\n";

}

}

?>

下面是一种可能的输出结果:

1000 mike 2000

2000 john 2500

… …

7000 bill 10000

pdo除了可以进行基本的数据库操作外,还可以通过begintransaction、rollback、commit方法对数据库进行事务操作。

总结

本文介绍了php的五种操作db2 express c的方法。虽然它们都可以完成我们大多数的任务,但我建议在工作中尽量使用最后一种pdo的方法来操作数据库。因为,zend公司已经宣布,在未来的版本中pdo将成为php中默认的数据库接口。因此,pdo将是未来的趋势。


申明:本区内容收集自网络,如有署名问题请速与我们(luokelong#it168.com)联系,感谢您的支持。
7上一页  下一页8

制作:罗可龙 电邮:luokelong(at)it168.com