PHP ADODB 入门
1. 前言
一种 PHP 存取数据库的函式组件。现在 SFS3 系统 校园自由软件交流网学务系统 ) 计划的主持人陈莹光老师,A DODB Active Data Object Data Base 简称。决定采用此一组件,为了让更多有心参与该项目的伙伴们能够顺利加入发展的行列,小弟认为有必要把 ADODB 中文入门介绍写出来,以方便伙伴们参考备查。
但是 PHP 存取数据库的功能,虽然 PHP 建构 Web 系统强有力的工具。一直未能规范化,每一种数据库,都使用另一种不同且不兼容的应用顺序接口 ( API 为了填补这个缺憾,因此才有 ADODB 呈现。一旦存取数据库的接口予以规范化,就能隐藏各种数据库的差别,若欲转换至其它不同的数据库,将变得十分容易。
例如: MySQL, 目前 ADODB 支持的数据库种类非常地多。 PostgreSQL, Interbase, Informix, Oracle, MS SQL 7, Foxpro, Access, ADO, Sybase, DB2 以及一般的 ODBC 其中 PostgreSQL Informix Sybas driver 由自由软件社群发展之后贡献进去的
存取数据库的方式都是一致的开发设计人员不必为了某一套数据库,使用 ADODB 最大的优点之一是不管后端数据库如何。而必需再学习另一套不同的存取方法,这大大减轻开发人员的知识负担,过去的知识往后仍可继续使用,转移数据库平台时,顺序代码也不必做太大的更动。
并不是首创的 DBI 比 ADODB 出现得更早,其实 ADODB 这样的发展理念。提供 Perl 存取数据库时,使用一致的 API 呼叫接口。相信用过 Perl + DBI 朋友,再来用 ADODB 时,会有一种似曾相识的感觉。
ADODB 对用过 ASP 人而言,另外。应该不陌生,这类朋友对 ADODB 应该很容易接受。
ADODB 简单用法: 来看一下。
<?php
才干呼叫 adodb 提供的函式 // 引入 adodb inc 档。
includ 'adodb/adodb.inc.php' ;
以建立联机对象, // 选择连接的数据库种类。
即可使用其成员函式来处置数据库。 // 一旦对象建立。
// 以下 $conn 即此一物件 ( object
$conn = &A DONewConnect 'mysql' ;
fals 不要, // 要不要显示侦错讯息。 true 要。
// $conn->debug = false;
$conn->debug = true;
// 连接数据库
' 使用者 ', // 用法: $conn->Connect ' 主机 '. ' 密码 ', ' 数据库 ' ;
// 用例:
'piza', $conn->Connect 'localhost'. 'ooo123', 'test' ;
上式可换用 PConnect // 若欲采用继续性连接。
'piza', // $conn->PConnect 'localhost'. 'ooo123', 'test' ;
// 设定 sql 命令
18 " $sql = "insert into t valu 'abcde'.;
// 执行 sql 命令
$r = $conn->Execut $sql ;
若 $r == fals 则呼叫 $conn 对象的成员函式 ErrorMsg // 检查执行结果。
if !$r print $conn->ErrorMsg ; els print "OK!";
?>
结果如下:
---------------------------------------------
18 mysql : insert into t valu "abcde".
---------------------------------------------
OK!
即 $conn->debug=fals 则结果如下: 若把侦错关掉。
OK!
逐步为各位介绍:使用 ADODB 重点方法。 以下。
2. 装置
可至 ADODB 下载或至台南县教网中心 FTP 下载。 A DODB 首页在 http://php.weblogs.com/A DOdb 目前 ( 2002/10/24 最新版是 2.42 版。
只要下载、解压、放入适当位置,装置 ADODB 方法超极简单。即可完成 ! 如下所示:
1. 下载:
$ ncftp ftp.tnc.edu.tw
cd sysop/A DODB
get adodb242.tgz
2. 解压:
假设我把 adodb242.tgz 放入 /var/www/html 中
$ cp adodb242.tgz /var/www/html
$ tar xvzf adodb242.tgz
如下所示:
adodb/adodb-cryptsession.php
adodb/adodb-csvlib.inc.php
adodb/adodb-errorhandler.inc.php
adodb/adodb-errorpear.inc.php
adodb/adodb-lib.inc.php
adodb/adodb-pager.inc.php
.... 以下省略 ....
现在您在 /var/www/html/adodb 已安装好 ADODB
3. 引入 ADODB
应把 ADODB 相关的含入文件引入您的顺序中。 adodb 目录放在任何位置无所谓,一旦装置好 ADODB 使用前。只要能指向正确路径文件名即可。一般而言,您的顺序代码只须引入 adodb.inc.php
作法如下:
您的 PHP 顺序中:
includ ' 路径 /adodb/adodb.inc.php' ;
或
include_onc ' 路径 /adodb/adodb.inc.php' ;
例:
若您的顺序和 adodb 同一目录下:
.
..
adodb/
something.php*
则:
includ 'adodb/adodb.inc.php' ;
即可。
若位置是某一个目录 somedir 中:
.
..
adodb
somedir/something.php
则必须使用:
includ '../adodb/adodb.inc.php' ;
ADODB 还提供许多 adodb-*.inc.php 含入档,除了 adodb.inc.php 这个含入档。这些多半是为驱动某些数据库的特殊用法而设的
若是引入 adodb-session.php 则可让您将 session 存入数据库中来维护运用。
若是引入 adodb-pager.inc.php 可方便您做分页显示。
若是引入 adodb-errorhandler.inc.php 可让您自订错误处置讯息。
尚可使用 DSN 连接数据库的字符串设定。如 $dsn="mysql://piza:ooo123@localhost/test" 若是含入 adodb-pear.inc.php 可让您使用 PHP4 PEA R DB 语法来使用 ADODB 此时。;
方便将取出的记录,若是引入 tohtml.inc.php 可帮您在顺序代码中。转成 HTML 表格 ( tabl 来显示。
若是引入 toexport.inc.php 可让您方便地输出 CSV 档或以 tab 分隔字段的数据文件。
预做过滤处理。 若是引入 rsfilter.inc.php 可让您在使用记录之前。
若是引入 pivottable.inc.php 可让您使用 pivot tabl 功能 ( 俗称 cross-tabul
再引入该含入档即可。 注意 ! adodb.inc.php 一定要引入的其它则视您要使用那一个功能。
建立联机对象 4. 选用数据库种类。
因此您在引入档之后,由于 ADODB 使用对象导向的作法。接着请视您后端数据库的种类,建立一个联机对象。作法如下:
以 MySQL 数据库为例:
$conn = &A DONewConnect 'mysql' ;
注: NewA DOConnect 和 ADONewConnect 一样的二者皆可使用。
ADODB 会据此呼叫对应的数据库 driver 上例中的 'mysql' 指数据库的 drvier 种类。
其它常用的 driver 有: access ado ado_access ado_mssql db2 vfp ibas borland_ibas informix imformix72 mssql oci8 odbc postgr postgres64 postgres7 sqlanywher sybase.... 等等。
代表与数据库的连接事务,称建立的对象 $conn 为一 ADOConnect 对象。皆透过这个对象来处理。 ADOConnect 对象会提供许多处置的方法,以对象导向的说法,这些方法称为成员函式,这是外界存取此一对象的接口。
就有许多对象函式可供您使唤啦 ! 请看下一节的介绍。 一旦联机对象建立之后。
5. 侦错模式
为了方便查出出现问题可能的地方,顺序开发的过程。通常我会打开侦错模式,俟顺序功能确实稳定之后,再将它关闭。 ADODB 提供侦错模式,存取数据库时,能显示其运作方式。
使用法: 打开侦错模式。
$conn->debug=tru
使用法: 关闭侦错模式。
$conn->debug=fals
6. 连接数据库
使用 $conn 联机对象的 Connect 或 PConnect 函式来连接特定的数据库,接着。此时必需提供 DSN Data Sourc Name 相关数据, DSN 可能包括:主机名称、数据库使用者、数据库密码、数据库名称。不同的数据库种类, DSN 可能可以省略其中若干项。以 MySQL 而言,则上述四者都要提供。
该函式会传回 true 或 fals 用以表示是否连接成功。
用例:
' 使用者 ',// 格式: $conn->Connect ' 主机 '. ' 密码 ', ' 数据库 ' ;
'piza', $conn->Connect 'localhost'. 'ooo123', 'test' ;
采继续性连接: 或者。
' 使用者 ',// 格式: $conn->PConnect ' 主机 '. ' 密码 ', ' 数据库 ' ;
'piza', $conn->PConnect 'localhost'. 'ooo123', 'test' ;
可用一个变量来接取传回值: 若欲探查是否有联机成功。
$mch="localhost";
$user="piza";
$pwd="ooo123";
$database="test";
$user,$cok = $conn->Connect $mch. $pwd, $databas ;
采继续性连接: 或者。
$user,$cok = $conn->PConnect $mch. $pwd, $databas ;
if !$cok { echo " 无法连接数据库 $database"; exit; }
7. 设定 sql 命令语法、执行 sql 命令
您就可以设计您要执行的 sql 命令语法,接下来。然后付诸执行。
$sql = " 这里放 SQL 命令语法 ";
$r = $conn->Execut $sql ;
$r 为回传的结果,其中。若 $r == fals 则表示执行失败,您必需仔细检查一下。
也可以直接放入 Execut 括号中。若命令较短无妨,您不一定要把命令语法放在 $sql 变量中。若命令较长,建议您还是用一个变量 $sql 来设定命令字符串吧 !
为各位介绍 SQL 基本命令,下一节开始。如: Insert Select Update Delet 等等的用法。
8. 插入记录 ( Insert
Insert 用法如下:
$year 为数字 // $name 为字符串。
$name='abcde';
$year=18;
命令的大小写无妨,// 插入一笔记录。但数据表 t 及变量则大小写有分别 !
$year "$sql = "INSERT INTO t VA LUES '$name'.;
$year "; 亦可。 // $sql = "insert into t valu '$name'.
// 执行
$r = $conn->Execut $sql ;
进行错误处置;若正常,// 检查执行结果。则继续其它动作 ....
if !$r print $conn->ErrorMsg ;
.... 以下省略 ....
会取出错误讯息,ErrorMsg 错误显示的函式。并显示出来。
ADODB 提供一种 记录集 ( RecordSet 函式 GetInsertSQL 可帮您产生 Insert 语法。 另外。
例子如下:
<?php
// 引入 ADODB
includ 'adodb/adodb.inc.php' ;
// 建立联机对象
$conn = &A DONewConnect 'mysql' ;
// 侦错
$conn->debug=true;
// DSN 四项基本数据设定
$mch="localhost";
$user="root";
$pwd="jack168";
$database="test";
// 连接至数据库 test
$user,$conn->PConnect $mch. $pwd, $databas ;
// 发生一笔空记录
$sql = "select * from t where year=-1";
$r = $conn->Execut $sql ;
// 用一个空数组来装要更新的数据
$r = arrai ;
$r['name']='john';
$r['year']=28;
此 sql 命令放在 $insertSQL 中 // 用 GetInsertSQL 函式来制作一个完整的 sql 命令。
$r $insertSQL = $conn->GetInsertSQL $rs.;
// 执行拔出
$conn->Execut $insertSQL ;
$conn->Clos ;
?>
侦错讯息如下:
-----------------------------------------------------------
mysql : select * from t where year=-1
-----------------------------------------------------------
year VA LUES 'john', mysql : INSERT INTO t name. 28
-----------------------------------------------------------
9. 取出记录 ( Select
Select 用法如下:
<?php
// 引入 ADODB
includ 'adodb/adodb.inc.php' ;
// 建立联机对象
$conn = &A DONewConnect 'mysql' ;
// 不侦错
$conn->debug=false;
// DSN 四项基本数据设定
$mch="localhost";
$user="piza";
$pwd="ooo123";
$database="test";
// 连接至数据库 test
$user,$conn->PConnect $mch. $pwd, $databas ;
// 执行 Select 由表格 t 取出数据。
// 会传回一个 ADORecordSet 记录集对象 $r RecordSet
拥有目前的记录 ( row 或称 record // 实际上 $r 一个 cursor 指标。
存放在 field 这个数组之中 // 该记录的所有字段数据的内容。
第一个由 0 开始 // 以数字为索引。
$r = &$conn->Execut 'select * from t' ;
// 若 $r 为 fals 则秀出错误讯息
if !$r {
print $conn->ErrorMsg ;
} els {
即:还有记录尚未取出时 ) // 当尚未到达 记录集 $r 结束位置 ( EOF End Of File 时。
while !$rs->EOF {
$FieldCount 会传回字段总数 // 秀出所有字段。
$max=$rs->FieldCount ; $i < $max; $i++ for $i=0.{
print $rs->fields[$i] . " ";
}
// 移至下一笔记录
$rs->MoveNext ;
// 换列
echo "<br>/n";
}
}
$rs->Close ; // 可不用
$conn->Clos ; // 可不用
?>
$rs->fields[] 数组是由 PHP 数据库扩展功能发生的某些扩展功能并不支持使用字段名称当作索引。
也就是俗称的 hash 或 associ arrai 则需使用全域变量 $A DODB_FETCH_MODE 加以指定。 若欲使用名称当作索引。
以下设定:使用数字索引 $A DODB_FETCH_MODE= ADODB_FETCH_NUM;
以下设定:使用名称索引 $A DODB_FETCH_MODE= ADODB_FETCH_A SSOC;
下面是使用名称索引的例子:
<?php
// 引入 ADODB
includ 'adodb/adodb.inc.php' ;
// 建立联机对象
$conn = &A DONewConnect 'mysql' ;
// 不侦错
$conn->debug=false;
// DSN 四项基本数据设定
$mch="localhost";
$user="root";
$pwd="jack168";
$database="test";
// 连接至数据库 test
$user,$conn->PConnect $mch. $pwd, $databas ;
指定使用名称索引 // 执行 sql 之前。
$A DODB_FETCH_MODE = ADODB_FETCH_A SSOC;
// 执行 Select 会传回一个 ADORecordSet 记录集对象 $rs
拥有目前的记录内容,// 实际上 $r 一个 cursor 指标。
// 该记录存放在 field 这个数组之中
$r = &$conn->Execut 'select * from t' ;
// 若 $r 为 fals 则秀出错误讯息
if !$r {
print $conn->ErrorMsg ;
} els {
// 当尚未到达记录集结束位置 ( EOF 时。
while !$rs->EOF {
// 秀出所有字段
print $rs->fields['name'] . " " . $rs->fields['year'];
// 移至下一笔记录
$rs->MoveNext ;
// 换列
echo "<br>/n";
}
}
$rs->Close ; // 可不用
$conn->Clos ; // 可不用
?>
10. 取出记录 ( 使用 FetchRow
这里示范 FetchRow 用法:
$sql = "select * from t";
$r = $conn->Execut $sql ;
if $r {
while $ar = $rs->FetchRow {
print $ar['name'] ." " . $ar['year'];
print "<br>/n";
}
}
您可用一个 arrai 来接取。 FetchRow 会将取出的记录传回。
注意 ! 使用 FetchRow 就不必再用 MoveNext FetchRow 内部会自动完成移至下一笔记录的动作。
11. 更新记录 ( Update
您可以用传统的方式:
year=28 WHERE year=18"$sql ="UPDA TE t SET name='john'.;
$conn->Execut $sql ;
也可以用以下这种方式:
<?php
// 引入 ADODB
includ 'adodb/adodb.inc.php' ;
// 建立联机对象
$conn = &A DONewConnect 'mysql' ;
// 侦错
$conn->debug=true;
// DSN 四项基本数据设定
$mch="localhost";
$user="piza";
$pwd="ooo123";
$database="test";
// 连接至数据库 test
$user,$conn->PConnect $mch. $pwd, $databas ;
// 选择要更新的那一笔记录
$sql = "select * from t where year=18";
$r = $conn->Execut $sql ;
// 用一个空数组来装要更新的数据
$r = arrai ;
$r['name']='john';
$r['year']=28;
此 sql 命令放在 $updateSQL 中 // 用 GetUpdateSQL 函式来制作一个完整的 sql 命令。
$r $updateSQL = $conn->GetUpdateSQL $rs.;
// 执行更新
$conn->Execut $updateSQL ;
$conn->Clos ;
?>
侦错讯息如下:
-------------------------------------------------------------
mysql : select * from t where year=18
-------------------------------------------------------------
year = 28 WHERE year=1 mysql : UPDA TE t SET name = 'john'.8
-------------------------------------------------------------
12. 删除记录 ( Delet
采激进方式即可: $sql = "DELETE FROM t WHERE year=18" 删除记录很简单。;
$r = $conn->Execut $sql ;
13. 使用字段对象 ( Field Object
用以取得字段名称及字段型态: 这里示范字段对象 FetchField 用法。
$sql = "select * from t";
$r = &$conn->Execut $sql ;
if $r {
while !$rs->EOF {
// 取出第二个字段
$f = $rs->FetchField 1 ;
// 印出字段名称 及 字段型态
print $f->name . ":" . $f->type;
$rs->MoveNext ;
print "<br>/n";
}
}
ADODB 提供一个 RecordSet 函式 MetaTyp 可将原始的字段型态转成一般型态代码: 另外。
C : 字符
X : text
B : blob
D : 日期
T : timestamp
L : 布尔值或位
I : 整数
包括:自动增加、数值、浮点数、实数及整数 N : 数字型态。
R : serial 自动增加
用例:
$f = $rs->FetchField 1 ;
// 印出字段名称 及 字段型态的代码
print $f->name . ":" . $rs->MetaTyp $f->type ;
14. 简单分页 ( Pager
使用前,A DODB 提供一种简单分页显示记录的方法。要将 adodb-pager.inc.php 引入。
<?php
includ 'adodb/adodb.inc.php' ;
// 引入分页功能
includ 'adodb/adodb-pager.inc.php' ;
// 启动 session
session_start ;
$db = ADONewConnect 'mysql' ;
$mch="localhost";
$user="piza";
$pwd="ooo123";
$database="test";
$user,$db->Connect $mch. $pwd, $databas ;
$sql = "select * from t";
// 发生 pager 对象
$sql $pager = new ADODB_Pager $db.;
// 每一页秀 5 笔记录
$pager->Rend $rows_per_page=5 ;
?>
结果如下: