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怎么实现一个无限级分类,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。
php mysql怎么实现,使用php与mysql怎么实现一个无限级分类相关推荐
- mysql 5.7 xbackup_CentOS 7 下 MySQL 5.7 配置 Percona Xtrabackup
前言 CentOS 7 下 MySQL 5.7 配置 Percona Xtrabackup ,记录一下大致的安装和配置过程. Percona XtraBackup 的备份工具支持热备份(即不必停止 M ...
- vba与MySQL交互_Excel、VBA与MySQL交互
几次更新失败,我已经放弃在这里更新了,有需要可以到博客园看: ################################################################ 本文主要 ...
- mysql数据库建仓范式_存mysql个数
MySQL学习笔记之数据类型详解 注:以下内容针对MySQL5.0及以上版本 MySQL的数据类型非常多,选择正确的数据类型对于获得高性能至关重要,本文是我结合网上看到的一些blog加上<高性能 ...
- mysql替换开头_如何在MySQL的字符串开头搜索和替换特定字符?
为此,您可以使用INSERT().让我们首先创建一个表-mysql> create table DemoTable -> ( -> ZipCode varchar(200) -> ...
- mysql 集群操作系统_高性能MySQL集群详解(二)
一.通过Keepalived搭建MySQL双主模式的高可用集群系统 1.MySQL Replication介绍: MySQL Replication是MySQL自身提供的一个主从复制功能,其实也就是一 ...
- 把本地mysql备份到服务器innodb_使用mysql备份工具innobackupex将本地数据 直接恢复 到远端服务器数据目录操作实例...
innobackupex 支持所有mysql引擎数据备份恢复安装配置方法及原理介绍,访问下面链接 http://michaelkang.blog.51cto.com/1553154/1216826 测 ...
- mysql主从数据库含义_(转)Mysql数据库主从心得整理
管理mysql主从有2年多了,管理过200多组mysql主从,几乎涉及到各个版本的主从,本博文属于总结性的,有一部分是摘自网络,大部分是根据自己管理的心得和经验所写,整理了一下,分享给各位同行,希望对 ...
- mysql如何实现实时存储_OpenResty + Mysql 实现日志实时存储
应用场景和日志文件解析 本配置主要解决 Nginx 向 MySQL 中实时插入日志的问题,采用 OpenResty + Mysql 实现. 1. 刚开始的时候看了 Nginx 和 MySQL 的连接模 ...
- mysql 主从复制 和基于gtid的mysql主从复制
主从复制 原理: mysql 无需借助第三方工具,而是其自带的同步复制功能,另外一点,mysql 的主从 复制并不是从硬盘给上文件直接同步,而是逻辑的 binlog 日志同步到本地的应用执行的过 程. ...
最新文章
- 系统启动过程Linux
- get;get属性器
- opencv findContours 报错_acrt_first_block == header
- 征信报告上那些你不知道的事
- android2.2 froyo竖屏显示
- Arduino 例程编译错误 error: unknown type name uint_farptr_t did you mean uint_fast8_t
- 廖雪峰Git教程笔记(十一)添加远程库
- 什么是servlet ,servlet的作用
- 下载腾讯视频(mp4 格式)
- mysql5.5忘记密码重置方法_mysql5.5忘记密码重置方法
- mysql 将年月日转换成年_SQL数据库中怎么将时间格式转换到年和月?
- Ubuntu中程序崩溃,杀死进程方法
- 深度解析:CPU与GPU有什么区别?xPU又是什么鬼?
- odoo中的消息通知
- 哥德巴赫猜想(升级版)
- MySQL期末复习题和答案
- 图像增强及直方图均衡化在图像去雾上的应用(附matlab代码)
- 微型计算机DEC影响零标志位吗,汇编语言中常用指令对标志位寄存器的影响
- coap协议学习之搭建coap测试环境
- ARCGIS10.2加载天地图不显示
热门文章
- 单片机、ARM、DSP与CPU之间的关系大揭秘
- 物联网常用的组网方式浅析
- 写出下列的中文意思 HTML,计算机网络技术考试试题纸B卷
- linux 信号量锁 内核,Linux内核信号量互斥锁应用
- LaTeX indicator function
- tpcc mysql优化_tpcc_mysql性能测试
- 算法题:在一个字符串中找到只出现一次的字符。如输入abaccdeeff,则输出bd。
- c语言7.5return的值是,这个真心搞不懂了。求助
- 问题 1051: [编程入门]结构体之成绩统计2
- 在cygwin下编译c语言