php mysql怎么实现,使用php与mysql怎么实现一个无限级分类

使用php与mysql怎么实现一个无限级分类

发布时间:2020-12-25 15:25:14

来源:亿速云

阅读:84

作者:Leah

本篇文章为大家展示了使用php与mysql怎么实现一个无限级分类,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

项目思路分析:一个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 "";

echo "主分类";

for($i=0; $i

$rankArr = split("/",$classArr[$i]['rank']);

$ranknum = count($rankArr);

$t = "";

for($j=1; $j

$t .= "├┄┄";

}

echo "".$t.$classArr[$i]['classname']."";

}

echo ""

?>

//保存时的操作,需要判断是否为主分类,当为主类时, 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 "";

echo "主分类";

for($i=0; $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

$t .= "├┄┄";

}

if($pid == $classArr[$i]['id']){

$selected = "selected";

}else{

$selected = "";

}

echo "".$t.$classArr[$i]['classname']."";

}

echo ""

?>

// 保存时的操作

// 要做到改动时该分类的所有子分类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怎么实现一个无限级分类,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357628.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jsf tree组件_JSF和“立即”属性–命令组件

jsf tree组件JSF中的即时属性通常被误解。 如果您不相信我&#xff0c;请查看Stack Overflow 。 造成混淆的部分原因可能是由于输入&#xff08;即<h&#xff1a;inputText />&#xff09;和命令&#xff08;即<h&#xff1a;commandButton />&#xff09;组件都立…

笔记本电脑电池显示4%可用(已接通电源),经过清灰又莫名奇妙的可以续航啦,很奇怪!

公司的办公电脑&#xff0c;估计是转手租用好几年了&#xff0c;今天打开一看电池一直充电充不进去。刚开始一直充电显示笔记本电脑电池显示7%可用&#xff0c;等会断电打开笔记本电脑电池显示4%可用。我已经感觉电池坏了&#xff0c;然后我感觉电脑好久没有清灰了&#xff0c;…

call()和apply()方法(切换上下文)

call方法: 语法&#xff1a;call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义&#xff1a;调用一个对象的一个方法&#xff0c;以另一个对象替换当前对象。 apply方法&#xff1a; 语法&#xff1a;apply([thisObj[,argArray]]) 定义&#xff1a;应用某一对象的一个方法&…

python爬取ajax动态内容肯德基门店,Python爬虫如何爬取KFC地址

随着人们生活水平的提高&#xff0c;肯德基这类的快餐消费的十分火爆&#xff0c;成为小朋友和年轻人的最爱&#xff0c;我们到一个地方想要找到肯德基店面&#xff0c;会根据导航获取肯德基地址&#xff0c;那你知道我们也可以使用python爬虫获取KFC地址吗&#xff1f;我们可以…

使用Java 8 CompletableFuture和Rx-Java Observable

我想使用Java 8 CompletableFuture和Rx-Java Observable探索一个简单的分散聚集场景。 场景很简单–产生大约10个任务&#xff0c;每个任务返回一个字符串&#xff0c;最终将结果收集到一个列表中。 顺序的 其顺序版本如下&#xff1a; public void testSequentialScatterGa…

百度网盘限速解决方案

解决各种网盘工具的助手,解决百度网盘限速的解决办法。 KinhDown 官网:https://kinhdown.kinh.cc/ KinhDown 支持百度网盘 Windows、安卓,可以免登录解除部分百度网盘资源限速问题。 下载 雷鸟下载 雷鸟下载是一款基于多资源超线程技术的下载软件,雷鸟下载针对各类网盘做…

hdu 2028

PS:以前对long long型的数据就一直不怎么明白...弄了好久... long long a; scanf("%lld",&a); printf("%lld",a); 这样才行 代码:#include "stdio.h"void swap(long long *a,long long *b){ long long t; t*a; *a*b; *bt;}long long gcd(lon…

MyEclipes+JSP+SSH+MySQL实现一个文章发布系统

导读:随着计算机技术的迅速发展,网络正以一种前所未有的冲击力影响着人类的生产和生活。网络的快速发展,颠覆了传统的信息传播方式,冲破了传统的时间,空间的局限性,继而引发了人类阅读方式的变革。现如今,网络阅读已成为一种新的时尚,在这种趋势下,文章发布系统应运而…

zblog php 侧边栏样式,ZBlogPHP免费主题Blogs如何修改侧边栏搜索框样式?

老古偶尔访问有某些使用 ZBlogPHP 免费主题 Blogs 的站点&#xff0c;发现他们的侧边栏搜索框样式都比较丑&#xff0c;一看就知道这些站长都没有认真阅读Blogs 主题介绍页&#xff0c;因为介绍页中的第四大点侧边栏模块使用第 5 小点就介绍了如何修改侧边栏搜索框样式。下图左…

BZOJ 3511 土地划分

AC通道&#xff1a;http://www.lydsy.com/JudgeOnline/problem.php?id3511 题目分析&#xff1a; 看上去和前面的人员雇佣以及小M种田都很像。 最小割模型来求最大值&#xff0c;一般都是考虑怎样构图使得满足一个组合能被表示出来&#xff0c;而且当满足一个组合的时候&#…

MyEclipes+html+jsp+mysql实现一个物流信息网

导读:该系统使用java语言开发,使系统具有更好的平台性和可扩展性。 该系统实现了用户登录、注册、查询快递信息、快递公司注册成为合作伙伴以及系统管理员对信息进行管理等功能。系统的主要界面会将所有的服务排列好,用户可以自行选择服务。用户可以查询快递的详细信息以…

oracle pl/sql编程详解,OraclePL/SQL高级编程详解

–创建一个表&#xff0c;此表作为子表create table fk_t as select *from user_objects;delete from fk_t where object_id is null;commit;–创建一个表&#xff0c;此表作为父表create table pk_t as select *from user_objects;delete from pk_t where object_id is null;c…

使用Unsafe真的是关于速度或功能吗?

总览 大约6年前&#xff0c;我开始使用一个类&#xff0c;直到那时&#xff0c;它只是一个好奇心sun.misc.Unsafe 。 我曾使用它进行反序列化和重新抛出Exception&#xff0c;但没有使用它的全部功能或公开谈论它。 我看到的第一个严重使用Unsafe的开源库是Disruptor。 这使我…

css全局设置

/***** 全局设置 *****/body,h1,h2,h3,h4,h5,h6,p,form,ul,ol,li,dt,dl,dd,th,td,label,bottom,input,textarea{ margin:0;padding:0;}body{font-family:"宋体", arial;font-size:12px;line-height:1.5;text-align:left;background:#FFF;color:#000;}h1,h2,h3,h4,h5,…

MyEclipes+JSP+tomcat+MySQL实现JavaEE平台项目管理系统

导读:随着社会信息化的发展,很多的社会管理问题也一并出现了根本性变化,项目公司的报表及文件管理也发生了变化,以前的管理是一个分布式的信息,然后围绕中心由通过简单的来传输信息,这使得办事效率非常低下,所以需要需要适用信息货的发展,开发一套项目的管理信息系统。…

可以升级oracle版本吗,怎么升级oracle版本

Oracle数据库升级也并非简单的事&#xff0c;这篇文章对Oracle那点事做了较详细的介绍&#xff1a;Oracle数据库升级或数据迁移方法研究我还属于Oracle的菜鸟&#xff0c;就不献丑介绍了。下面我就简单总结下,Oracle同版本升级的经历:升级数据库&#xff1a;1. 先检查数据库当前…

Mac OS X下安装nvm的方法

最近准备学习一下node.js&#xff0c;到youtube上搞了些视频回家看。结果在ubuntu上面安装nvm都ok了&#xff0c;坑货mac搞不定。 经过不断尝试&#xff0c;google&#xff0c;youtube&#xff0c;终于发现了如何搞定。现特将步骤记录&#xff0c;聊以自慰。 安装node.js原本需…

Myesclipe+SSH+jsp+mysql+tomcate实现一个简单的CRM客户关系管理系统

导读: CRM客户关系管理系统的目的通过客户管理,产品管理,系统管理等功能同客户建立联并收集客户信息,此基础上满足客户"一对一"个性化服务。同时信息在企业的流程上得以流转,让客户得到高效的,满意的服务。本系统包括信息管理、客户管理、产品管理等多项功能。…

adf平稳性检测_ADF声明性组件示例

adf平稳性检测在我以前的文章中&#xff0c;我答应展示如何为智能值列表创建ADF声明性组件。 因此&#xff0c;我将创建一个包含三个元素的组件&#xff1a;标签&#xff0c;输入文本和值的组合框列表。 那很容易。 我在工作空间中创建了一个单独的ADF ViewController项目&…

oracle 计算中位数,SQL 如何计算每个分组的中位数

中位数是指一组数据排序以后&#xff0c;位于中间位置的数据值。如果数据个数是奇数&#xff0c;中位数就是最中间位置那个值&#xff1b;如果是偶数&#xff0c;则是中间位置那两个数的平均值。怎么查询出数据分组以后每个组的中位数呢&#xff1f;用SQL来解决这个问题是很有难…