You say eether and I say eyether,
You say neether and I say nyther;
Eether, eyether, neether, nyther -
Let's call the whole thing off !
You like potato and I like po-tah-to,
You like tomato and I like to-mah-to;
Potato, po-tah-to, tomato, to-mah-to -
Let's call the whole thing off !
我喜欢这首歌,尤其是Louis Armstrong 和Ella二重唱的版本。这首歌说的是恋
爱中的两个人要和谐相处是多么难。它说的也是一种妥协和寻找共同点。这也是这篇
文章所要说的。
使用PHP创建动态Web站点,你将有最少的烦恼和最多的乐趣。创建这些Web站点的
时候,我们需要使用数据库来获取登录信息,在网页上发布动态新闻和保存论坛帖子。
因此我们会说我们正在使用流行的MySQL数据库来完成这些工作。然而你的公司做了一
项如此不可思议的工作,以至于你们公司的网站受欢迎的程度远大于你当初最大胆的
估计。你发现MySQL无法扩展到能处理如此大的工作量,是该更换数据库的时候了。
不幸的是在PHP中访问不同数据库的方式都稍有不同。要连接到MySQL,你要使用
mysql_connect(); 当你决定升级到Oracle或者Microsoft SQL Server时,你要分别
使用ocilogon()和 mssql_connect();更糟糕的是你在不同连接函数里使用的参数也
各不相同…….一个数据库说po-tato,另一个数据库说pota-to.哦-哦。
让我们不要放弃整个工作当你需要保证可移植性的时候,一种像ADODB这样的数据库包装库(database wrapper library)
已经出现了。它提供统一的API来和任何它支持的数据库进行连接,因此你不必放弃整
个移植升级工作。
ADODB 代表 Active Data Objects DataBase (不好意思,计算机小子有时也不是
十分有创意). ADODB 目前支持 MySQL, PostgreSQL, Oracle, Interbase, Microsoft
SQL Server, Access, FoxPro, Sybase, ODBC 和 ADO. 你可以从[/url][url=http://php.weblogs.com/adodb]http://php.weblogs.com/adodb.
下载ADODB
MySQL 例子和PHP一起使用的最常见的数据库是MySQL, 因此我猜你应该很熟悉下面的代码。它连
接到位于localhost的MySQL服务器上的mydb数据库,并执行一条SQL查询声明。查询
结果将打印出来,查询结果中每条记录显示成一行。
$db = mysql_connect("localhost", "root", "password");
mysql_select_db("mydb",$db);
$result = mysql_query("SELECT * FROM employees",$db);
if ($result === false) die("failed");
while ($fields = mysql_fetch_row($result)) {
for ($i=0, $max=sizeof($fields); $i < $max; $i++) {
print $fields[$i].' ';
}
print "<br>\n";
}
上面的代码分段设置了颜色。第一段是连接阶段。第二段是SQL的执行。最后一段
显示字段值。while 循环扫描结果中的每一行,而for 循环扫描每一列的各个字段。
下面是在ADODB里有同样作用的代码:
include("adodb.inc.php");
$db = NewADOConnection('mysql');
$db->Connect("localhost", "root", "password", "mydb");
$result = $db->Execute("SELECT * FROM employees");
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";
}
现在改成要连接到Oracle数据库只需简单的把第二行改为NewADOConnection('oracle')
就可以了。让我们仔细看看这段代码…
连接到数据库include("adodb.inc.php");
$db = NewADOConnection('mysql');
$db->Connect("localhost", "root", "password", "mydb");
这段连接代码比MySQL的那段更精致一些。在ADODB中,我们使用面向对象的方法来管理
连接多种数据库的复杂性。我们有不同的类来处理不同的数据库。如果你不熟悉面向对
象编程,不要急-所有这些复杂操作都被隐藏在NewADOConnection()函数里了。
为了节省内存,我们只加载你要连接的特定数据库的PHP代码. 我们通过调用
NewADOConnection(databasedriver)函数来实现这个功能. 合法的数据库驱动包括
mysql, mssql, oracle, oci8, postgres, sybase, vfp, access, ibase 和其它等等。
这样我们通过调用NewADOConnection()创建connection类的一个新的实例。最后我们用
$db->Connect()来连接数据库.
执行SQL语句$result = $db->Execute("SELECT * FROM employees");
if ($result === false) die("failed");
这将向服务器发送一个SQL声明。如果执行成功Execute()将返回一个recordset对象。
你应该像上面那样检查$result .
可能把初学者弄糊涂的问题是在ADODB里有两类对象,connection对象和recordset
对象。我们分别在什么时候用它们呢?
connection 对象($db) 负责连接到数据库,格式化你的SQL语句,并向数据库发出查询
请求。Recordset对象($result)负责获取结果,并将响应转化为文本或者一个数组。
我需要补充的唯一一点是:ADODB提供许多辅助函数,使得使用INSERT和UPDATE声明更
简单。这些辅助函数会在高级部分提到。
获取数据while (!$result->EOF) {
for ($i=0, $max=$result->FieldCount(); $i < $max; $i++)
print $result->fields[$i].' ';
$result->MoveNext();
print "<br>\n";
}
得到数据的范例像是在读取一个文件。对于每一行,我们首先检查是否读到了文件末
尾(EOF)。如果未读到文件末尾,循环读取每一行的各个字段。然后转到下一行
(MoveNext),重复上面的操作。
$result->fields[] 数组由PHP数据库扩展(extensions)生成。 一些数据库扩展不
支持使用字段名称作为字段索引。要强制使用名称索引―也就是联合数组―要使用
$ADODB_FETCH_MODE 全局变量。
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$rs1 = $db->Execute('select * from table');
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
$rs2 = $db->Execute('select * from table');
print_r($rs1->fields); // 显示 数组([0]=>'v0',[1] =>'v1')
print_r($rs2->fields); // 显示 数组(['col1']=>'v0',['col2'] =>'v1')
就像你在上面的例子里看到的那样,当Execute()创建recordset的时候,两个
recordset对象都存储和使用了基于$ADODB_FETCH_MODE设置的不同获取模式。
ADOConnectionADODB对象,用来建立数据库连接,执行SQL声明,并具有一系列能使针对连接和日期
格式之类问题的SQL语句格式标准化的功能函数。
其它有用的函数$recordset->Move($pos) 转到指定行. ADODB 支持所有数据库的向前移动
(forward scrolling)。一些数据库不支持向后移动(backwards scrolling)。
通常情况下这没什么关系,因为你总是可以通过缓存记录来模拟向后移动。
$recordset->RecordCount() 返回SQL声明选取的记录数。一些数据库会返回-1
因为它不支持这项操作。
$recordset->GetArray() 以数组形式返回结果.
rs2html($recordset) 是一个函数,它根据传给它的$recordset 生成一个HTML表格.
一个例子(相应行用粗体标识):
include('adodb.inc.php');
include('tohtml.inc.php'); /* 将 rs2html 函数包含进来 */
$conn = &ADONewConnection('mysql');
$conn->PConnect('localhost','userid','password','database');
$rs = $conn->Execute('select * from table');
rs2html($rs); /*根据 recordset 生成html表格 */
http://php.weblogs.com/adodb_manual上的文档里列出许多其它辅助函数。