基于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 中执行系统外部命令
Oct 09 PHP
基于mysql的论坛(1)
Oct 09 PHP
PHP 第三节 变量介绍
Apr 28 PHP
php取整函数ceil,floo,round的用法及介绍
Aug 31 PHP
使用PHP破解防盗链图片的一个简单方法
Jun 07 PHP
php对文件进行hash运算的方法
Apr 03 PHP
php通过exif_read_data函数获取图片的exif信息
May 21 PHP
WordPress中转义HTML与过滤链接的相关PHP函数使用解析
Dec 22 PHP
PHP的Laravel框架中使用AdminLTE模板来编写网站后台界面
Mar 21 PHP
php实现计算百度地图坐标之间距离的方法
May 05 PHP
laravel实现按月或天或小时统计mysql数据的方法
Oct 09 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 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连接数据库代码应用分析
2011/05/29 PHP
PHP采集利器 Snoopy 试用心得
2011/07/03 PHP
thinkphp循环结构用法实例
2014/11/24 PHP
phplot生成图片类用法详解
2015/01/06 PHP
php实现两个数组相加的方法
2015/02/17 PHP
php解决安全问题的方法实例
2019/09/19 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
2020/10/27 PHP
JScript中的&quot;this&quot;关键字使用方式补充材料
2007/03/08 Javascript
jquery的index方法实现tab效果
2011/02/16 Javascript
在jquery中处理带有命名空间的XML数据
2011/06/13 Javascript
jQuery 获取URL的GET参数值的小例子
2013/04/18 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
jQuery中add()方法用法实例
2015/01/08 Javascript
Jquery实现动态切换图片的方法
2015/05/18 Javascript
浅谈jQuery页面的滚动位置scrollTop、scrollLeft
2015/05/19 Javascript
javascript加减乘除的简单实例
2016/07/12 Javascript
js无法获取到html标签的属性的解决方法
2016/07/26 Javascript
javascript获取网页各种高宽及位置的方法总结
2016/07/27 Javascript
canvas的神奇用法
2017/02/03 Javascript
vue 请求后台数据的实例代码
2017/06/22 Javascript
使用 jQuery 实现表单验证功能
2017/07/05 jQuery
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
Angular2整合其他插件的方法
2018/01/20 Javascript
JavaScript计算正方形面积
2019/11/26 Javascript
python中print的不换行即时输出的快速解决方法
2016/07/20 Python
Python定时任务APScheduler原理及实例解析
2020/05/30 Python
HTML5 客户端数据库简易使用:IndexedDB
2019/12/19 HTML / CSS
自荐信怎么写好
2013/11/11 职场文书
消防安全责任书
2014/04/14 职场文书
产品质量保证书范本
2015/02/27 职场文书
罗马假日观后感
2015/06/08 职场文书
幼儿园六一儿童节开幕词
2016/03/04 职场文书
Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤
2021/03/29 Python
Django项目如何获得SSL证书与配置HTTPS
2021/04/30 Python
mysql中数据库覆盖导入的几种方式总结
2022/03/25 MySQL
一文解答什么是MySQL的回表
2022/08/05 MySQL