php操作MSSQL 无限级分类+分页详细实例

 运行环境:PHP5.3 + apache2.2 + mssql 2005    ,为什么要用mssql不用,mysql呢, 因为这里在一个平台上做开发,用友数据整合。。。mysql与mssql语句还是有差别的,至少mssql没有limit。。。

这个是必须的,开启一个需要一个ntwdblib.dll链接文件,版本还不能太低,其他的自己百度吧,嘿嘿

  
  
  
  
  1. CREATE TABLE [dbo].[tb_ProType]( 
  2.     [jb_Id] [int] IDENTITY(1,1) NOT NULL
  3.     [jb_TypeName] [varchar](150) NULL
  4.     [jb_TypePid] [intNULL
  5.     [jb_Path] [varchar](128) NULL
  6.     [jb_State] [intNULL CONSTRAINT [DF_tb_ProType_jb_State]  DEFAULT ((6)), 
  7.     [jb_CreateTime] [datetime] NULL
  8.     [jb_Order] [intNULL
  9.  CONSTRAINT [PK_tb_ProType] PRIMARY KEY CLUSTERED  
  10.     [jb_Id] ASC 
  11. )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ONON [PRIMARY
  12. ON [PRIMARY
  13.  
  14. INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(124,'数码产品',0,'0,'); 
  15. INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(125,'手机','124','0,124,'); 
  16. INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(126,'笔记本电脑',124,'0,124,'); 
  17. INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(127,'联想',126,0,124,126,); 
  18. INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(129,'HP',126,'0,124,126,'); 
  19. INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(134,'G460',127,'0,124,126,127,'); 
  20. INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(133,'书类',0,'0,'); 
  21. INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(128,'企业类',0,'0,'); 
  22. INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(132,'相机',124,'0,124,'); 
  23. INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(130,'联想1',127,'0,124,126,127,'); 
  24. INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(131,'联想3',129,'0,124,126,127,129,'); 
  25. INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(135,'计算机书',130,'0,130,'); 

  
  
  
  
  1. <?php 
  2. //设置GBK编码 
  3. header('Content-Type:text/html;charset=GBK');   
  4. //这个是编码,用mysql一般是utf-8,但是这mssql,我就用gbk 
  5. //网站根目录 
  6. define('ROOT_PATH',dirname(__FILE__));          //返回当前的绝对路径 
  7. //这是我当前的C:\wamp\www\demo,所有的文件都存放在www,下的demo文件中 
  8. define('Host''127.0.0.1,1433');   //sql的地址与端口,中间为“,”分开,不是":" 
  9. define('Name''sa');               //mssql 的用户名 
  10. define('Pass''123456');           //这个是mssql 密码 
  11. define('DataName''demo');         //这个是数据文件名 
  12. //设置中国时区 
  13. date_default_timezone_set('Asia/Shanghai'); //地区时间 
  14. //地区时间设置 
  15. @spl_autoload_register('__autoload'); 
  16. //当__autoload无法加载时,就执行上面的 
  17. function __autoload($_className){       //自动引入类 
  18.         if(file_exists(ROOT_PATH.'/class/'.$_className.'.class.php')){ 
  19.             //系统会在new Mssql时,自动加载这个文件,首先判断一个这个文件是否存在 
  20.             //如果存在就引入这个类 
  21.             require_once ROOT_PATH.'/class/'.$_className.'.class.php'
  22.         }else
  23.             //如果没有,就是加载错误,不允许向下执行 
  24.             exit($_className.'.class.php类不存在'); 
  25.         } 
  26.  
  27.      
  28.     /* 
  29.      *  
  30.      * 类型管理,分页列表 
  31.      * 提供两个类,class/mssql.class.php   这是mssql操作类,我从网上下载的,修改了一下 
  32.      * class/page.class.php   这是分页类,也是网上下载的,可以用在mysql中,一样的,不需要 
  33.      * 更改,还可以放在模板里smarty 
  34.      * $_page = $_pages->ShowLink(); 
  35.      * 如:$smarty->assign("page",$_page);        <{$page}> 
  36.      * 就是这么的简单,这是从模板中整理出来的 
  37.      * */ 
  38.  
  39.     $_mssql = new Mssql(Host,Name,Pass,DataName); 
  40.     //new 这个mssql类,当然在class这个文件夹下面要有一个mssql.class.php的文件 
  41.  
  42.     @$GetPage = $_GET['page'] ? $_GET['page'] : 1;   
  43.     //如果传过来的index.php?page=1  有值的话就等于传过来的值,没有就等于1 
  44.     //就是没有就是第一页 
  45.      
  46.     $_pages = new Page(); 
  47.     //new一下这个分页类,这个分页类与什么数据库没有关系的 
  48.      
  49.     $_pages->PageSize = 12;//每页条数 
  50.      
  51.     /* 
  52.      * $_pages->PageSize是显示多少记录 
  53.      * $GetPage是第几页 
  54.      * 这里mysql里面的不一样,mysql利用了limit,就非常简单了,一看就懂了 
  55.      * 这里做了一个子查询,与 not in() 
  56.      *  
  57.      * */ 
  58.     $_sql = "select top {$_pages->PageSize} * from tb_ProType    
  59.             where jb_Id not in   
  60.             (   
  61.             select top ({$_pages->PageSize}*($GetPage-1)) jb_Id from tb_ProType  
  62.             ) 
  63.             order by  
  64.             REPLACE(REPLACE(REPLACE(jb_Path,'0,','1'),',','')+str(jb_id),' ',''
  65.     "; 
  66.      
  67.     //查询“资产信息表”中的所有数据 
  68.     $Result$_mssql->execQuery($_sql);      
  69.     //$Row=$_mssql->getTotalRowNum($Result);//总条数    
  70.      
  71.     $ResRows = $_mssql->execQuery('select jb_Id from tb_ProType'); 
  72.     //查询tb_ProInfo表的总条数; 
  73.      
  74.     $Rows = $_mssql->getTotalRowNum($ResRows); 
  75.     //返回查询到的行数,当前这里可以做一个判断,如果返回空的或小于0,就可以代表没有数据 
  76.      
  77.     $_pages->Total = $Rows
  78.     //总条数 
  79.     $_mssql->freeResult($ResRows); 
  80.     //销毁查询总条数这个集合 
  81.     $_page = $_pages->ShowLink(); 
  82.     //这样就可以显示分页链接了,就可以直接使用 ECHO 输出了 
  83.      
  84.     echo '<table align="center" border="1" width="800">'
  85.     while(!!$rs = $_mssql->_fetch_array($Result)){ 
  86.         $m = substr_count($rs['jb_Path'],",")-1;     
  87.         $strs = str_pad("",$m*6*2,"&nbsp;"); 
  88.         echo '<tr>'
  89.         echo '<td>'.$rs["jb_Id"].'</td>'
  90.         echo '<td>'.$strs.$rs["jb_TypeName"].'</td>'
  91.         if($rs["jb_TypePid"]=='0'){ 
  92.         echo '<td>顶级类别</td>'
  93.         }else
  94.             echo '<td>'.$rs["jb_TypePid"].'</td>'
  95.         } 
  96.         echo '<td>'.$rs["jb_Path"].'</td>'
  97.         echo '</tr>';    
  98.     } 
  99.     echo '<tr><td colspan="5" height="40">'.$_page.'</td></tr>'
  100.     echo '</table>'
  101.     $_mssql->freeResult($Result);//销毁查询总条数这个集合 
  102.     unset($_page);//销毁这个变量 
  103.     unset($_pages); //销毁这个变量     
  104.     $_mssql->_close(); 
  105.     /* 
  106.      * 分页就结束了    
  107.      * */    
  108.          
  109. ?> 

无限级分类,我只做了一个排序,添加就非常简单了,我也没有做什么递归函数,添加的时候把,Id,e

本文来自我的个人网站:http://www.51net.co/

你可能感兴趣的:(php操作MSSQL,无限级分类+分页详细实例)