基于php无限分类的深入理解


Posted in PHP onJune 02, 2013

无限分类是实际开发中经常用到的一种数据结构,一般我们称之为树形结构。
题设:类似淘宝的商品分类,可以在任意分类设置其子类。
 
一、创建`type`数据表
`id` 自增长
`fid` int(11) 默认(0) ,父节点id
`name` varchar(50),分类名称

CREATE TABLE `type` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `fid` int(11) NOT NULL DEFAULT '0',
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
)

二、添加
我们先添加几个顶级分类
INSERT INTO `type` (`id`, `fid`, `name`) VALUES (NULL, '0', '手机');
INSERT INTO `type` (`id`, `fid`, `name`) VALUES (NULL, '0', '电脑');
INSERT INTO `type` (`id`, `fid`, `name`) VALUES (NULL, '0', '鞋子');
INSERT INTO `type` (`id`, `fid`, `name`) VALUES (NULL, '0', '衣服');

这里fid=0是代表顶级分类

接着我们为{电脑}添加几个个子分类

INSERT INTO `type` (`id`, `fid`, `name`) VALUES (NULL, '2', '台式'), (NULL, '2', '笔记本');

这里fid=2,2这个id是分类{电脑}的id,如果是添加{鞋子}的子分类则fid=3
同理我们为{笔记本}添加子分类则fid=6
INSERT INTO `type` (`id`, `fid`, `name`) VALUES (NULL, '6', 'ausu'), (NULL, '6', 'hp');

三、删除
如果我们想删除{笔记本}这个分类,很简单
DELETE FROM `type` WHERE `id`=6

{笔记本}的子分类我们也要记得做相应的处理
function del($fid) {
    $sql="SELECT * FROM `type` WHERE `fid`=$fid";
    $rs=mysql_query($sql);    for ($i = 0; $i < count($rs); $i++) {
        $sql="DELETE FROM `type` WHERE `id`={$rs[$i]['id']}";
        mysql_query($sql);
        del($rs['id']);//递归
    }
}
del(6);//执行操作

这里你也许你会疑惑为什么那么麻烦用递归,而不是直接这样删除
DELETE FROM `type` WHERE `fid`=6

这样我们不就可以直接删除{ausu}、{hp}?但是假设{ausu}有一个子分类{a1},{a1}也有一个子分类{a2},如果不用递归我们就无法彻底删除数据。

三、查找
1.查找{电脑}的子分类

SELECT * FROM `type` WHERE `fid`=2

2.查找{电脑}的所有子分类
function sel($fid) {
    $sql="SELECT * FROM `type` WHERE `fid`=$fid";
    $rs=mysql_query($sql);    for ($i = 0; $i < count($rs); $i++) {
        echo $rs[$i]['name'];
        sel($rs[$i]['id']);//递归
    }
}
sel(2);

四、实际数据应用
在数据表添加一个字段`tid`,字段值为记录所属分类`type`表的id。必须是id不能是name,因为name的值可能会改变。
例如查询属于{电脑}分类的商品
SELECT * FROM `goods` WHERE `tid`=2

注:代码没有运行过可能会有错误,但是思路是正确的,主要的是理解树形结构,而不是记住代码。
PHP 相关文章推荐
PHP.MVC的模板标签系统(三)
Sep 05 PHP
PHPWind 发帖回帖Api PHP版打包下载
Feb 08 PHP
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
Apr 15 PHP
php快速url重写 更新版[需php 5.30以上]
Apr 20 PHP
PHP学习之数组的定义和填充
Apr 17 PHP
探讨PHP中OO之静态关键字以及类常量的详解
Jun 07 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
Nov 19 PHP
php中实现用数组妩媚地生成要执行的sql语句
Jul 10 PHP
Java中final关键字详解
Aug 10 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
Nov 16 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
Jul 22 PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
Dec 12 PHP
php curl的深入解析
Jun 02 #PHP
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
Jun 02 #PHP
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
Jun 01 #PHP
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
Jun 01 #PHP
php源代码安装常见错误与解决办法分享
May 28 #PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
May 27 #PHP
php 深入理解strtotime函数的使用详解
May 23 #PHP
You might like
常用的php ADODB使用方法集锦
2008/03/25 PHP
thinkphp修改配置进入默认首页的方法
2017/02/07 PHP
总结一些js自定义的函数
2006/08/05 Javascript
jquery last-child 列表最后一项的样式
2010/01/22 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
2014/06/23 Javascript
用canvas 实现个图片三角化(LOW POLY)效果
2016/02/18 Javascript
webpack常用配置项配置文件介绍
2016/11/07 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
JavaScript代码判断输入的字符串是否含有特殊字符和表情代码实例
2017/08/17 Javascript
JS简单获取并修改input文本框内容的方法示例
2018/04/08 Javascript
JavaScript实现一个带AI的井字棋游戏源码
2018/05/21 Javascript
nuxt.js中间件实现拦截权限判断的方法
2018/11/21 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
2019/02/27 Javascript
浅谈关于vue中scss公用的解决方案
2019/12/02 Javascript
JS实现滑动导航效果
2020/01/14 Javascript
python实现数通设备tftp备份配置文件示例
2014/04/02 Python
python保存字符串到文件的方法
2015/07/01 Python
在Windows系统上搭建Nginx+Python+MySQL环境的教程
2015/12/25 Python
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
2018/01/09 Python
python更改已存在excel文件的方法
2018/05/03 Python
Python中函数参数匹配模型详解
2019/06/09 Python
django之使用celery-把耗时程序放到celery里面执行的方法
2019/07/12 Python
使用IPython或Spyder将省略号表示的内容完整输出
2020/04/20 Python
python中HTMLParser模块知识点总结
2021/01/25 Python
EJB的几种类型
2012/08/15 面试题
信息科学与技术专业求职信范文
2014/02/20 职场文书
电子信息专业应届生自荐信
2014/06/04 职场文书
学校学习雷锋活动总结
2014/07/03 职场文书
关于感恩的演讲稿200字
2014/08/26 职场文书
小学班主任事迹材料
2014/12/17 职场文书
英文辞职信范文
2015/05/13 职场文书
和谐拯救危机观后感
2015/06/15 职场文书
男方家长婚礼答谢词
2015/09/29 职场文书
用 Python 元类的特性实现 ORM 框架
2021/05/19 Python
NoSQL优缺点与MongoDB数据库简介
2022/06/05 MongoDB