$db = [b]mysql_connect[/b]("localhost", "root", "password");
[b]mysql_select_db[/b]("mydb",$db);
$result = [b]mysql_query[/b]("SELECT * FROM employees",$db)[code];
if ($result === false) die("failed");[/code]
[b]while[/b] ($fields =[b] mysql_fetch_row[/b]($result)) {
[b]for[/b] ($i=0, $max=sizeof($fields); $i < $max; $i++) {
[b]print[/b] $fields[$i].' ';
}
[b]print[/b] "<br>n";
}
上列的程序代码用颜色标出分段,第一段是连结的部分,第二段是执行SQL命令,最後一段则是显示栏位,while回圈扫描结果的每一列,而for回圈扫描到每列的栏位。
接下来是以ADODB的程序代码得到同样的结果:
[b] include("adodb.inc.php");[/b]
$db = [b]NewADOConnection[/b]('mysql');
$db->[b]Connect[/b]("localhost", "root", "password", "mydb");
$result = $db->[b]Execute[/b]("SELECT * FROM employees");
[code]if ($result === false) die("failed");[/code]
[b]while[/b] (!$result->EOF) {
[b]for[/b] ($i=0, $max=$result->[b]FieldCount[/b](); $i < $max; $i++)
[b]print[/b] $result->fields[$i].' ';
$result->[b]MoveNext[/b]();
[b]print[/b] "<br>n";
}
现在改成指向Oracle数据库,程序代码只要修改第二行成为 NewADOConnection('oracle'),让我们看一下完整的程序代码...
[b]与数据库连结[/b]
[b]include("adodb.inc.php");[/b]
$db = [b]NewADOConnection[/b]('mysql');
$db->[b]Connect[/b]("localhost", "root", "password", "mydb");
连结的程序代码比起原来MySQL的程序代码有老练一些,因为我们正是需要更老练些。在ADODB我们使用面向对象的方法来管理多样数据库的复杂性,我们用不同类型(class)来控制不同数据库。假如你不熟悉面向对象程式设计,别担心!所有的复杂事情都隐藏在NewADOConnection()函数之後。
为了节省记忆体,我们只载入与你所连结数据库相关的PHP程序代码,我们透过呼叫NewADOConnection(databasedriver)来完成这件事,合法的数据库驱动程式包含mysql,mssql,oracle,oci8,postgres,sybase,vfp,access,ibase以及许多其他的驱动程式。
接著我们透过呼叫NewADOConnection(),来从连结类型产生一个新的物件实体,最後我们使用$db->Connect()来连结数据库。
[b]执行SQL命令[/b]
[code]
$result = $db->[b]Execute[/b]("SELECT * FROM employees");
if ($result === false) die("failed");
[/code]
直接传送SQL命令到服务器,当成功执行之後,Execute()将传回一个recordset物件,你可以如同上面所列来检查$result。
一个初学者容易混淆的议题是,在ADODB有两种类型的物件,连结物件以及recordset物件,我们何时用这些物件呢?
连结物件($db)是负责连结数据库,格式化你的SQL查询。而recordset物件($result)则是负责撷取结果并将回应资料规格化成文字或阵列。
唯一我需要增加的事情是,ADODB提供许多有用的函数来让INSERT及UPDATE命令更容易些,这点我们在进阶的章节会提到。
[b]撷取资料[/b]
[b]while[/b] (!$result->EOF) {
[b]for[/b] ($i=0, $max=$result->[b]FieldCount[/b](); $i < $max; $i++)
[b]print[/b] $result->fields[$i].' ';
$result->[b]MoveNext[/b]();
[b]print[/b] "<br>n";
}
前面取得资料的范例很像从档案读资料,在每一行我们首先检查是否到了档案的结尾(EOF),若还没到结尾,回圈扫过每列中的栏位,然後移到下一行(MoveNext)接著重复同样的事情。
$result->fields[]阵列是由PHP数据库延伸系统所产生的,有些数据库延伸系统并不会以栏位名称建立该阵列的索引,要强迫以名称排序索引该阵列,使用$ADODB_FETCH_MODE的通用变数。
$[b]ADODB_FETCH_MODE[/b] = ADODB_FETCH_NUM;
$rs1 = $db->Execute('select * from table');
$[b]ADODB_FETCH_MODE[/b] = ADODB_FETCH_ASSOC;
$rs2 = $db->Execute('select * from table');
print_r($rs1->fields); // shows [i]array([0]=>'v0',[1] =>'v1')[/i]
print_r($rs2->fields); // shows [i]array(['col1']=>'v0',['col2'] =>'v1')[/i]
如同你所见的上面例子,两个recordset储存并使用不同的取用模式,当recordset由Execute()产生後再设定$ADODB_FETCH_MODE。
[b]ADOConnection[/b]
连结到数据库的物件,执行SQL命令并且有一组工具函数来标准格式化SQL命令,比如关联与日期格式等命令。
[b]其他有用的函数[/b]
$recordset->Move($pos)卷动目前的资料列,ADODB支援整个数据库往前卷动,有一些数据库并不支援往後的卷动,这倒不会是个问题,因为你能够用暂存纪录到快取来模拟往後卷动。
$recordset->RecordCount()传回SQL命令存取到的纪录笔数,有些数据库会因为不支援而传回-1。
$recordset->GetArray()以阵列的方式传回结果。
rs2html($recordset)函数将传进的recordset转为HTML的表格格式。下例中以粗体字显示相关用法:
include('adodb.inc.php');
[b]include('tohtml.inc.php');[/b] /* includes the rs2html function */
$conn = &ADONewConnection('mysql');
$conn->PConnect('localhost','userid','password','database');
$rs = $conn->Execute('select * from table');
[b] rs2html($rs)[/b]; /* recordset to html table */
还有许多其他有用的函数列示在文件之中,可从下列网址查得 [url=http://php.weblogs.com/adodb_manual]http://php.weblogs.com/adodb_manual[/url]
[b]进阶题材[/b]
[b]新增及更新[/b]
假设你要新增下列资料到数据库中。
[b]ID[/b] = 3
[b]TheDate[/b]=mktime(0,0,0,8,31,2001) /* 31st August 2001 */
[b]Note[/b]= sugar why don't we call it off
当你改用别的数据库,可能就没办法新增资料。
第一个问题是,每一个数据库各自有不同的内定日期格式,MySQL使用 YYYY-MM-DD 格式,而其他数据库则有不同的内定格式,ADODB提供DBDate()函数来转换不同数据库之间的日期内定格式。
次一个问题是单引号[b](don't)[/b]的表示法,在MySQL可以直接使用单引号[b](don't)[/b],但在其他数据库如Sybase、Access、 Microsoft SQL Server,则用两个单引号表示[b](don''t)[/b],qstr()函数可以解决此问题。
我们如何使用这些函数?就像这样:
$sql = "INSERT INTO table (id, thedate,note) values ("
. $[b]ID[/b] . ','
. $db->DBDate($[b]TheDate[/b]) .','
. $db->qstr($[b]Note[/b]).")";
$db->Execute($sql);
ADODB还有$connection->Affected_Rows()函数,传回受最後update或delete命令影响的资料列数,及$recordset->Insert_ID()函数,传回最後因insert命令而自动产生的资料列编号,预先提醒大家,没有任何数据库有提供这两个函数。
[b]MetaTypes[/b]
你可以得到关於栏位的更多资讯,透过recordset的方法FetchField($fieldoffset)传回物件的3个属性:name,type,max_length。
举例说明:
$recordset = $conn->Execute("select adate from table");
$f0 = $recordset->FetchField(0);
结果$f0->name的内容是'adata',$f0->type将是'date',假如max_length不知道,其内容将会是-1。
处理不同数据库的一个问题是,每一个数据库对於相同的资料型态会有不同的称呼,比如timestamp型态在某数据库中称为datetime,而另一个数据库则称为time,所以ADODB提供MetaType($type,$max_length)函数来标准化下列的资料型态:
C: character and varchar types
X: text or long character (eg. more than 255 bytes wide).
B: blob or binary image
D: date
T: timestamp
L: logical (boolean)
I: integer
N: numeric (float, double, money)
在前面的例子中,
[code]
[/code]$recordset = $conn->Execute("select adate from table");
$f0 = $recordset->FetchField(0);
$type = $recordset->MetaType($f0->type, $f0->max_length);
print $type; /* should print 'D' */
[b]Select命令的Limit及Top支援[/b]
ADODB有个$connection->SelectLimit($sql,$nrows,$offset)函数让你撷取recordset的部分集合,这是采用Microsoft产品中的SELECT TOP用法,及PostgreSQL与MySQL中的SELECT...LIMIT用法的优点,即使原来的数据库并没有提供此用法,本函数也模拟提供该使用方式。
[b]快取支援[/b]
ADODB允许你在你的档案系统中暂存recordset的资料,并且在$connection->CacheExecute($secs2cache,$sql)及 $connection->CacheSelectLimit($secs2cache,$sql,$nrows,$offset)等设定的时间间隔到达之後,才真正去做数据库的查询以节省时间。
[b]PHP4 Session支援[/b]
ADODB也支援PHP4 session handler,你可以存放你的session变数在数据库中,相关功能讯息请参考 [url=http://php.weblogs.com/adodb-sessions]http://php.weblogs.com/adodb-sessions[/url]
[b]鼓励商业使用[/b]
假如你计划写商用的PHP应用软体来销售,你也可以使用ADODB,我们依据GPL来出版ADODB,也就是说你可以合法地在商用应用软体中引用,并保有你程序代码的所有权。强烈地鼓励ADODB的商业应用,我们自己内部也正以这个理由如此使用中。
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有