|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
当然你可以把你最基本的功能放出来的时候就放出来,比如放到论坛上,让大家都参与,ado 对查询停止缓存
上个月,咱们复杂地懂得了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"; //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。
固然你能够需求晓得处置是掉败了仍是胜利了。ADOdb 供应了 HasFailedTrans() 来完成这个功效。 假如失足(或,你可以将这类情形称作FailTrans()),前往TRUE;假如胜利,前往FALSE。
$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();
if ($db->HasFailedTrans()) {
// Something went wrong
}
值得注重的是,你的数据库需求撑持这些事务函数。 (大多半的数据库是撑持的,不外,MySQL InnoDB表撑持,可 MySQL MyISAM 表不撑持。)
我但愿我所做的一切能让你对数据库库函数能有极大的乐趣。还有大批风趣的函数可以用来从数据库表中主动生成HTML,而且统一了局有分歧的办法来完成。你可以在此找到完全的手册。
祝你好运!
2003.07.31
原文地址:http://www.databasejournal.com/features/php/article.php/2234861
基础这个东西是个比较笼统的概念,如果你之前学习过c语言, c语言被认为是 |
|