浏览模式: 标准 | 列表全部文章

非递归的php+mysql无限级分类

要实现无限级分类,递归一般是第一个也是最容易想到的,但是递归一般被认为占用资源的方法,所以很多系统是不考虑使用递归的
本文还是通过数据库的设计,用一句sql语句实现
数据库字段大概如下:
-----------------------------------------------------------------------------------
id              编号
fid             父分类编号
class_name         分类名
path          分类路径,以 id 为节点,组成类似    ,1,2,3,4, 这样的字符串
----------------------------------------------------------------------------------

可以假设有如下的数据

id      fid         class_name             path
----------------------------------------------------
1       0           分类1             ,1,
2       0           分类2             ,2,
3       1           分类1-1          ,1,3,
4       1           分类1-2          ,1,4,
5       2           分类2-1          ,2,5,
6       4           分类1-2-1       ,1,4,6,
----------------------------------------------------

PHP代码
  1. <?php     
  2. $sql="SELECT * FROM tree order by path";   
  3. $result=$nbs->Query($sql);   
  4. while($rows=$nbs->fetch_array($result)){   
  5.     if(substr_count($rows['path'],',')>2){   
  6.         for($i=0;$i<(substr_count($rows['path'],',')-2);$i++)   
  7.             echo ' ';   
  8.     }   
  9.     echo $rows['class_name'].'<br>';   
  10. }   
  11. ?>   

其中$nbs是数据库操作类,此方法简单明了!

原文地址:http://www.phpangel.cn/php/unlimited-categories.html

Tags: 递归, 无限分类

Tinybutstrong的plug-ins进行mysql分页摸索

这篇日志被加密了,请输入密码后查看。

淡水河边php视频教程第七集发布(留言本完整实例)

淡水河边php视频教程基础篇终章。
基于一个php的留言本的讲解。
a部分说明了数据库的设计和一些公用的功能模块,以及显示留言这一块(包含了分页)。
b部分说明了发布留言,管理登录,审核留言,删除留言,删除回复,管理员登出。

» 阅读全文

Tags: php视频教程

PHP5与MYSQL5 web开发技术详解 部分摘录

动态生成单选按钮和动态生成多选。html表单的重复提交,安全等问题

» 阅读全文

武大郎的炊饼

这两天的光阴我打发得甚是无趣。

就和今天在菜市场边上,看到的身穿蓝缎古装买武大郎炊饼的情景一样。

就是把php视频教程的第六集录完了。说了一些session和cookie的东西。东西不多,本不算一集的,但是不在状态,就不多录了。视频可以到php同盟会下载。

使用Tinybutstrong的plug-ins进行mysql分页

我上次的文章( tinybutstrong的By-Page分页插件使用)是按官方是实例用的数组做的,可能说明不够本地话。这次,我使用了mysql做的。tinybutstrong其实已经集成了部分sql的操作,我们只要输入sql语句就可以了。以前淡水河边使用了adodb,这样效率就没那么高了,模板解析一次(包括了数据库的调用解析,就算没有调用,至少有个判断啥的操作),adodb类又是比较庞大的类库,又是判断啥的操作。所以效率肯定没有直接用tinybutstrong内封装好的数据操作高。

» 阅读全文

Tags: tinybutstrong, 分页

php代码效率测试

PHP代码
  1. $GLOBALS['_start_time_'] = array_sum(explode(' ', microtime()));   
  2. /**  
  3. * 调试使用情况  
  4. */  
  5. function debug_using()   
  6. {   
  7. echo '执行时间:'.(array_sum(explode(' ', microtime()))-$GLOBALS['_start_time_']).' 秒.<br>';   
  8. if (function_exists('memory_get_usage')) {   
  9. echo '内存使用:'.number_format(memory_get_usage()).' 字节.<br>';   
  10. }   
  11. }  

…………

 

PHP代码
  1. debug_using();  

在tinybutstrong中使用adodb

淡水河边原创,转载请保留链接。两个tinybutstrong(小强)的Database plug-ins 。一个是配合adodb使用的,一个是在ms下无需adodb的(效率貌似比adodb好一些)。

淡水河边使用access测试,access能跑,插件示例的mysql就更不是问题了。

php代码如下:

PHP代码
  1. <?php   
  2. include_once("tbs_class_php4.php");   
  3. include_once("adodb/adodb.inc.php");   
  4. include_once("tbsdb_jladodb.php"); // file that contain John Lim's ADOdb function   
  5.   
  6. $conn = NewADOConnection('ado');  
  7. //$conn = NewADOConnection('ado_access');//you can use this  
  8. //$conn = NewADOConnection('access');//you can use this  
  9. $access = realpath("Employees.mdb");  
  10. $myDSN = 'Driver={Microsoft Access Driver (*.mdb)};Dbq='. $access;   
  11. $conn->Connect($myDSN);   
  12. //$conn->debug = true;   
  13.   
  14. $tbs = new clsTinyButStrong;   
  15. $tbs->LoadTemplate("list_employee.html");   
  16.   
  17. $query = "Select * from Employees";   
  18.   
  19. $tbs->MergeBlock("blk1","adodb",$query);   
  20. //$tbs->MergeBlock("blk1",$conn,$query);//you can use this   
  21. $tbs->Show();   
  22.   
  23. ?>   

tbsdb_jladodb.php是tbs的插件。可以到官方下载 

PHP代码
  1. <?php   
  2. /*  
  3. John Lim's ADOdb functions for TinyButStrong Template Engine  
  4. Version 1.00, 2004-09-22, Skrol29  
  5. http://www.tinybutstrong.com  
  6.  
  7. Example:  
  8.     $conn = NewADOConnection('mysql');  
  9.     $conn->Connect('host', 'uid', 'pdw', 'db');  
  10.     ...   
  11.     $TBS->MergeBlock('blk1','adodb','SELECT * FROM t_examples');  
  12.  
  13. Notes:  
  14.     - Before the merge, you have to open a connection using the global variable $conn (change it if you want into the custom function).  
  15.     - The keyword 'adodb' enables TBS to call the custom functions.  
  16. */  
  17.   
  18. function tbsdb_adodb_open($source,$query) {   
  19.     global $conn ;   
  20.     $conn->SetFetchMode(ADODB_FETCH_ASSOC);    
  21.     $rs = $conn->Execute($query) ;   
  22.     return $rs ;   
  23. }   
  24.   
  25. function tbsdb_adodb_fetch($rs) {   
  26.     return $rs->FetchRow() ;   
  27. }   
  28.   
  29. function tbsdb_adodb_close($rs) {   
  30.     $rs->Close() ;   
  31. }   
  32. ?>  

html模板: 

XML/HTML代码
  1. <table border="1" cellpadding="2" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="100%" id="AutoNumber1">  
  2. <tr>  
  3.   <td width="25%" bgcolor="#DDDDDD"><b><font size="1" face="Verdana">Employee No.</font></b></td>  
  4.   <td width="25%" bgcolor="#DDDDDD"><b><font size="1" face="Verdana">Employee Name</font></b></td>  
  5.   <td width="25%" bgcolor="#DDDDDD"><b><font size="1" face="Verdana">Designation</font></b></td>  
  6.   <td width="25%" bgcolor="#DDDDDD"><b><font size="1" face="Verdana">Department</font></b></td>  
  7. </tr>  
  8. <row>  
  9. <tr>  
  10.   <td width="25%"><font size="1" face="Verdana">[blk1.EmployeeNO;block=row]</font></td>  
  11.   <td width="25%"><font size="1" face="Verdana">[blk1.FirstName]</font></td>  
  12.   <td width="25%"><font size="1" face="Verdana">[blk1.Positions]</font></td>  
  13.   <td width="25%"><font size="1" face="Verdana">[blk1.DepartmentDescription]</font></td>  
  14. </tr>  
  15. </row>  
  16. <row>  
  17. <tr>  
  18.   <td width="25%" bgcolor="#CCCCFF"><font size="1" face="Verdana">[blk1.EmployeeNO;block=row]</font></td>  
  19.   <td width="25%" bgcolor="#CCCCFF"><font size="1" face="Verdana">[blk1.FirstName]</font></td>  
  20.   <td width="25%" bgcolor="#CCCCFF"><font size="1" face="Verdana">[blk1.Positions]</font></td>  
  21.   <td width="25%" bgcolor="#CCCCFF"><font size="1" face="Verdana">[blk1.DepartmentDescription]</font></td>  
  22. </tr>  
  23. </row>  
  24. </table>  

设计试图:
大小: 14.72 K
尺寸: 500 x 83
浏览: 19 次
点击打开新窗口浏览全图

结果:
大小: 31.97 K
尺寸: 472 x 259
浏览: 16 次
点击打开新窗口浏览全图

如果是采用access或是mssql可以有另一种选择。大致相同。无需adpdb支持。

虽然也有adodb的字样,但是他说的是ms的adodb。

php文件如下:

PHP代码
  1. <?php   
  2. include_once("tbs_class_php4.php");   
  3. include_once("tbsdb_msadodb.php");   
  4.   
  5. $conn = new com('ADODB.Connection');    
  6. $access = realpath("Employees.mdb");   
  7. $myDSN = 'Driver={Microsoft Access Driver (*.mdb)};Dbq='$access;   
  8. $conn->Open($myDSN);   
  9.   
  10. $tbs = new clsTinyButStrong;   
  11. $tbs->LoadTemplate("list_employee.html");   
  12.   
  13. $query = "Select * from Employees";   
  14.   
  15. $tbs->MergeBlock("blk1",$conn,$query);   
  16. $tbs->Show();   
  17. ?>   

tbsdb_msadodb.php文件如下:

PHP代码
  1. <?php   
  2. /*  
  3. Ms ADODB functions for TinyButStrong Template Engine  
  4. Version 1.00, 2004-09-22, Skrol29  
  5. http://www.tinybutstrong.com  
  6.  
  7. Example:  
  8.   // SQL-Server  
  9.     $conn_str = 'PROVIDER=SQLOLEDB.1;PERSIST SECURITY INFO=FALSE;DATA SOURCE=server;INITIAL CATALOG=database;' ;   
  10.     // Ms Access   
  11.     $conn_str = 'DRIVER=Microsoft Access Driver (*.mdb);DBQ=E:\My Folder\My_Database.mdb';  
  12.     $conn = new com('ADODB.Connection');   
  13.     $conn->Open($conn_str,'uid','pwd');   
  14.     ...  
  15.     $TBS->MergeBlock('blk1',$conn,'SELECT * FROM t_examples');  
  16.  
  17. */  
  18.   
  19. function tbsdb_com_open($Source$Query) {   
  20.   
  21.     if (strlen(@$Source->ConnectionString())>0) { // Look if it's a Connection object   
  22.         if ($Source->State==1) {   
  23.             $Rs = @$Source->Execute($Query); // We use the Connection object reather than the Recordset object in order to manage errors   
  24.             if ($Source->Errors->Count>0) {   
  25.                 echo 'TinyButStrong functions for ADODB: error message when opening the query: '.htmlentities($Source->Errors[0]->Description).' <br>';  
  26.                 return false;  
  27.             } elseif ($Rs->State!=1) {  
  28.                 echo 'TinyButStrong functions for ADODB: The ADODB query doesn\'t return a RecordSet or the ResordSet is not ready. <br>';   
  29.                 return false;   
  30.             }   
  31.         } else {   
  32.             echo 'TinyButStrong functions for ADODB: Connection is not open or not ready. <br>';   
  33.             return false;   
  34.         }   
  35.     } elseif (strlen(@$Source->CursorType())>0) { // Look if it's a RecordSet object   
  36.         if ($Source->State==1) {   
  37.             $Rs = $Source;   
  38.         } else {   
  39.             echo 'TinyButStrong functions for ADODB: The specified ADODB Recordset is not open or not ready. <br>';  
  40.             return false;  
  41.         }  
  42.     } else {  
  43.         echo 'TinyButStrong functions for ADODB: The specified COM Object is not a Connection or a Recordset. <br>';  
  44.         return false;  
  45.     }  
  46.  
  47.     if ($Rs===false) return false;  
  48.       
  49.     $Fields = array();  
  50.     $iMax = $Rs->Fields->Count;  
  51.     for ($i=0;$i<$iMax;$i++) {  
  52.         $Fields[$i] = ''.$Rs->Fields[$i]->Name;  
  53.     }  
  54.  
  55.     return array('recset'=>$Rs,'fields'=>$Fields);  
  56.  
  57. }  
  58.  
  59. function tbsdb_com_fetch(&$Rs) {  
  60.     if ($Rs['recset']->EOF()) {  
  61.         $Rec = false;  
  62.     } else {  
  63.         $Rec = array();  
  64.         foreach ($Rs['fields'] as $colid=>$colname) {  
  65.             $Rec[$colname] = $Rs['recset']->Fields[$colid]->Value;  
  66.         }  
  67.         $Rs['recset']->MoveNext(); // brackets () must be there  
  68.     }  
  69.     return $Rec;  
  70. }  
  71.  
  72. function tbsdb_com_close(&$Rs) {  
  73.     $Rs['recset']->Close;   
  74. }   
  75. ?>  

 结果是一样的。如果是采用ms的平台,用这个效率应该会高一些。

附件: tbs_db_plus.rar (1.63 K, 下载次数:22)

Tags: tinybutstrong, adodb学习, adodb

小说中的文字

发完邮件之后,我又对着电脑屏幕盯了半天,显然我奢望立刻能得到什么回复。不过可惜没有,我直盯到双眼发酸,也没见到什么动静,无奈之下,起身去厨房找吃的。

找了一圈忽然在厨房的角落里发现一只小强,然后拿起一只拖鞋和它奋战了好久,从厨房一路追杀到厕所里,才终于将它消灭,此时却累得不轻,喘息未平却有些茫然了。

我拿着拖鞋,一屁股坐在马桶上,这模样有些深沉,随后我陷入沉思。

我到底在做什么?

这个问题有些太过深奥了,于是我干脆跳开,那么下一个问题是,我接下来,该做些什么?

——邪气凛然

Tinybutstrong摸索

淡水河边的原创,转载请保留链接。
a,
你可以合并数块具有相同的数据显示,他们的名字分开,由逗号在blockname参数。在这种情况下,就只执行一次查询,并缓冲记录并填充到块。
示例:
PHP代码
  1. $TBS->MergeBlock('block1,block2,block3','mysql','SELECT * FROM MyTable');  
b,
[block1.#] :在块中时,合并成当前的行号。如果放到块外,就是显示记录总数。
 
c,
[block1.$]:虚拟的“$”列,将显示当前的纪录的key,如果数据源是一个php数组
 
d,
如果数据源的参数是“”,那么,当合并一个空的array时,所有的块和sections 都会被删除。
PHP代码
  1. $TBS->MergeBlock('b1','clear');  
 
e,
block块的循环的特殊用法:
<table><tr>[b1.field1;block=tr+tr+tr]</tr><tr>...</tr><tr>...</tr></table>
上例会循环三个连接着的tr标签。
 
... <span>...</span><div>[b1.field1;block=span+(div)]</div> ...
上例会一起循环span和div
 
... <span>...</span> <div>[b1.field1;block=span+(div)+table]</div> <table>...</table> ...

上例会一起循环span,div和table

 <div> <div> [b1.field1;block=((div))] </div> </div>
上例会循环外侧的div

f,
bmagnet=expr
如果数据源为空,那么用bmagnet指定的标签将会删除。示例:大小: 7.57 K
尺寸: 410 x 44
浏览: 13 次
点击打开新窗口浏览全图
为确保php代码不会出错,在为空的情况下,我们可以给它赋值为没有item的空数组,示例:

PHP代码
  1. if (is_null($data)) $data = array();   
  2. $TBS->MergeBlock('b1',$data);  

 

注意在使用tbs时,有时需要实时刷新的。在php里用

PHP代码
  1. header("expires:mon,26 jul 1997 05:00:00 gmt");    
  2. header("cache-control:no-cache,must-revalidate");    
  3. header("pragma:no-cache");  

无效,而是在html模板里使用

XML/HTML代码
  1. <META HTTP-EQUIV="pragma" CONTENT="no-cache">  
  2. <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">  
  3. <META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">  
  4. <META HTTP-EQUIV="expires" CONTENT="0">   

Tags: tinybutstrong