您的位置:首页 > 编程语言 > PHP开发

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

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




这个是必须的,开启一个需要一个ntwdblib.dll链接文件,版本还不能太低,其他的自己百度吧,嘿嘿
CREATE TABLE [dbo].[tb_ProType](
[jb_Id] [int] IDENTITY(1,1) NOT NULL,
[jb_TypeName] [varchar](150) NULL,
[jb_TypePid] [int] NULL,
[jb_Path] [varchar](128) NULL,
[jb_State] [int] NULL CONSTRAINT [DF_tb_ProType_jb_State]  DEFAULT ((6)),
[jb_CreateTime] [datetime] NULL,
[jb_Order] [int] NULL,
CONSTRAINT [PK_tb_ProType] PRIMARY KEY CLUSTERED
(
[jb_Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(124,'数码产品',0,'0,');
INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(125,'手机','124','0,124,');
INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(126,'笔记本电脑',124,'0,124,');
INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(127,'联想',126,0,124,126,);
INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(129,'HP',126,'0,124,126,');
INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(134,'G460',127,'0,124,126,127,');
INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(133,'书类',0,'0,');
INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(128,'企业类',0,'0,');
INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(132,'相机',124,'0,124,');
INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(130,'联想1',127,'0,124,126,127,');
INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(131,'联想3',129,'0,124,126,127,129,');
INSERT INTO [demo].[dbo].[tb_ProType]([jb_Id],[jb_TypeName],[jb_TypePid],[jb_Path])VALUES(135,'计算机书',130,'0,130,');


<?php
//设置GBK编码
header('Content-Type:text/html;charset=GBK');
//这个是编码,用mysql一般是utf-8,但是这mssql,我就用gbk
//网站根目录
define('ROOT_PATH',dirname(__FILE__));          //返回当前的绝对路径
//这是我当前的C:\wamp\www\demo,所有的文件都存放在www,下的demo文件中
define('Host', '127.0.0.1,1433');   //sql的地址与端口,中间为“,”分开,不是":"
define('Name', 'sa');               //mssql 的用户名
define('Pass', '123456');           //这个是mssql 密码
define('DataName', 'demo');         //这个是数据文件名
//设置中国时区
date_default_timezone_set('Asia/Shanghai'); //地区时间
//地区时间设置
@spl_autoload_register('__autoload');
//当__autoload无法加载时,就执行上面的
function __autoload($_className){       //自动引入类
if(file_exists(ROOT_PATH.'/class/'.$_className.'.class.php')){
//系统会在new Mssql时,自动加载这个文件,首先判断一个这个文件是否存在
//如果存在就引入这个类
require_once ROOT_PATH.'/class/'.$_className.'.class.php';
}else{
//如果没有,就是加载错误,不允许向下执行
exit($_className.'.class.php类不存在');
}
}

/*
*
* 类型管理,分页列表
* 提供两个类,class/mssql.class.php   这是mssql操作类,我从网上下载的,修改了一下
* class/page.class.php   这是分页类,也是网上下载的,可以用在mysql中,一样的,不需要
* 更改,还可以放在模板里smarty
* $_page = $_pages->ShowLink();
* 如:$smarty->assign("page",$_page);        <{$page}>
* 就是这么的简单,这是从模板中整理出来的
* */

$_mssql = new Mssql(Host,Name,Pass,DataName);
//new 这个mssql类,当然在class这个文件夹下面要有一个mssql.class.php的文件

@$GetPage = $_GET['page'] ? $_GET['page'] : 1;
//如果传过来的index.php?page=1  有值的话就等于传过来的值,没有就等于1
//就是没有就是第一页

$_pages = new Page();
//new一下这个分页类,这个分页类与什么数据库没有关系的

$_pages->PageSize = 12;//每页条数

/*
* $_pages->PageSize是显示多少记录
* $GetPage是第几页
* 这里mysql里面的不一样,mysql利用了limit,就非常简单了,一看就懂了
* 这里做了一个子查询,与 not in()
*
* */
$_sql = "select top {$_pages->PageSize} * from tb_ProType
where jb_Id not in
(
select top ({$_pages->PageSize}*($GetPage-1)) jb_Id from tb_ProType
)
order by
REPLACE(REPLACE(REPLACE(jb_Path,'0,','1'),',','')+str(jb_id),' ','')
";

//查询“资产信息表”中的所有数据
$Result= $_mssql->execQuery($_sql);
//$Row=$_mssql->getTotalRowNum($Result);//总条数

$ResRows = $_mssql->execQuery('select jb_Id from tb_ProType');
//查询tb_ProInfo表的总条数;

$Rows = $_mssql->getTotalRowNum($ResRows);
//返回查询到的行数,当前这里可以做一个判断,如果返回空的或小于0,就可以代表没有数据

$_pages->Total = $Rows;
//总条数
$_mssql->freeResult($ResRows);
//销毁查询总条数这个集合
$_page = $_pages->ShowLink();
//这样就可以显示分页链接了,就可以直接使用 ECHO 输出了

echo '<table align="center" border="1" width="800">';
while(!!$rs = $_mssql->_fetch_array($Result)){
$m = substr_count($rs['jb_Path'],",")-1;
$strs = str_pad("",$m*6*2," ");
echo '<tr>';
echo '<td>'.$rs["jb_Id"].'</td>';
echo '<td>'.$strs.$rs["jb_TypeName"].'</td>';
if($rs["jb_TypePid"]=='0'){
echo '<td>顶级类别</td>';
}else{
echo '<td>'.$rs["jb_TypePid"].'</td>';
}
echo '<td>'.$rs["jb_Path"].'</td>';
echo '</tr>';
}
echo '<tr><td colspan="5" height="40">'.$_page.'</td></tr>';
echo '</table>';
$_mssql->freeResult($Result);//销毁查询总条数这个集合
unset($_page);//销毁这个变量
unset($_pages); //销毁这个变量
$_mssql->_close();
/*
* 分页就结束了
* */

?>


无限级分类,我只做了一个排序,添加就非常简单了,我也没有做什么递归函数,添加的时候把,Id,e本文来自我的个人网站:http://www.51net.co/本文出自 “爱好者--都市网达” 博客,请务必保留此出处http://lmzj26.blog.51cto.com/1081403/1056773
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: