设为首页收藏本站language 语言切换
查看: 1657|回复: 0
收起左侧

PHP中 ADOdb 类库介绍(一)

[复制链接]
发表于 2010-2-24 13:41:50 | 显示全部楼层 |阅读模式
<STRONG><FONT color=#ff0000>前言<BR></FONT>为什么要使用数据库类库?</STRONG><>初学者 (甚至一些非初学者)常常犯的错误,就是在开发应用程序的时候,缺乏对未来的考虑。假如有一天,你的程序需要使用其它的数据库,难道你还需要重新写一篇针对于这个版本数据库的程序吗?这不是不可能发生的,尤其是当目前的数据库可能不适合你当前的需要的时候。 但是当你做这一切的时候 ,你会发现绝非你想像的那样容易:每一个 DBMS 有不同的函数。举例来说:在 Mysql 中连接数据库的函数为 mysql_connect(),而在MSSQL却是 mssql_connect()。重新查看你所有的代码,然后修改所有操作数据库的函数和查询语法,这绝不是一项简单的工作。程序会经常的被捆绑到了错误的数据库上,以至无法在运行时达到最优性能。数据库类库就是这样产生的。它允许你通过同样的代码来操作不同的数据库。一个设计良好的数据库类库可以完美的改变这一切。它允许你通过极小的修改,就能转接到其他数据库:无论你要连接什么数据库管理系统,只要使用同一个的函数,和不同的参数。举例来说, 在 ADOdb 中,只需简单地将 $db = NewADOConnection('access ') 修改为$db = NewADOConnection('mysql'),这样,你就轻松的把你的程序从 Access 数据库转移到了 Mysql 数据库中。现在网络上已经有了很多这样的数据库类库,比如Pear,PHPlib,我也已经在工作中使用它们了,也许你也曾经用过。但本文仅将重点放在我所特别关注的 ADOdb。本文我只简要地作一个介绍,使你能够马上运用它来开发你的下一个项目。以后的文章中我们将会循序渐进的对它进入更深入的了解。 </P><>目前,ADOdb 支持的数据库包括 MySQL, PostgreSQL,Interbase,Firebird,Informix,Oracle,MS SQL 7,Foxpro,Access,ADO,Sybase,FrontBase,DB2 和 generic ODBC。</P><><STRONG>ADOdb 的安装</STRONG><BR>安装 ADOdb 是一件极期容易的事,相信聪明的你一定不会感到吃力。</P><>首先, 确定你正在运行的 PHP 是 4.0.4 版或更新版。 如果不是,我强列建议你升级! <BR>从 PHP Everywhere 站点下载 .zip 或 .tgz 文件,解压缩到你所选的路径下。<BR>这个路径不应在网页目录(WWWTREE,译者注:如果你的网页是在/www/下,那么,这个目录就不应为/www/here)下!虽然ADOdb的包含文件已经使用了 .inc.php 的扩展名 ,使得服务器即使是在最糟糕的配置下,也不会将这些.inc文件通过明文方式在浏览器中显示出来,但是我们向来不提倡将库函数文件放在网页目录下的行为。然后把下载下来的文件运行:tar -zxvf adodb350.tgz 解压,在Windows下你可以使用一个你喜欢的解压软件来操作,这样,你会得到一个 adodb 的目录其下包括了许多子目录。</P><><STRONG>测试你的安装</STRONG><BR>好了,让我们来测试一下你的安装吧。 通过在脚本中添加下列三行代码来测试你的安装是否成功。注意要把代码中的参数修改成你自己的。</P>< >include("$adodb_path/adodb.inc.php"); // includes the adodb library<BR>$db = NewADOConnection('$database_type'); // A new connection<BR>$db-&gt;Connect("$host", "$user", "$password", "$database_name");</P><>现在你已经拥有一个数据库连接对象 $db 了。 你也可以使用 ADONewConnection 来替换 NewADOConnection —— 这两个是同一函数的不同的名字。 连接的数据库变量 $database_type 需要针对你的实际情况改成你所需要的。可以使用以下列表中的一个(括号内的为描述部分,不要在代码中使用):</P><UL><LI>access (Microsoft Access/Jet) <LI>ado (Generic ADO, the base for all the other ADO drivers) <LI>ado_access (Microsoft Access/Jet using ADO) <LI>ado_mssql (Microsoft SQL Server using ADO) <LI>db2 (DB2) <LI>vfp (Microsoft Visual FoxPro) <LI>fbsql (FrontBase) <LI>ibase (Interbase 6_or_before) <LI>firebird (Firebird) <LI>informix72 (Informix databases before Informix 7.3) <LI>informix (Informix) <LI>maxsql (MySQL with transaction support) <LI>mssql (Microsoft SQL Server 7) <LI>mssqlpo (Portable mssql driver) <LI>mysql (MySQL without transaction support) <LI>mysqlt (MySQL with transaction support, identical to maxmysql) <LI>oci8 (Oracle 8/9) <LI>oci805 (Oracle 8.0.5) <LI>oci8po (Oracle 8/9 portable driver) <LI>odbc (Generic ODBC, the base for all the other ODBC drivers) <LI>odbc_mssql (MSSQL via ODBC) <LI>odbc_oracle (Oracle via ODBC) <LI>oracle (Oracle 7) <LI>postgres (PostgreSQL) <LI>postgres64 (PostgreSQL 6.4) <LI>postgres7 (PostgreSQL 7, currently identical to postgres ) <LI>sqlanywhere (Sybase SQL Anywhere) <LI>sybase (Sybase) </LI></UL><>如果你的链接代码出现了错误的提示,那么你首先要检查的地方就是在路径或连接的变量上。在你责备 ADOdb 之前,请确定你是已经正确的使用那些变量。(很多朋友常花太多时间去修正这些显而易见的错误。) 如果连接没有任何错误提示,那么我们现在已经可以在我们的项目中来使用 ADodb 了。 </P><><STRONG>通过你的脚本连接到数据库</STRONG><BR>把上边的代码加入到你的代码前,让我们先退一步。我们最好能把上边的代码用我们自己的方法来封装起来。这样可以使你的程序变得更灵活、更具移植性。如果你直接把上面的代码插入到你的项目的每个文件中,如果将来项目的路径改变了,将会很容易产生错误,如果你的密码改变了,你可能需要对你所有的脚本进行修改,这样将会影响我们使用库函数的初衷。并且,因为你的密码信息是在WEBTREE下的,这将产生隐患。我推荐将密码信息放在一个独立的包含文件中,比如在 ADOdb 安装目录下的某个地方。如果你要在其他服务器上运行你的程序时,你就不能保证目录结构会是相同的,所以,你要确保这个路径是正确的。我建议使用PHP 的自动包含功能来自动地包含这个文件。</P>< ><BR>include("$adodb_path/db_values.inc.php");<BR>include("$adodb_path/adodb.inc.php");<BR>$db = NewADOConnection('$database_type');<BR>$db-&gt;Connect("$host", "$user", "$password", "employees"); <BR> </P><>如果你也想要使用持久连接, 不是每次创造一个新的连接(这使许多WEB应用程序得到了加速,但是要注意有些数据库是不支持的)。可以使用 PConnect 替换掉 Connect。<BR>文件 db_values.inc.php 是我们的数据库信息文件,内容为(你需要把下面代码中的变量改成你自己的): </P>< >&lt;?php<BR>$database_type="mysql";<BR>$host = "localhost"; // 本地数据库<BR>$user = "ian"<BR>$password = "let_me_in"<BR>?&gt; </P><><BR>你可以在 php.ini 配置中设定自动包含我们的配置文件,具体操作可以修改 PHP.ini 的下述行:</P>< >; Automatically add files before_or_after any PHP document.<BR>auto_prepend_file = /usr/local/build/apache/www/tool_lib/defaults.inc<BR>auto_append_file =<BR> </P><><BR>文件 defaults.inc 包含了 $adbdb_path 的值:</P>< >&lt;?<BR>$adodb_path = "/usr/local/build/apache/www/tool_lib/";<BR>?&gt;<BR> </P><>还有其他方式来实现它,但是我发现这种方法在移植时,可以相对地减少复杂度。</P><><BR>从一个数据库中进行选择(SELECT)操作<BR>当同时使用开发良好的库函数,和PHP自身提供的函数时,可以有多种方法来访问数据库。用什么方法,完全取决于你自己的喜好。<BR>这里是一个简单的例子: </P>< >$sql = "SELECT surname, age FROM employees";<BR>$rs = &amp;$db-&gt;Execute($sql);<BR>if (!$rs) {<BR>print $db-&gt;ErrorMsg(); // Displays the error message if no results could be returned<BR>}<BR>else {<BR>while (!$rs-&gt;EOF) {<BR>  print $rs-&gt;fields[0].' '.$rs-&gt;fields[1].'&lt;BR&gt;'; <BR>   // fields[0] is surname, fields[1] is age<BR>  $rs-&gt;MoveNext();  //  Moves to the next row<BR>}<BR>}<BR> </P><><BR>在上例中,$rs-&gt;fields 是一个包含返回值的数组。数组索引被赋予了初始的数字,你也可以按下面的方法来指定其索引: </P>< >$sql = "SELECT surname, age FROM employees";<BR>$db-&gt;SetFetchMode(ADODB_FETCH_ASSOC); // Return associative array<BR>$rs = &amp;$db-&gt;Execute($sql);<BR>if (!$rs) {<BR>print $db-&gt;ErrorMsg(); // Displays the error message if no results could be returned<BR>}<BR>else {<BR>while (!$rs-&gt;EOF) {<BR>  print $rs-&gt;fields['surname']." ".$rs-&gt;fields['age']."&lt;BR&gt;";<BR>  $rs-&gt;MoveNext();  //  Moves to the next row<BR>}  // end while<BR>} // end else <BR> </P><><BR>对结果浏览的另一个可选的方法是将每条记录作为一个对象返回。 ADOdb 有一个 FetchNextObject() 的函数来实现这一功能,指针会自动地移到下一条记录。 </P>< >$sql = "SELECT surname, age FROM employees";<BR>$db-&gt;SetFetchMode(ADODB_FETCH_ASSOC); // Return associative array<BR>$rs = &amp;$db-&gt;Execute($sql);<BR>if (!$rs) {<BR>print $db-&gt;ErrorMsg(); // Displays the error message if no results could be returned<BR>}<BR>// loop through results<BR>while ($row = $rs-&gt;FetchNextObject()) {<BR>// The field names need to be uppercase<BR>print $row-&gt;SURNAME." ".$row-&gt;AGE."&lt;BR&gt;";<BR>} <BR> </P><><BR><STRONG>插入、更新记录</STRONG><BR>基本的 INSERT 操作方便、快捷, 拥有与SELECT一样的语法。</P>< >$sql = "INSERT INTO employees (surname, age) values ('Clegg','43')";<BR>if (!($db-&gt;Execute($sql))) {<BR> print 'Error inserting: '.$db-&gt;ErrorMsg().'&lt;BR&gt;';<BR>} <BR> </P><><BR>库函数真正的优点,在于它允许你通过相同的语法将记录放入不同的数据库之内,这在以前是绝对不可能的。通常有两种发生的情形。</P><>第一种,引号。所有的引号需要用脱字符(即`符号,键位在Tab键的上边)代替,否则会引起语法错误。但是一些数据库使用一个单引号,另外一些则使用两个单引号。所以,你应当使用 ADOdb 中的 qstr() 而不是 PHP 中的 addslashes()。这样,返回值就将与你所使用的数据库相吻合了。</P><>第二种,日期。许多数据库接受跟他们的日期类型不一致的、不兼容的格式。 ADOdb 有一个 DBDate() 函数,可以将 Unix 的 timestamp, 或 ISO(Y-m-d) 格式转换成任意格式,以此来满足你的数据库的需求。 见下例:</P>< >$employee_surname = $db-&gt;qstr("d'Angelo");<BR>$arrival_time = $db-&gt;DBDate(time());<BR>// The above two functions also add the enclosing quotes, so, $arrival_time, not '$arrival_time'<BR>$sql = "INSERT INTO employee_arrival (arrival_time,surname) values ($arrival_time,$employee_surname)";<BR>if (!($db-&gt;Execute($sql))) {<BR> print 'Error inserting: '.$db-&gt;ErrorMsg().'&lt;BR&gt;';<BR>} <BR> </P><>你可以以完全相同的方式更新数据库,举例来说:</P>< >$sql = "UPDATE employees SET age='44' WHERE id='121')";<BR>if (!($db-&gt;Execute($sql))) {<BR> print 'Error updating: '.$db-&gt;ErrorMsg().'&lt;BR&gt;';<BR>} <BR> </P><>以上仅仅是 Adodb 的一些基本操作 —— 下次我们将会关注一些 ADOdb 提供的比较深层次的东西。 如果我已经使你胃口大开,而且你已经不能再等待, 我建议你去PHP Everywhere看一下,这个站点是ADOdb的专业站点,里面有很多有用的帮助信息。</P><>本文原文地址: <A href="http://www.databasejournal.com/features/php/article.php/2222651">http://www.databasejournal.com/features/php/article.php/2222651</A><BR></P></div>
您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-4-17 04:42 , Processed in 0.085349 second(s), 24 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表