ADODB入门教程(基础文章)

时间:2024-03-01 10:05:28

1、简要说明
ADODB是PHP中的一个通用的数据库操作库,ADODB目前支持MySQL、PostgreSQL、Oracle、Interbase、Microsoft SQL Server、Access、FoxPro、Sybase、ODBC及ADO,你可以从 http://php.weblogs.com/adodb下载 ADODB。

2、安装
下载 tgz或 zip解压即可。

3、使用
使用前包含进 adodb.inc.php即可
include("$adodb_path/adodb.inc.php"); // includes the adodb library

4、函数
全局函数几乎只有一个
NewADOConnection(\'DataBaseType\');
作用:生成一个ADOdb对象。

可以的值为: (不包括括号里的内容)
access (Microsoft Access/Jet)
ado (Generic ADO, the base for all the other ADO drivers)
ado_access (Microsoft Access/Jet using ADO)
ado_mssql (Microsoft SQL Server using ADO)
db2 (DB2)
vfp (Microsoft Visual FoxPro)
fbsql (FrontBase)
ibase (Interbase 6 or before)
firebird (Firebird)
informix72 (Informix databases before Informix 7.3)
informix (Informix)
maxsql (MySQL with transaction support)
mssql (Microsoft SQL Server 7)
mssqlpo (Portable mssql driver)
mysql (MySQL without transaction support)
mysqlt (MySQL with transaction support, identical to maxmysql)
oci8 (Oracle 8/9)
oci805 (Oracle 8.0.5)
oci8po (Oracle 8/9 portable driver)
odbc (Generic ODBC, the base for all the other ODBC drivers)
odbc_mssql (MSSQL via ODBC)
odbc_oracle (Oracle via ODBC)
oracle (Oracle 7)
postgres (PostgreSQL)
postgres64 (PostgreSQL 6.4)
postgres7 (PostgreSQL 7, currently identical to postgres )
sqlanywhere (Sybase SQL Anywhere)
sybase (Sybase)


rs2html 把 RecordSet 对象转成html输出
要包含 include(\'tohtml.inc.php\');

5、对象
PHP ADODB与MS ADO 对象结构相似,
主要用到两个对象 (ADOConnection 对象与 RecordSet 对象)
ADOConnection负责数据库的连接,发送 sql 命令等;RecordSet主要是得到查询出来的记录集

6、ADOConnection 对象说明
1、建立
ADODB是用 NewADOConnection() 函数来新建一个 ADODB连接对象,如:
$db = NewADOConnection(\'$database_type\'); // A new connection
$database_type 是数据库格式,可能值看上面 第4小节。

2、连接数据库
用ADOConnection 的 Connect 方法,格式如下:
Connect("主机名","用户名","用户密码","数据库名");
返回值,连接成功返回一个 ADOConnection对象,错误返回 FALSE,可以用 ADOConnection的 ErrorMsg()函数得到错误说明.
$db->Connect("$host", "$user", "$password", "$database_name");

3、执行SQL指令
用Execute函数执行 SQL 命令 如:
$result = $db->Execute("SELECT * FROM employees");
if ($result === false) die("failed");
执行成功返回一个 Recordset 对象,否则返回 FALSE

4、Affected_Rows()函数
Affected_Rows()函数返回最后一个 sql 命令所影响到的记录行数。

5、日期格式
由于 ADODB需要支持不同的数据库系统,而这些不同的数据库可能用不同的方式来表示日期/时间格式。ADODB用 DBDate()函数来转换不同数据库之间的格式。

6、字符串格式
不同的数据库可以用不对的字符串表示格式,如\'单括号的表示方法。例:
$ID = 3
$TheDate=mktime(0,0,0,8,31,2001)
$Note= sugar why don\'t we call it off
$sql = "INSERT INTO table (id, thedate,note) values ("
. $ID . \',\'
. $db->DBDate($TheDate) .\',\'
. $db->qstr($Note).")";
$db->Execute($sql);

7、Select指令的Limit及Top支持
$connection->SelectLimit($sql,$nrows,$offset);
注意:第二个参数是需要返回的行数,第三个参数才是从第几行开始。
返回值:成功返回一个Recordset 对象,失败返回 FALSE; 对于分页时相当有用。

8、Cache缓存
CacheExecute 与 CacheSelectLimit 函数。
第一个参数为超时时间,秒数。
ADODB允许你在你的档案系统中暂存recordset的数据,并且在$connection->CacheExecute($secs2cache,$sql)及 $connection->CacheSelectLimit($secs2cache,$sql,$nrows,$offset)等设定的时间间隔到达之后,才真正去做数据库的查询以节省时间。
可以用 $ADODB_CACHE_DIR 来指定 Cache 目录,好象要用绝对路径。但超时过后,PHP不能自动删除cache,要人工手动删除。

9、事务
StartTrans() 开始事务
CompleteTrans() 结束事务 ADODB 自动处理事务的提交与回滚
HasFailedTrans() 事务是否成功 TRUE 成功,FALSE为失败
大多数数据库直持事务,但MySQL InnoDB表支持事务,而MyISAM表不支持。

10、SetFetchMode
设置 Recordset 对象的记录集索引方式。如:
$db->SetFetchMode(ADODB_FETCH_ASSOC); // Return associative array
ADODB_FETCH_NUM; 以数字方式索引

12、GetInsertSQL , GetUpdateSQL
生成一个 Insert SQL , 有两个参数,第一个是一个 RecordSet 第二个是一个数组。 例如:

$sql = "SELECT * FROM ADOXYZ WHERE id = -1"; # 从资料库中查询出一个空的资料集
$conn = &ADONewConnection("mysql"); # 建立一个连结
$conn->debug=1;
$conn->PConnect("localhost", "admin", "", "test"); # 连结到 MySQL, 资料库名称为 test

$rs = $conn->Execute($sql); # 执行查询,并取得一个空的资料集

$record = array(); # 初始化一个阵列,以便存放记录资料供新增用

# 设定记录中的栏位值
$record["firstname"] = "Bob";
$record["lastname"] = "Smith";
$record["created"] = time();

# 传入空的资料集及栏位资料阵列到GetInsertSQL函数中,以执行功能
# 这个函数将会依传入的资料,回传一个全格式的 INSERT SQL指令

$insertSQL = $conn->GetInsertSQL($rs, $record);

$conn->Execute($insertSQL); # 将记录挿入资料库中

#==========================
# 以下的程式码测试更新状态

$sql = "SELECT * FROM ADOXYZ WHERE id = 1";
# 选择一笔记录以便更新

$rs = $conn->Execute($sql); # 执行这个查询,并取得一个存在的记录来更新

$record = array(); # 初始化一个阵列,以存放要更新的资料

# 设定栏位里的值
$record["firstname"] = "Caroline";
$record["lastname"] = "Smith"; # 更新 Caroline的姓由 Miranda 变成 Smith

# 传入这个只有单一记录的资料集以及含有资料的阵列到 GetUpdateSQL函数里
# 函数将会回传一个具有正确 WHERE 条件的 UPDATE(更新) SQL 指令
$updateSQL = $conn->GetUpdateSQL($rs, $record);

$conn->Execute($updateSQL); # 更新资料库中的记录
$conn->Close();

13、PageExecute 分页查询
如:PageExecute($sql, $num_of_rows_per_page, $curr_page);
可能用到的属性 AtFirstPage() , AtLastPage(),AbsolutePage()



7、Recordset 对象
1、Move($Pos)
卷动目前的数据列,ADODB支持整个数据库往前卷动,有一些数据库并不支持往后的卷动,这倒不会是个问题,因为你能够用暂存纪录到快取来仿真往后卷动。

2、RecordCount() 或 RowCount()
传回SQL指令存取到的纪录笔数,有些数据库会因为不支持而传回-1

3、EOF
是否为记录尾

4、fields
用以获取记录集的值,用法,$rs->fields[编号或字段名],如果$db->SetFetchMode(ADODB_FETCH_ASSOC); 则可以用字段名直接访问。

5、MoveNext()
记录指针下移一个。

6、MoveFirst
记录指针移动在开头。

7、FetchNextObject()
得到一个行对象,且指针自动下移。如:
$row = $rs->FetchNextObject();
echo($row->UserName . $row->Age );

8、Insert_ID
得到记录集最后一次插入的值。

9、MetaTypes
得到字段的类型。如:
$fld = $recordSet->FetchField(1);
$type = $recordSet->MetaType($fld->type);
if ( $type == \'D\' || $type == \'T\') {.....};
可能的值与意义:
C: character 栏位,应该使用 <input type="text"> 标记来取值。
X: 文字栏位(Text) , 长文字栏位,使用 <textarea> 标记来显示资料。
B: Blob 栏位或者大型的二位元物件(像程式,图档等)。
D: 日期栏位
T: 时间栏位
L: 逻辑栏位(真假值)或位元栏位
N: 数字栏位,包含自动进位、编号、整数、浮点数、实数等。
R: 序列栏位,包含了序列、自动增进整数,只对被选择的资料库作用。

10、FetchField
得到一个字段对象 如:
$field = $rs->FetchField();
field对象有三个属性 name 、type 、length 分别的意义为(名称、类型、长度,长度可能传回-1)
而 type 可以通过 MetaTypes 转换成字符格式,如:
$fld = $recordSet->FetchField(1);
$type = $recordSet->MetaType($fld->type);
if ( $type == \'D\' || $type == \'T\') {.....};