php+mysql实现无限级分类


Posted in PHP onNovember 11, 2015

项目思路分析:一个PHP项目要用到分类,但不确定分几级,所以就想做成无限级分类。
一开始想是按以前一样,数据库建4个值,如下:
id: 自增   |   pid: 父类ID   |  xid: 排序ID   |  classname: 分类名称
后来想到这种在读取数据时和修改时比较不方便,而且在产品读取时尤其不便,于时改成了以下的方案:
在Mysql的表中新增了一个字段,现数据库如下:
表名 w_faqclass:   id: 自增   |   pid: 父类ID   |  xid: 排序ID   |  classname: 分类名称  |  rank:  等级
定义:
一级分类,pid 为 0 ,rank 为"/"
二级分类,pid 为 一级分类的id,rank 为"/一级分类的id/"
三级分类,pid 为 二级分类的id,rank 为"/一级分类的id/二级分类的id/"
依此类推...
1. 基础函数    

/*
利于递归返回已经进行了排序的无限级分类的数组
不想用递归的话也可以用 like 来获取后再进行排序,我比较懒,就不写那种获取方式了,其实用 like 更好,推荐用那种方式
$datatable    : 数据表名
$startid    : 开始父类ID
$wheretColumns  :父类列名
$xColumns    : 排序列名
$xtype      : 排序方式
$returnArr    : 返回数组
*/
function ReadClass($datatable,$startid,$xtype,$returnArr){
  $db    =  $datatable;
  $sid  =  $startid;
  $xtype  =  $xtype;
  $lu    =  $returnArr;
   
  $sql  =  "select * from `".$db."` where `pid`='".$sid."' order by xid ".$xtype.";";
  $cresult=  mysql_query($sql);
  if(mysql_num_rows($cresult)>0){
    while($rs = mysql_fetch_array($cresult)){
      $lunum = count($lu);
      $lu[$lunum]['id']    =  $rs['id'];
      $lu[$lunum]['pid']    =  $rs['pid'];
      $lu[$lunum]['rank']    =  $rs['rank'];
      $lu[$lunum]['classname']=  $rs['classname'];
      $lu[$lunum]['xid']    =  $rs['xid'];
       
      $lu            =  ReadClass($db,$rs['id'],$xtype,$lu);
    }
  }
  return $lu;
}
/*
查询某表中的某个值,只会返回一个值
$datatable    : 数据表名
$wherevalue    : 条件值
$selectColumns  : 查询列名
$whereColumns  : 条件列
*/
function SelectValue($datatable,$wherevalue,$selectColumns,$whereColumns){
  $sql  =  "select `".$selectColumns."` from `".$datatable."` where `".$whereColumns."`='".$wherevalue."';";
  $result  =  mysql_query($sql);
  while($rs = mysql_fetch_array($result)){
    return $rs[$selectColumns];
  }
}

2. 增加分类 (直接做到了select中用于选择 )    

<?php
  $classArr = ReadClass('w_faqclass','0','asc',array());
  $canum = count($classArr);
   
  echo "<select name='pid'>";
  echo "<option value='0'>主分类</option>";
  for($i=0; $i<$canum; $i++){
    $rankArr = split("/",$classArr[$i]['rank']);
    $ranknum = count($rankArr);
    $t = "";
    for($j=1; $j<$ranknum; $j++){ //用于格式化显示子类
      $t .= "├┄┄";
    }
    echo "<option value='".$classArr[$i]['id']."'>".$t.$classArr[$i]['classname']."</option>";
  }
  echo "</select>"
?> 
 
//保存时的操作,需要判断是否为主分类,当为主类时, rank 值设为 /
//查询父类的 rank 值,用父类的 rank 加上 父类的 id 值
if($pid != 0){
  $pidrank = SelectValue('w_faqclass',$pid,'rank','id'); 
  $rank = $pidrank.$pid."/";
}else{
  $rank = "/";  
}

3. 修改分类    

<?php
  /*
  注意,因为是修改,在此页面加载时已将当前分类的所有值读出来了,对应是:$pid,$rank
  */
  $classArr = ReadClass('w_faqclass','0','asc',array());
  $canum = count($classArr);
  echo "<select name='pid'>";
  echo "<option value='0'>主分类</option>";
 
  for($i=0; $i<$canum; $i++){
    // 因为是修改,所以当前分类不能选择自身或自身以下的分类,多加个 rank 值的优势啊,哈哈,以前做单pid值的时候这里还得用次递归查询
    while($ids == $classArr[$i]['id'] || strstr($classArr[$i]['rank'],$rank.$ids."/")){
      $i++;
    }
     
    $rankArr = split("/",$classArr[$i]['rank']);
    $ranknum = count($rankArr);
    $t = "";
    for($j=1; $j<$ranknum; $j++){
      $t .= "├┄┄";
    }
    if($pid == $classArr[$i]['id']){
      $selected = "selected";  
    }else{
      $selected = "";
    }
    echo "<option value='".$classArr[$i]['id']."' ".$selected.">".$t.$classArr[$i]['classname']."</option>";
  }
  echo "</select>"
?>
 
// 保存时的操作
// 要做到改动时该分类的所有子分类rank值都需要变动,选取得原来子分类通用到的 rank 值,也就是该分类的 rank值加上它的ID值
// 利于 mysql 的REPLACE语句进行替换
if($pid != 0){
  $pidrank = SelectValue('w_faqclass',$pid,'rank','id');
  $rank = $pidrank.$pid."/";
}else{
  $rank = "/";  
}
$orank = SelectValue('w_faqclass',$ids,'rank','id').$ids."/";
$nrank = $rank.$ids."/";
   
mysql_query("UPDATE `w_faqclass` SET rank = REPLACE(rank,'".$orank."','".$nrank."');");
mysql_query("UPDATE `w_faqclass` SET `classname`='".$classname."',`xid`='".$xid."',`pid`='".$pid."',`rank`='".$rank."' where `id`='".$ids."';");

4. 删除和查询就简单了,这个就不赘述了,提到一点,记得在删除前确认下该类下面是否存在子类就可以了。

$zid = SelectValue('w_faqclass',$ids,'id','pid');
 
if($zid>0){
  ...
}

以上就是php+mysql实现无限极分类的方法,希望对大家的学习有所帮助。

PHP 相关文章推荐
帖几个PHP的无限分类实现想法~
Jan 02 PHP
php 无限级 SelectTree 类
May 19 PHP
php 生成WML页面方法详解
Aug 09 PHP
PDO版本问题 Invalid parameter number: no parameters were bound
Jan 06 PHP
深入解析php中的foreach函数
Aug 31 PHP
PDO防注入原理分析以及注意事项
Feb 25 PHP
php微信公众平台开发类实例
Apr 01 PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
Dec 17 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
Jul 25 PHP
php中实现进程锁与多进程的方法
Sep 18 PHP
Win10 下安装配置IIS + MySQL + nginx + php7.1.7
Aug 04 PHP
php实现websocket实时消息推送
Mar 30 PHP
2款PHP无限级分类实例代码
Nov 11 #PHP
PHP中set error handler函数用法小结
Nov 11 #PHP
php实现Session存储到Redis
Nov 11 #PHP
PHP防止刷新重复提交页面的示例代码
Nov 11 #PHP
PHP用mb_string函数库处理与windows相关中文字符及Win环境下开启PHP Mb_String方法
Nov 11 #PHP
深入php内核之php in array
Nov 10 #PHP
谈谈你对Zend SAPIs(Zend SAPI Internals)的理解
Nov 10 #PHP
You might like
PHP 文件上传全攻略
2010/04/28 PHP
如何使用Strace调试工具
2013/06/03 PHP
PHP读取CURL模拟登录时生成Cookie文件的方法
2014/11/04 PHP
php操作memcache缓存方法分享
2015/06/03 PHP
刷新PHP缓冲区为你的站点加速
2015/10/10 PHP
[原创]php常用字符串输出方法分析(echo,print,printf及sprintf)
2016/07/09 PHP
PHP大文件分块上传功能实例详解
2019/07/22 PHP
Javascript获取窗口(容器)的大小及位置参数列举及简要说明
2012/12/09 Javascript
JQuery加载图片自适应固定大小的DIV
2013/09/12 Javascript
jquery ajax跨域解决方法(json方式)
2014/02/04 Javascript
一个实用的图片切换支持点击切换和自动轮播
2014/09/09 Javascript
js创建数组的简单方法
2016/07/27 Javascript
js 定义对象数组(结合)多维数组方法
2016/07/27 Javascript
js实现对table的增加行和删除行的操作方法
2016/10/13 Javascript
详解jQuery的表单验证插件--Validation
2016/12/21 Javascript
JQuery统计input和textarea文字输入数量(代码分享)
2016/12/29 Javascript
详解在AngularJS的controller外部直接获取$scope
2017/06/02 Javascript
浅谈vuepress 踩坑记
2018/04/18 Javascript
layui-select动态选中值的例子
2019/09/23 Javascript
使用zrender.js绘制体温单效果
2019/10/31 Javascript
react中hook介绍以及使用教程
2020/12/11 Javascript
Swift 3.0在集合类数据结构上的一些新变化总结
2016/07/11 Python
Python列表和元组的定义与使用操作示例
2017/07/26 Python
Python字典数据对象拆分的简单实现方法
2017/12/05 Python
python爬虫超时的处理的实例
2018/12/19 Python
python requests.post带head和body的实例
2019/01/02 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
2019/08/13 Python
pytorch 自定义数据集加载方法
2019/08/18 Python
详解PyTorch中Tensor的高阶操作
2019/08/18 Python
python如何删除文件、目录
2020/06/23 Python
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
社团文化节策划书
2014/02/01 职场文书
主持词开场白
2014/03/17 职场文书
《锄禾》教学反思
2014/04/08 职场文书
孕妇离婚协议书范本
2014/11/20 职场文书
mysql性能优化以及配置连接参数设置
2022/05/06 MySQL