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"; //Directory to store cached files
$sql = "SELECT surname, age FROM employees";
$rs = &$db->CacheExecute(600,$sql); // Executes, and caches the results for 600 seconds
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
} // end while
} // end else
CacheExecute() 函数有两个参数: 第一个参数是缓存文件将被保留的时间,以秒计时;第二个参数是 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 = "SELECT surname, age FROM employees";
$rs = &$db->CacheExecute(600,$sql); // Executes, and caches the results for 600 seconds
print $rs->RecordCount() . " rows returned]"; // Display number of rows returned
或许第二个问题会产生在需量列表上:被返回字段数量是多少?不用担心,ADOdb有FieldCount()。
$sql = "SELECT surname, age FROM employees";
$rs = &$db->CacheExecute(600,$sql); // Executes, and caches the results for 600 seconds
print $rs->FieldCount() . " columns returned]"; // Display number of rows returned
限制结果
上次我们讨论了如何通过使用一个数据库库函数使你的应用程序更简洁,更易于移植。在从MySQL转移到 Informix中 , 我经历了一次痛苦的移植过程。一切都归咎于非ANSII标准的LIMIT子句( 举例来说, 在MySQL中允许下列指令:SELECT name FROM employee LIMIT 15),它是一个非常有用的功能,可在Informix中却不被支持。(在Informix中,相同功能的书写应该是:SELECT FIRST 15 name FROM employee in Informix。)它似乎对你敲响了警钟,要你停止在你的查询中使用非标准SQL的指令,而去认真地学习标准的SQL。幸运的是,ADOdb有一个处理LIMIT的方法:SelectLimit()。
$sql = "SELECT surname, age FROM employees";
$rs = &$db->SelectLimit($sql, 10, 100); // Select 10 rows, starting at row 100
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
} // end while
} // end else
SelectLimit()将SQL声明作为第一参数,第二个是返回的列的数量,最后一个参数是偏移量(返回的第一行)。注意这跟MySQL的指令中LIMIT子句的参数顺序相反。SelectLimit()对于将搜索结果部分地显示在页面上,是十分有用的,通过Previous和Next按钮,可以浏览所有的结果。
不止一次地,我看到的代码将来自数据库的所有查询结果,都用PHP作过滤处理——杀鸡用牛刀! 你完全可以使用 CacheSelectLimit()函数来贮藏这种类型的结果。
处理事务
处理事务是许多应用程序的一个重要的特征。(对于初学者来说,处理事务是你可以提交一打查询操作的过程,而这些查询是都成功了,还是有部分失败了,都需要考虑进去。
经典范例是银行处理。钱从你的帐户转出,然后转入到其他某个人的帐户中。只要其中任意一项失败,那么,这整个过程都必须被认定为失败。不然,钱被划出,而没有进对方的帐户;或者,钱没有划出,对方帐户无端多了一笔小费。)
处理事务可以在代码级上进行机警地管理控制。 常数错误检查被用来判断是否要COMMIT(事务的所有各项都正确,执行正确,结束事务)还是ROLLBACK(事务中有错误,所有改动需要恢复原来状况)。ADOdb 有一些能使处理操作正确进行的有用的函数。下例在某个职员的结余加10,并在另一个上减10,整个过程有两个查询,作为一个完整的事务。
$sql1 = "UPDATE employees SET balance=balance-10 WHERE id=15";
$sql2 = "UPDATE employees SET balance=balance+10 WHERE id=22";
$db->StartTrans();
$db->Execute($sql);
$db->Execute($sql2);
$db->CompleteTrans();
当你浏览老的代码时,可能会看到一个比较老的方法来实现这一切。使用 BeginTrans()、CommitTrans()和RollbackTrans()函数时,需要你自己来处理错误。StartTrans()和 CompleteTrans()将会自动地处理错误,并适当地进行COMMIT或ROLLBACK。当需要的时候,你可以通过FailTrans()来强制执行ROLLBACK。