当前位置:首页 > PHP中 ADODB 类库介绍(一)

PHP中 ADODB 类库介绍(一)

点击次数:1462  更新日期:2011-01-02
\n

前言
为什么要使用数据库类库?
\n

初学者 (甚至一些非初学者)常常犯的错误,就是在开发应用程序的时候,缺乏对未来的考虑。假如有一天,你的程序需要使用其它的数据库,难道你还需要重新写一篇针对于这个版本数据库的程序吗?这不是不可能发生的,尤其是当目前的数据库可能不适合你当前的需要的时候。 但是当你做这一切的时候 ,你会发现绝非你想像的那样容易:每一个 DBMS 有不同的函数。举例来说:在 Mysql 中连接数据库的函数为 mysql_connect(),而在MSSQL却是 mssql_connect()。重新查看你所有的代码,然后修改所有操作数据库的函数和查询语法,这绝不是一项简单的工作。程序会经常的被捆绑到了错误的数据库上,以至无法在运行时达到最优性能。数据库类库就是这样产生的。它允许你通过同样的代码来操作不同的数据库。一个设计良好的数据库类库可以完美的改变这一切。它允许你通过极小的修改,就能转接到其他数据库:无论你要连接什么数据库管理系统,只要使用同一个的函数,和不同的参数。举例来说, 在 ADOdb 中,只需简单地将 db = NewADOConnection(‘access ‘) 修改为db = NewADOConnection(‘mysql’),这样,你就轻松的把你的程序从 Access 数据库转移到了 Mysql 数据库中。现在网络上已经有了很多这样的数据库类库,比如Pear,PHPlib,我也已经在工作中使用它们了,也许你也曾经用过。但本文仅将重点放在我所特别关注的 ADOdb。本文我只简要地作一个介绍,使你能够马上运用它来开发你的下一个项目。以后的文章中我们将会循序渐进的对它进入更深入的了解。


\n

目前,ADOdb 支持的数据库包括 MySQL, PostgreSQL,Interbase,Firebird,Informix,Oracle,MS SQL 7,Foxpro,Access,ADO,Sybase,FrontBase,DB2 和 generic ODBC。


\n

ADOdb 的安装
安装 ADOdb 是一件极期容易的事,相信聪明的你一定不会感到吃力。


\n

首先, 确定你正在运行的 PHP 是 4.0.4 版或更新版。 如果不是,我强列建议你升级!
从 PHP Everywhere 站点下载 .zip 或 .tgz 文件,解压缩到你所选的路径下。
这个路径不应在网页目录(WWWTREE,译者注:如果你的网页是在/www/下,那么,这个目录就不应为/www/here)下!虽然ADOdb的包含文件已经使用了 .inc.php 的扩展名 ,使得服务器即使是在最糟糕的配置下,也不会将这些.inc文件通过明文方式在浏览器中显示出来,但是我们向来不提倡将库函数文件放在网页目录下的行为。然后把下载下来的文件运行:tar -zxvf adodb350.tgz 解压,在Windows下你可以使用一个你喜欢的解压软件来操作,这样,你会得到一个 adodb 的目录其下包括了许多子目录。


\n

测试你的安装
好了,让我们来测试一下你的安装吧。 通过在脚本中添加下列三行代码来测试你的安装是否成功。注意要把代码中的参数修改成你自己的。


\n

include(“adodb_path/adodb.inc.php”); // includes the adodb library
db = NewADOConnection(‘database_type’); // A new connection
db->Connect(“host”, “user”, “password”, “database_name”);


\n

现在你已经拥有一个数据库连接对象 db 了。 你也可以使用 ADONewConnection 来替换 NewADOConnection —— 这两个是同一函数的不同的名字。 连接的数据库变量 database_type 需要针对你的实际情况改成你所需要的。可以使用以下列表中的一个(括号内的为描述部分,不要在代码中使用):


\n

    \n
  • access (Microsoft Access/Jet)
    \n
  • ado (Generic ADO, the base for all the other ADO drivers)
    \n
  • ado_access (Microsoft Access/Jet using ADO)
    \n
  • ado_mssql (Microsoft SQL Server using ADO)
    \n
  • db2 (DB2)
    \n
  • vfp (Microsoft Visual FoxPro)
    \n
  • fbsql (FrontBase)
    \n
  • ibase (Interbase 6 or before)
    \n
  • firebird (Firebird)
    \n
  • informix72 (Informix databases before Informix 7.3)
    \n
  • informix (Informix)
    \n
  • maxsql (MySQL with transaction support)
    \n
  • mssql (Microsoft SQL Server 7)
    \n
  • mssqlpo (Portable mssql driver)
    \n
  • mysql (MySQL without transaction support)
    \n
  • mysqlt (MySQL with transaction support, identical to maxmysql)
    \n
  • oci8 (Oracle 8/9)
    \n
  • oci805 (Oracle 8.0.5)
    \n
  • oci8po (Oracle 8/9 portable driver)
    \n
  • odbc (Generic ODBC, the base for all the other ODBC drivers)
    \n
  • odbc_mssql (MSSQL via ODBC)
    \n
  • odbc_oracle (Oracle via ODBC)
    \n
  • oracle (Oracle 7)
    \n
  • postgres (PostgreSQL)
    \n
  • postgres64 (PostgreSQL 6.4)
    \n
  • postgres7 (PostgreSQL 7, currently identical to postgres )
    \n
  • sqlanywhere (Sybase SQL Anywhere)
    \n
  • sybase (Sybase)

\n

如果你的链接代码出现了错误的提示,那么你首先要检查的地方就是在路径或连接的变量上。在你责备 ADOdb 之前,请确定你是已经正确的使用那些变量。(很多朋友常花太多时间去修正这些显而易见的错误。) 如果连接没有任何错误提示,那么我们现在已经可以在我们的项目中来使用 ADodb 了。


\n

通过你的脚本连接到数据库
把上边的代码加入到你的代码前,让我们先退一步。我们最好能把上边的代码用我们自己的方法来封装起来。这样可以使你的程序变得更灵活、更具移植性。如果你直接把上面的代码插入到你的项目的每个文件中,如果将来项目的路径改变了,将会很容易产生错误,如果你的密码改变了,你可能需要对你所有的脚本进行修改,这样将会影响我们使用库函数的初衷。并且,因为你的密码信息是在WEBTREE下的,这将产生隐患。我推荐将密码信息放在一个独立的包含文件中,比如在 ADOdb 安装目录下的某个地方。如果你要在其他服务器上运行你的程序时,你就不能保证目录结构会是相同的,所以,你要确保这个路径是正确的。我建议使用PHP 的自动包含功能来自动地包含这个文件。


\n


include(“adodb_path/db_values.inc.php”);
include(“adodb_path/adodb.inc.php”);
db = NewADOConnection(‘database_type’);
db->Connect(“host”, “user”, “password”, “employees”);


\n

如果你也想要使用持久连接, 不是每次创造一个新的连接(这使许多WEB应用程序得到了加速,但是要注意有些数据库是不支持的)。可以使用 PConnect 替换掉 Connect。
文件 db_values.inc.php 是我们的数据库信息文件,内容为(你需要把下面代码中的变量改成你自己的):


\n

<?php
database_type=”mysql”;
host = “localhost”; // 本地数据库
user = “ian”
password = “let_me_in”
?>


\n


你可以在 php.ini 配置中设定自动包含我们的配置文件,具体操作可以修改 PHP.ini 的下述行:


\n

; Automatically add files before or after any PHP document.
auto_prepend_file = /usr/local/build/apache/www/tool_lib/defaults.inc
auto_append_file =


\n


文件 defaults.inc 包含了 adbdb_path 的值:


\n

<?
adodb_path = “/usr/local/build/apache/www/tool_lib/”;
?>


\n

还有其他方式来实现它,但是我发现这种方法在移植时,可以相对地减少复杂度。


\n


从一个数据库中进行选择(SELECT)操作
当同时使用开发良好的库函数,和PHP自身提供的函数时,可以有多种方法来访问数据库。用什么方法,完全取决于你自己的喜好。
这里是一个简单的例子:


\n

sql = “SELECT surname, age FROM employees”;
rs = &db->Execute(sql);
if (!rs) {
print db->ErrorMsg(); // Displays the error message if no results could be returned
}
else {
while (!rs->EOF) {
print rs->fields[0].’ ‘.rs->fields[1].’<BR>’;
// fields[0] is surname, fields[1] is age
rs->MoveNext(); // Moves to the next row
}
}


\n


在上例中,rs->fields 是一个包含返回值的数组。数组索引被赋予了初始的数字,你也可以按下面的方法来指定其索引:


\n

sql = “SELECT surname, age FROM employees”;
db->SetFetchMode(ADODB_FETCH_ASSOC); // Return associative array
rs = &db->Execute(sql);
if (!rs) {
print db->ErrorMsg(); // Displays the error message if no results could be returned
}
else {
while (!rs->EOF) {
print rs->fields[\'surname\'].” “.rs->fields[\'age\'].”<BR>”;
rs->MoveNext(); // Moves to the next row
} // end while
} // end else


\n


对结果浏览的另一个可选的方法是将每条记录作为一个对象返回。 ADOdb 有一个 FetchNextObject() 的函数来实现这一功能,指针会自动地移到下一条记录。


\n

sql = “SELECT surname, age FROM employees”;
db->SetFetchMode(ADODB_FETCH_ASSOC); // Return associative array
rs = &db->Execute(sql);
if (!rs) {
print db->ErrorMsg(); // Displays the error message if no results could be returned
}
// loop through results
while (row = rs->FetchNextObject()) {
// The field names need to be uppercase
print row->SURNAME.” “.row->AGE.”<BR>”;
}


\n


插入、更新记录
基本的 INSERT 操作方便、快捷, 拥有与SELECT一样的语法。


\n

sql = “INSERT INTO employees (surname, age) values (‘Clegg’,’43′)”;
if (!(db->Execute(sql))) {
print ‘Error inserting: ‘.db->ErrorMsg().’<BR>’;
}


\n


库函数真正的优点,在于它允许你通过相同的语法将记录放入不同的数据库之内,这在以前是绝对不可能的。通常有两种发生的情形。


\n

第一种,引号。所有的引号需要用脱字符(即符号,键位在Tab键的上边)代替,否则会引起语法错误。但是一些数据库使用一个单引号,另外一些则使用两个单引号。所以,你应当使用 ADOdb 中的 qstr() 而不是 PHP 中的 addslashes()。这样,返回值就将与你所使用的数据库相吻合了。


\n

第二种,日期。许多数据库接受跟他们的日期类型不一致的、不兼容的格式。 ADOdb 有一个 DBDate() 函数,可以将 Unix 的 timestamp, 或 ISO(Y-m-d) 格式转换成任意格式,以此来满足你的数据库的需求。 见下例:


\n

employee_surname = db->qstr(“d’Angelo”);
arrival_time = db->DBDate(time());
// The above two functions also add the enclosing quotes, so, arrival_time, not ‘arrival_time’
sql = “INSERT INTO employee_arrival (arrival_time,surname) values (arrival_time,employee_surname)”;
if (!(db->Execute(sql))) {
print ‘Error inserting: ‘.db->ErrorMsg().’<BR>’;
}


\n

你可以以完全相同的方式更新数据库,举例来说:


\n

sql = “UPDATE employees SET age=’44′ WHERE id=’121′)”;
if (!(db->Execute(sql))) {
print ‘Error updating: ‘.db->ErrorMsg().’<BR>’;
}


\n

以上仅仅是 Adodb 的一些基本操作 —— 下次我们将会关注一些 ADOdb 提供的比较深层次的东西。 如果我已经使你胃口大开,而且你已经不能再等待, 我建议你去PHP Everywhere看一下,这个站点是ADOdb的专业站点,里面有很多有用的帮助信息。


\n

本文原文地址: http://www.databasejournal.com/features/php/article.php/2222651

\n