PHP在无限分类时注意的一些问题(不保证代码完全正确哦)
1 无限分类的查找(获取所有节点)
代码:
- /**
- * 无限分类查询,默认 pid 为 0
- * @param $pid
- * @return array $res
- */
- protected function selectTree($pid = 0)
- {
- $res = [];
- $sql = "SELECT * FROM " . $this->tbname . " WHERE pid=" . $pid;
- $result = @mysqli_query($this->link, $sql);
- if ($result) {
- $count = mysqli_num_rows($result);
- if ($count > 0) {
- while ($rows = mysqli_fetch_assoc($result)) {
- $rows['children'] = $this->selectTree($rows['id']);
- $res[] = $rows;
- }
- }
- mysqli_free_result($result);
- }
- return $res;
- }
2 无限分类节点的删除,不能单纯地删除当前节点,需要查找到当前节点下的所有子节点,一并删除
代码:
- /**
- * 删除目录树
- * @param $id
- */
- protected function deleteTree($id)
- {
- $res = $this->selectTree($id);
- if (!empty($res)) {
- foreach ($res as $v) {
- $this->deleteTree($v['id']);
- }
- }
- $sql = "DELETE FROM " . $this->tbname . " WHERE id=" . $id;
- mysqli_query($this->link, $sql);
- }
3 **无限分类的编辑,由于在编辑的时候其父级是可选择的,所以有可能造成用户选择到当前节点的子节点(们),所以要进行判断。虽说是无限分类,但正常情况下目录深度是会有限度的,如果给定了目录深度,还要判断选择父级之后的目录深度是否超出范围。
如果将编辑的元素放在其子元素下,所造成的问题:在查询的时候无限循环!!
id |
pid |
name |
1 |
0 |
test1 |
2 |
1 |
test2 |
修改之后:
id |
pid |
name |
1 |
2 |
test1 |
2 |
1 |
test2 |
如上表所示,在进行无限分类查询时,就会陷入死循环!
所以,针对可能会出现的问题,给出下面的解决办法,在用户修改时进行判断,通过则可以修改,未通过则给出提示。
3.1 判断用户选择的是否是当前节点(这个只需要判断选择的节点和当前编辑节点的ID是否相同即可)
3.2 判断用户选择的是否是子节点(如果是的话返回true)
- /**
- * 判断id所对应的元素是否是pid所对应元素的子元素,是的话返回true
- * @param $id
- * @param $pid
- * @return boolean $result
- */
- protected function isChild($id, $pid)
- {
- $result = false;
- $sql = "SELECT pid FROM " . $this->tbname . " WHERE id=" . $id;
- $res = @mysqli_query($this->link, $sql);
- if ($res) {
- while ($rows = mysqli_fetch_assoc($res)) {
- $result = ($pid === $rows['pid']) ? true : (($rows['pid'] !== 0) ? $this->isChild($rows['pid'], $pid) : false);
- }
- }
- return $result;
- }
3.3 判断用户选择的节点是否已经达到目录深度
在做完后面的一步之后,这一步就比较好实现了:
- /**
- * 判断所选元素是否达到目录深度,达到返回true
- * @param $id
- * @return mixed
- */
- protected function isMaxDeep($id)
- {
- return $this->deepUp($id) >= $this->maxDeep;
- }
3.4 判断修改之后的目录深度是否超出限定范围
- /**
- * 修改之后的最终深度,如果深度大于规定深度,返回true
- * @param $pid
- * @param $id
- * @return mixed
- */
- protected function lastDeep($pid, $id)
- {
- return ($this->deepUp($pid) + $this->deepDown($id)) > $this->maxDeep;
- }
- /**
- * 向上查找父元素的深度
- * @param $id
- * @param int $k
- * @return int
- */
- protected function deepUp($id, $k = 1)
- {
- $sql = "SELECT pid FROM " . $this->tbname . "WHERE id=" . $id;
- $res = @mysqli_query($this->link, $sql);
- if ($res) {
- while ($rows = mysqli_fetch_assoc($res)) {
- ($rows['pid'] !== 0) && $k = $this->deepUp($rows['pid'], $k+1);
- }
- }
- return $k;
- }
- /**
- * 向下查找子元素的深度
- * @param $id
- * @param int $k
- * @return int
- */
- protected function deepDown($id, $k = 0)
- {
- $sql = "SELECT * FROM " . $this->tbname . "WHERE pid=" . $id;
- $res = @mysqli_query($this->link, $sql);
- if ($res && mysqli_num_rows($res) > 0) {
- $k++;
- while ($rows = mysqli_fetch_assoc($res)) {
- $k = max($k, $this->deepDown($rows['id'], $k))
- }
- }
- return $k;
- }
经过上面的判断之后,根据返回的结果就能判断是否可以修改,如果返回true,则不可以修改,如果是false则可以进行修改。
(如果不用无限分类查询,只是普通的查询,让前端去实现结果的显示会怎么样呢??不懂那些框架是怎么实现的,感觉也是在用递归)
PHP在无限分类时注意的一些问题(不保证代码完全正确哦)的更多相关文章
- MySql无限分类数据结构--预排序遍历树算法
MySql无限分类数据结构--预排序遍历树算法 无限分类是我们开发中非常常见的应用,像论坛的的版块,CMS的类别,应用的地方特别多. 我们最常见最简单的方法就是在MySql里ID ,parentID, ...
- TreeView递归绑定无限分类数据
TreeView递归绑定无限分类数据 实现一个动态绑定,无限级分类数据时,需要将数据绑定到TreeView控件,分类表的结构是这样的: 字段 类型 Id int ParentId int Name N ...
- PHP全路径无限分类原理
全路径无限分类:以一个字段把他所有的父级id按顺序记录下来以此实现的无限分类叫做全路径无限分类 优点:查询方便 缺点:增加,移动分类时数据维护时稍微复杂.
- PHP实现无限分类
PHP实现无限分类 无限分类 递归 无限级分类是一种设计技巧,在开发中经常使用,例如:网站目录.部门结构.文章分类.笔者觉得它在对于设计表的层级结构上面发挥很大的作用,比如大家在一些平台上面,填写邀请 ...
- laravel-nestedset:多级无限分类正确姿势
laravel-nestedset:多级无限分类正确姿势 laravel-nestedset是一个关系型数据库遍历树的larvel4-5的插件包 目录: Nested Sets Model简介 安 ...
- 后台树状菜单,js实现递归无限分类
//新闻类别管理 public function new_classify() { $arr = M('news_classify')->where("fid = 0")-& ...
- 关于无限分类的树状输出(id,name,pid)类型的
首先创建无限分类的数据表,我这里采用的是id.name.pid这种类型(当然还有很多种无限分类的方式了,比如:id.name.pid.path.left.right左右节点的形式) CREATE TA ...
- php递归方法实现无限分类实例
数组: 代码如下 复制代码 $items = array( array('id' => 1, 'pid' => 0, 'name' => '一级11' ), array('id' ...
- PHP+Mysql无限分类的方法汇总
无限分类是个老话题了,来看看PHP结合Mysql如何实现.第一种方法这种方法是很常见.很传统的一种,先看表结构表:categoryid int 主键,自增name varchar 分类名称pid in ...
随机推荐
- hdu5111 树链剖分,主席树
hdu5111 链接 hdu 思路 先考虑序列上如何解决. 1 3 2 5 4 1 2 4 5 3 这个序列变成 1 2 3 4 5 1 3 5 5 2 是对答案没有影响的(显然). 然后查询操作\( ...
- 2014(5)系统设计,web应用
[案例五](共25分) 阅读以下关于Web应用的叙述,在答题纸上回答问题1至问题2. [说明] 某软件公司拟为其客户开发一套基于Web的电子商务系统,该系统向终端用户提供在线购物功能.近期,项目组召开 ...
- 每日一问:谈谈 volatile 关键字
这是 wanAndroid 每日一问中的一道题,下面我们来尝试解答一下. 讲讲并发专题 volatile,synchronize,CAS,happens before, lost wake up 为了 ...
- 1-6docker数据共享与持久化
1.在 Docker 内部以及容器之间管理数据,在容器中管理数据主要有两种⽅式: 数据卷(Data Volumes) 挂载主机⽬录 (Bind mounts) 2.数据卷 数据卷 是⼀个可供⼀个或多个 ...
- 一道经典的Java面试题:equals ,== 和hashcode()的区别
一句话区别:==比较的是内存地址,equals比较的是值内容 结论: 从以下三点展开: 基本数据类型.字符串.对象 对于基本数据类型:只有==,没有equals. 对于字符串:==比较的是内存地址,e ...
- jquery swipper插件的一些弊端
jquery swipper插件的一些弊端touch触摸机制是swipper的 阻止click冒泡.拖动Swiper时阻止click事件.下面这个方法或许可以解决触摸机制的问题 <pre> ...
- PHP正则匹配网址
/** * @param $url 网址 * @return bool */ public static function checkUrl($url){ $pattern="/^(http ...
- 65 TCP连接中,流的关闭会造成Socket的关闭
转自:https://blog.csdn.net/u012525096/article/details/76924627 今天写安卓向服务器发送图片,过程为:客户端发送数据->服务器接收.处理数 ...
- C++ 结构体、模板、类、重载初使用
目的:需要几个缓存用的数组900*750 首先定义一个模板<参数数据类型,参数1,参数2> 定义一个class类 名字自己取ap_uint0 下面是公用的数组模板[lrow][lcol] ...
- Lambda表达式和函数式编程
Lambda表达式和函数式编程 https://www.cnblogs.com/bigbigbigo/p/8422579.html https://www.runoob.com/java/java8- ...