php中adodb类库介绍

php中adodb类库介绍

ID:37081085

大小:47.51 KB

页数:10页

时间:2019-05-17

上传者:山楂树
php中adodb类库介绍_第1页
php中adodb类库介绍_第2页
php中adodb类库介绍_第3页
php中adodb类库介绍_第4页
php中adodb类库介绍_第5页
资源描述:

《php中adodb类库介绍》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

PHP&MySQL编程PHP中ADOdb类库介绍PHP中ADOdb类库介绍作者:Gilfillan翻译:LuciferStar 来源:超越PHP为什么要使用数据库类库?初学者(甚至一些非初学者)常常犯的错误,就是在开发应用程序的时候,缺乏对未来的考虑。假如有一天,你的程序需要使用其它的数据库,难道你还需要重新写一篇针对于这个版本数据库的程序吗?这不是不可能发生的,尤其是当目前的数据库可能不适合你当前的需要的时候。但是当你做这一切的时候,你会发现绝非你想像的那样容易:每一个DBMS有不同的函数。举例来说:在Mysql中连接数据库的函数为mysql_connect(),而在MSSQL却是mssql_connect()。重新查看你所有的代码,然后修改所有操作数据库的函数和查询语法,这绝不是一项简单的工作。程序会经常的被捆绑到了错误的数据库上,以至无法在运行时达到最优性能。数据库类库就是这样产生的。它允许你通过同样的代码来操作不同的数据库。一个设计良好的数据库类库可以完美的改变这一切。它允许你通过极小的修改,就能转接到其他数据库:无论你要连接什么数据库管理系统,只要使用同一个的函数,和不同的参数。举例来说,在ADOdb中,只需简单地将$db=NewADOConnection('access')修改为$db=NewADOConnection('mysql'),这样,你就轻松的把你的程序从Access数据库转移到了Mysql数据库中。现在网络上已经有了很多这样的数据库类库,比如Pear,PHPlib,我也已经在工作中使用它们了,也许你也曾经用过。但本文仅将重点放在我所特别关注的ADOdb。本文我只简要地作一个介绍,使你能够马上运用它来开发你的下一个项目。以后的文章中我们将会循序渐进的对它进入更深入的了解。目前,ADOdb支持的数据库包括MySQL,PostgreSQL,Interbase,Firebird,Informix,Oracle,MSSQL7,Foxpro,Access,ADO,Sybase,FrontBase,DB2和genericODBC。ADOdb的安装安装ADOdb是一件极期容易的事,相信聪明的你一定不会感到吃力。首先,确定你正在运行的PHP是4.0.4版或更新版。如果不是,我强列建议你升级!从PHPEverywhere站点下载.zip或.tgz文件,解压缩到你所选的路径下。这个路径不应在网页目录(WWWTREE,译者注:如果你的网页是在/www/下,那么,这个目录就不应为/www/here)下!虽然ADOdb的包含文件已经使用了.inc.php的扩展名,使得服务器即使是在最糟糕的配置下,也不会将这些.inc文件通过明文方式在浏览器中显示出来,但是我们向来不提倡将库函数文件放在网页目录下的行为。然后把下载下来的文件运行:tar-zxvfadodb350.tgz解压,在Windows下你可以使用一个你喜欢的解压软件来操作,这样,你会得到一个adodb的目录其下包括了许多子目录。测试你的安装第10页共10页 PHP&MySQL编程PHP中ADOdb类库介绍好了,让我们来测试一下你的安装吧。通过在脚本中添加下列三行代码来测试你的安装是否成功。注意要把代码中的参数修改成你自己的。include("$adodb_path/adodb.inc.php");//includestheadodblibrary$db=NewADOConnection('$database_type');//Anewconnection$db->Connect("$host","$user","$password","$database_name");现在你已经拥有一个数据库连接对象$db了。你也可以使用ADONewConnection来替换NewADOConnection——这两个是同一函数的不同的名字。连接的数据库变量$database_type需要针对你的实际情况改成你所需要的。可以使用以下列表中的一个(括号内的为描述部分,不要在代码中使用):·access(MicrosoftAccess/Jet)·ado(GenericADO,thebaseforalltheotherADOdrivers)·ado_access(MicrosoftAccess/JetusingADO)·ado_mssql(MicrosoftSQLServerusingADO)·db2(DB2)·vfp(MicrosoftVisualFoxPro)·fbsql(FrontBase)·ibase(Interbase6orbefore)·firebird(Firebird)·informix72(InformixdatabasesbeforeInformix7.3)·informix(Informix)·maxsql(MySQLwithtransactionsupport)·mssql(MicrosoftSQLServer7)·mssqlpo(Portablemssqldriver)·mysql(MySQLwithouttransactionsupport)·mysqlt(MySQLwithtransactionsupport,identicaltomaxmysql)·oci8(Oracle8/9)·oci805(Oracle8.0.5)·oci8po(Oracle8/9portabledriver)·odbc(GenericODBC,thebaseforalltheotherODBCdrivers)·odbc_mssql(MSSQLviaODBC)·odbc_oracle(OracleviaODBC)·oracle(Oracle7)·postgres(PostgreSQL)·postgres64(PostgreSQL6.4)·postgres7(PostgreSQL7,currentlyidenticaltopostgres)·sqlanywhere(SybaseSQLAnywhere)·sybase(Sybase)如果你的链接代码出现了错误的提示,那么你首先要检查的地方就是在路径或连接的变量上。在你责备ADOdb第10页共10页 PHP&MySQL编程PHP中ADOdb类库介绍之前,请确定你是已经正确的使用那些变量。(很多朋友常花太多时间去修正这些显而易见的错误。)如果连接没有任何错误提示,那么我们现在已经可以在我们的项目中来使用ADodb了。通过你的脚本连接到数据库把上边的代码加入到你的代码前,让我们先退一步。我们最好能把上边的代码用我们自己的方法来封装起来。这样可以使你的程序变得更灵活、更具移植性。如果你直接把上面的代码插入到你的项目的每个文件中,如果将来项目的路径改变了,将会很容易产生错误,如果你的密码改变了,你可能需要对你所有的脚本进行修改,这样将会影响我们使用库函数的初衷。并且,因为你的密码信息是在WEBTREE下的,这将产生隐患。我推荐将密码信息放在一个独立的包含文件中,比如在ADOdb安装目录下的某个地方。如果你要在其他服务器上运行你的程序时,你就不能保证目录结构会是相同的,所以,你要确保这个路径是正确的。我建议使用PHP的自动包含功能来自动地包含这个文件。include("$adodb_path/db_values.inc.php");include("$adodb_path/adodb.inc.php");$db=NewADOConnection('$database_type');$db->Connect("$host","$user","$password","employees"); 如果你也想要使用持久连接,不是每次创造一个新的连接(这使许多WEB应用程序得到了加速,但是要注意有些数据库是不支持的)。可以使用PConnect替换掉Connect。文件db_values.inc.php是我们的数据库信息文件,内容为(你需要把下面代码中的变量改成你自己的):你可以在php.ini配置中设定自动包含我们的配置文件,具体操作可以修改PHP.ini的下述行:;AutomaticallyaddfilesbeforeorafteranyPHPdocument.auto_prepend_file=/usr/local/build/apache/www/tool_lib/defaults.incauto_append_file= 文件defaults.inc包含了$adbdb_path的值: 还有其他方式来实现它,但是我发现这种方法在移植时,可以相对地减少复杂度。从一个数据库中进行选择(SELECT)操作当同时使用开发良好的库函数,和PHP自身提供的函数时,可以有多种方法来访问数据库。用什么方法,完全取决于你自己的喜好。这里是一个简单的例子:$sql="SELECTsurname,ageFROMemployees";$rs=&$db->Execute($sql);if(!$rs){print$db->ErrorMsg();//Displaystheerrormessageifnoresultscouldbereturned}else{while(!$rs->EOF){ print$rs->fields[0].''.$rs->fields[1].'
';  //fields[0]issurname,fields[1]isage $rs->MoveNext(); // Movestothenextrow}} 在上例中,$rs->fields是一个包含返回值的数组。数组索引被赋予了初始的数字,你也可以按下面的方法来指定其索引:$sql="SELECTsurname,ageFROMemployees";$db->SetFetchMode(ADODB_FETCH_ASSOC);//Returnassociativearray$rs=&$db->Execute($sql);if(!$rs){print$db->ErrorMsg();//Displaystheerrormessageifnoresultscouldbereturned}else{while(!$rs->EOF){ print$rs->fields['surname']."".$rs->fields['age']."
"; $rs->MoveNext(); // Movestothenextrow} //endwhile}//endelse 对结果浏览的另一个可选的方法是将每条记录作为一个对象返回。ADOdb有一个FetchNextObject()的函数来实现这一功能,指针会自动地移到下一条记录。第10页共10页 PHP&MySQL编程PHP中ADOdb类库介绍$sql="SELECTsurname,ageFROMemployees";$db->SetFetchMode(ADODB_FETCH_ASSOC);//Returnassociativearray$rs=&$db->Execute($sql);if(!$rs){print$db->ErrorMsg();//Displaystheerrormessageifnoresultscouldbereturned}//loopthroughresultswhile($row=$rs->FetchNextObject()){//Thefieldnamesneedtobeuppercaseprint$row->SURNAME."".$row->AGE."
";} 插入、更新记录基本的INSERT操作方便、快捷,拥有与SELECT一样的语法。$sql="INSERTINTOemployees(surname,age)values('Clegg','43')";if(!($db->Execute($sql))){ print'Errorinserting:'.$db->ErrorMsg().'
';} 库函数真正的优点,在于它允许你通过相同的语法将记录放入不同的数据库之内,这在以前是绝对不可能的。通常有两种发生的情形。第一种,引号。所有的引号需要用脱字符(即`符号,键位在Tab键的上边)代替,否则会引起语法错误。但是一些数据库使用一个单引号,另外一些则使用两个单引号。所以,你应当使用ADOdb中的qstr()而不是PHP中的addslashes()。这样,返回值就将与你所使用的数据库相吻合了。第二种,日期。许多数据库接受跟他们的日期类型不一致的、不兼容的格式。ADOdb有一个DBDate()函数,可以将Unix的timestamp,或ISO(Y-m-d)格式转换成任意格式,以此来满足你的数据库的需求。见下例:$employee_surname=$db->qstr("d'Angelo");$arrival_time=$db->DBDate(time());//Theabovetwofunctionsalsoaddtheenclosingquotes,so,$arrival_time,not'$arrival_time'$sql="INSERTINTOemployee_arrival(arrival_time,surname)values($arrival_time,$employee_surname)";if(!($db->Execute($sql))){ print'Errorinserting:'.$db->ErrorMsg().'
';} 第10页共10页 PHP&MySQL编程PHP中ADOdb类库介绍你可以以完全相同的方式更新数据库,举例来说:$sql="UPDATEemployeesSETage='44'WHEREid='121')";if(!($db->Execute($sql))){ print'Errorupdating:'.$db->ErrorMsg().'
';} 以上仅仅是Adodb的一些基本操作——下次我们将会关注一些ADOdb提供的比较深层次的东西。如果我已经使你胃口大开,而且你已经不能再等待,我建议你去PHPEverywhere看一下,这个站点是ADOdb的专业站点,里面有很多有用的帮助信息。对查询进行缓存上个月,我们简单地了解了ADOdb中,如何进行SELECT、INSERT和UPDATE的操作。如果你在ADOdb上是个新手,我建议先读一下上个月的那篇文章。ADOdb还有很多更高级的特征,这个月,我们就一起来关注其中的部分内容。数据库时常会成为应用程序效率低下的祸首。尽量减少对数据库的查询,是提高执行效率的方法之一。这,通常可以通过对整页内容进行缓存(有很多种方法来实现。比如,PEAR->Cache),或者,如果你需要做一张动态页面,并且只想让查询指令被缓存,那么,你可以使用ADOdb,简单地将查询指令缓存起来。在你视图通过缓存来提高你的应用程序的糟糕性能之前,我建议你先试图去优化你的查询指令。有时候,一些简单的索引可以改变一切——有太多的所谓的专业的解决方案,都在使用糟糕的索引。在本文中,你能找到很多这样的实例。现在,让我们来看看ADOdb是如何使你能够对数据库的查询结果进行缓存的。在这个实例中,ADOdb把我们的最后的一次查询的结果保存在/var/tmp/adodb_cache这个缓存文件中,并保留10分钟。include("$adodb_path/db_values.inc.php");include("$adodb_path/adodb.inc.php");$db=NewADOConnection('$database_type');$db->Connect("$host","$user","$password","employees");$ADODB_CACHE_DIR="/var/tmp/adodb_cache";//Directorytostorecachedfiles$sql="SELECTsurname,ageFROMemployees";$rs=&$db->CacheExecute(600,$sql); //Executes,andcachestheresultsfor600secondsif(!$rs){ print$db->ErrorMsg();//Displaystheerrormessageifnoresultscouldbe第10页共10页 PHP&MySQL编程PHP中ADOdb类库介绍returned}else{ while(!$rs->EOF){  print$rs->fields[0].''.$rs->fields[1].'
';  //fields[0]issurname,fields[1]isage  $rs->MoveNext(); // Movestothenextrow } //endwhile}//endelseCacheExecute()函数有两个参数:第一个参数是缓存文件将被保留的时间,以秒计时;第二个参数是SQL声明。第一个参数是可选择的(一些开发者或许会认为它应当成为第二个参数),如果你没有限定时间,那么,默认值是3600秒,也就是1个小时。缓存文件被命名为adodb_*.cache,你可以在文件系统中安全地将他们删除。你应该定期清楚过期的缓存文件(用UNIX的“crontab万年历”,或者WINDOWS的“计划任务”。译者注:万年历不知有没有译错,我没有UNIX。)。要注意的是,要使用缓存方法,你需要将PHP的参数magic_quotes_runtime设为off(译者注:在php.ini中,将值设为0)。你可以根据需要,在运行时修改它的值:set_magic_quotes_runtime(0);只需将上述代码放到你调用数据库的指令之前就可以了。你可以在任何时候,通过调用CacheFlush();来清除缓存。处于对安全的考虑,ADOdb也建议将PHP的参数register_globals设为0(在PHP最新版中,这是默认值)。更多关于查询结果的信息开发者通常会对他们的要得到的结果产生一些质疑,最通常的问题是:有多少个记录?ADOdb能够很容易地通过RecordCount()来回答这个问题。RowCount()是同义函数。$sql="SELECTsurname,ageFROMemployees";$rs=&$db->CacheExecute(600,$sql); //Executes,andcachestheresultsfor600secondsprint$rs->RecordCount()."rowsreturned]";//Displaynumberofrowsreturned或许第二个问题会产生在需量列表上:被返回字段数量是多少?不用担心,ADOdb有FieldCount()。第10页共10页 PHP&MySQL编程PHP中ADOdb类库介绍$sql="SELECTsurname,ageFROMemployees";$rs=&$db->CacheExecute(600,$sql); //Executes,andcachestheresultsfor600secondsprint$rs->FieldCount()."columnsreturned]";//Displaynumberofrowsreturned限制结果上次我们讨论了如何通过使用一个数据库库函数使你的应用程序更简洁,更易于移植。在从MySQL转移到Informix中,我经历了一次痛苦的移植过程。一切都归咎于非ANSII标准的LIMIT子句(举例来说,在MySQL中允许下列指令:SELECTnameFROMemployeeLIMIT15),它是一个非常有用的功能,可在Informix中却不被支持。(在Informix中,相同功能的书写应该是:SELECTFIRST15nameFROMemployeeinInformix。)它似乎对你敲响了警钟,要你停止在你的查询中使用非标准SQL的指令,而去认真地学习标准的SQL。幸运的是,ADOdb有一个处理LIMIT的方法:SelectLimit()。$sql="SELECTsurname,ageFROMemployees";$rs=&$db->SelectLimit($sql,10,100);//Select10rows,startingatrow100if(!$rs){ print$db->ErrorMsg();//Displaystheerrormessageifnoresultscouldbereturned}else{ while(!$rs->EOF){  print$rs->fields[0].''.$rs->fields[1].'
';  //fields[0]issurname,fields[1]isage  $rs->MoveNext(); // Movestothenextrow } //endwhile}//endelseSelectLimit()将SQL声明作为第一参数,第二个是返回的列的数量,最后一个参数是偏移量(返回的第一行)。注意这跟MySQL的指令中LIMIT子句的参数顺序相反。SelectLimit()对于将搜索结果部分地显示在页面上,是十分有用的,通过Previous和Next按钮,可以浏览所有的结果。不止一次地,我看到的代码将来自数据库的所有查询结果,都用PHP作过滤处理——杀鸡用牛刀!你完全可以使用CacheSelectLimit()函数来贮藏这种类型的结果。第10页共10页 PHP&MySQL编程PHP中ADOdb类库介绍处理事务处理事务是许多应用程序的一个重要的特征。(对于初学者来说,处理事务是你可以提交一打查询操作的过程,而这些查询是都成功了,还是有部分失败了,都需要考虑进去。经典范例是银行处理。钱从你的帐户转出,然后转入到其他某个人的帐户中。只要其中任意一项失败,那么,这整个过程都必须被认定为失败。不然,钱被划出,而没有进对方的帐户;或者,钱没有划出,对方帐户无端多了一笔小费。)处理事务可以在代码级上进行机警地管理控制。常数错误检查被用来判断是否要COMMIT(事务的所有各项都正确,执行正确,结束事务)还是ROLLBACK(事务中有错误,所有改动需要恢复原来状况)。ADOdb有一些能使处理操作正确进行的有用的函数。下例在某个职员的结余加10,并在另一个上减10,整个过程有两个查询,作为一个完整的事务。$sql1="UPDATEemployeesSETbalance=balance-10WHEREid=15";$sql2="UPDATEemployeesSETbalance=balance+10WHEREid=22";$db->StartTrans();$db->Execute($sql);$db->Execute($sql2);$db->CompleteTrans();当你浏览老的代码时,可能会看到一个比较老的方法来实现这一切。使用BeginTrans()、CommitTrans()和RollbackTrans()函数时,需要你自己来处理错误。StartTrans()和CompleteTrans()将会自动地处理错误,并适当地进行COMMIT或ROLLBACK。当需要的时候,你可以通过FailTrans()来强制执行ROLLBACK。当然你可能需要知道处理是失败了还是成功了。ADOdb提供了HasFailedTrans()来实现这个功能。如果出错(或者,你可以将这种情况称作FailTrans()),返回TRUE;如果成功,返回FALSE。$sql1="UPDATEemployeesSETbalance=balance-10WHEREid=15";$sql2="UPDATEemployeesSETbalance=balance+10WHEREid=22";$db->StartTrans();$db->Execute($sql);$db->Execute($s第10页共10页 PHP&MySQL编程PHP中ADOdb类库介绍ql2);$db->CompleteTrans();if($db->HasFailedTrans()){//Somethingwentwrong}值得注意的是,你的数据库需要支持这些事务函数。(大多数的数据库是支持的,不过,MySQLInnoDB表支持,可MySQLMyISAM表不支持。)我希望我所做的一切能让你对数据库库函数能有极大的兴趣。还有大量有趣的函数可以用来从数据库表中自动生成HTML,并且同一结果有不同的方法来实现。你可以在此找到完整的手册。第10页共10页

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭