基于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技巧与注意事项分析
Feb 03 PHP
php curl 伪造IP来源的实例代码
Nov 01 PHP
php读取图片内容并输出到浏览器的实现代码
Aug 08 PHP
thinkphp模板输出技巧汇总
Nov 24 PHP
Codeigniter的一些优秀特性总结
Jan 21 PHP
php上传图片客户端和服务器端实现方法
Mar 30 PHP
php实现SAE上使用storage上传与下载文件的方法
Jun 29 PHP
PHP常见错误提示含义解释(实用!值得收藏)
Apr 25 PHP
yii2超好用的日期组件和时间组件
May 05 PHP
使用Zttp简化Guzzle 调用
Jul 02 PHP
CI框架(CodeIgniter)操作redis的方法详解
Jan 25 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
May 09 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 socket方式提交的post详解
2008/07/19 PHP
一个非常完美的读写ini格式的PHP配置类分享
2015/02/12 PHP
php+MySQL实现登录时验证登录名和密码是否正确
2016/05/10 PHP
Extjs列表详细信息窗口新建后自动加载解决方法
2010/04/02 Javascript
Javascript中获取出错代码所在文件及行数的代码
2010/09/23 Javascript
jQery使网页在显示器上居中显示适用于任何分辨率
2014/06/09 Javascript
JavaScript Split()方法
2015/12/18 Javascript
JS判断iframe是否加载完成的方法
2016/08/03 Javascript
js中数组插入、删除元素操作的方法
2017/02/15 Javascript
Angularjs添加排序查询功能的实例代码
2017/10/24 Javascript
React Native日期时间选择组件的示例代码
2018/04/27 Javascript
vue-router路由懒加载的实现(解决vue项目首次加载慢)
2018/08/28 Javascript
JS中getElementsByClassName与classList兼容性问题解决方案分析
2019/08/07 Javascript
VUE渲染后端返回含有script标签的html字符串示例
2019/10/28 Javascript
微信小程序实现星级评价
2019/11/20 Javascript
Python 解析XML文件
2009/04/15 Python
跟老齐学Python之print详解
2014/09/28 Python
详解python如何调用C/C++底层库与互相传值
2016/08/10 Python
Django 根据数据模型models创建数据表的实例
2018/05/27 Python
django模板结构优化的方法
2019/02/28 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
python滑块验证码的破解实现
2019/11/10 Python
Python如何实现在字符串里嵌入双引号或者单引号
2020/03/02 Python
Python OrderedDict字典排序方法详解
2020/05/21 Python
时尚的CSS3进度条效果
2012/02/22 HTML / CSS
css背景图片的背景裁切、背景透明度、背景变换等效果运用
2012/12/24 HTML / CSS
来自世界各地的饮料:Flavourly
2019/05/06 全球购物
出国考察邀请函
2014/01/21 职场文书
公司门卫工作职责
2014/06/28 职场文书
党的群众路线教育实践活动对照检查材料思想汇报
2014/09/19 职场文书
常务副县长“三严三实”对照检查材料思想汇报
2014/10/05 职场文书
酒店仓管员岗位职责
2015/04/01 职场文书
董事长新年致辞
2015/07/29 职场文书
2016教师读书思廉心得体会
2016/01/23 职场文书
2019个人工作总结
2019/06/21 职场文书
Pygame Rect区域位置的使用(图文)
2021/11/17 Python