答案:PHP可以用最少的功夫以及最多的乐趣来建立动态的网站,要建立动态网站我们需要使用数据库来撷取登入帐号资讯、散布动态新闻、储存讨论区的文章。就以使用最通用的MySQL资料来说,你们公司已经完成了如此神奇的工作,让你们的网站比你们所能想像的还要出名。接著你们也发现MySQL无法应付实际的工作量了,是该更换数据库系统的时候了。
不幸地,在PHP中所有数据库的存取都有些微的不同。与MySQL连结你要使用 mysql_connect(),当你决定升级到Oracle或Microsoft SQL Server时,你必须分别改用ocilogon() 或 mssql_connect()。更糟糕的是不同连结所使用的参数也都不一样,有的数据库说po-tato(马铃薯的发音),别的数据库又说pota-to(马铃薯的另一个发音),喔…..天啊。
我们不要放弃
当你需要确保你程式的可携性的时候,一个叫做ADODB的数据库封包程序库已经出现了。它提供了共通的应用程序介面来跟所有支援的数据库沟通,因此你无须放弃!ADODB是Active Data Object DataBase的缩写(很抱歉!玩电脑的有时候不是很有原创性)。ADODB目前支援MySQL、PostgreSQL、Oracle、Interbase、Microsoft SQL Server、Access、FoxPro、Sybase、ODBC及ADO,你可以从 http://php.weblogs.com/adodb下载 ADODB。
MySQL的例子
PHP中最通用的数据库是MySQL,所以我想你会喜欢下面的程序代码,它连结到localhost的MySQL服务器,数据库名称是mydab,并且执行一个SQL的select命令查询,查询结果会一列列地印出来。$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我们使用面向对象的方法来管理多样数据库的复杂性,我们用不同类型(class)来控制不同数据库。假如你不熟悉面向对象程式设计,别担心!所有的复杂事情都隐藏在NewADOConnection()函数之後。
为了节省记忆体,我们只载入与你所连结数据库相关的PHP程序代码,我们透过呼叫NewADOConnection(databasedriver)来完成这件事,合法的数据库驱动程式包含mysql,mssql,oracle,oci8,postgres,sybase,vfp,access,ibase以及许多其他的驱动程式。
接著我们透过呼叫NewADOConnection(),来从连结类型产生一个新的物件实体,最後我们使用$db->Connect()来连结数据库。
执行SQL命令
$result = $db->Execute("SELECT * FROM employees");
if ($result === false) die("failed");直接传送SQL命令到服务器,当成功执行之後,Execute()将传回一个recordset物件,你可以如同上面所列来检查$result。
一个初学者容易混淆的议题是,在ADODB有两种类型的物件,连结物件以及recordset物件,我们何时用这些物件呢?
连结物件($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数据库延伸系统所产生的,有些数据库延伸系统并不会以栏位名称建立该阵列的索引,要强迫以名称排序索引该阵列,使用$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); // shows array([0]=>'v0',[1] =>'v1') print_r($rs2->fields); // shows array(['col1']=>'v0',['col2'] =>'v1')如同你所见的上面例子,两个recordset储存并使用不同的取用模式,当recordset由Execute()产生後再设定$ADODB_FETCH_MODE。
ADOConnection
连结到数据库的物件,执行SQL命令并且有一组工具函数来标准格式化SQL命令,比如关联与日期格式等命令。
其他有用的函数
$recordset->Move($pos)卷动目前的资料列,ADODB支援整个数据库往前卷动,有一些数据库并不支援往後的卷动,这倒不会是个问题,因为你能够用暂存纪录到快取来模拟往後卷动。
$recordset->RecordCount()传回SQL命令存取到的纪录笔数,有些数据库会因为不支援而传回-1。
$recordset->GetArray()以阵列的方式传回结果。
rs2html($recordset)函数将传进的recordset转为HTML的表格格式。下例中以粗体字显示相关用法:
include('adodb.inc.php'); include('tohtml.inc.php'); /* includes the rs2html function */ $conn = &ADONewConnection('mysql'); $conn->PConnect('localhost','userid','password','database'); $rs = $conn->Execute('select * from table'); rs2html($rs); /* recordset to html table */还有许多其他有用的函数列示在文件之中,可从下列网址查得 http://php.weblogs.com/adodb_manual
进阶题材
新增及更新
假设你要新增下列资料到数据库中。
ID = 3
TheDate=mktime(0,0,0,8,31,2001) /* 31st August 2001 */
Note= sugar why don't we call it off当你改用别的数据库,可能就没办法新增资料。
第一个问题是,每一个数据库各自有不同的内定日期格式,MySQL使用 YYYY-MM-DD 格式,而其他数据库则有不同的内定格式,ADODB提供DBDate()函数来转换不同数据库之间的日期内定格式。
次一个问题是单引号(don't)的表示法,在MySQL可以直接使用单引号(don't),但在其他数据库如Sybase、Access、 Microsoft SQL Server,则用两个单引号表示(don''t),qstr()函数可以解决此问题。
我们如何使用这些函数?就像这样:
$sql = "INSERT INTO table (id, thedate,note) values (" . $ID . ',' . $db->DBDate($TheDate) .',' . $db->qstr($Note).")"; $db->Execute($sql);ADODB还有$connection->