分享
 
 
 

指南:从MySQL转向ADODB(1)

王朝mysql·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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上的文档里列出许多其它辅助函数。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有