php mysql怎么实现,使用php与mysql怎么实现一个无限级分类
使用php與mysql怎么實現(xiàn)一個無限級分類
發(fā)布時間:2020-12-25 15:25:14
來源:億速云
閱讀:84
作者:Leah
本篇文章為大家展示了使用php與mysql怎么實現(xiàn)一個無限級分類,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
項目思路分析:一個PHP項目要用到分類,但不確定分幾級,所以就想做成無限級分類。
一開始想是按以前一樣,數(shù)據(jù)庫建4個值,如下:
id: 自增?? |?? pid: 父類ID?? |? xid: 排序ID?? |? classname: 分類名稱
后來想到這種在讀取數(shù)據(jù)時和修改時比較不方便,而且在產(chǎn)品讀取時尤其不便,于時改成了以下的方案:
在Mysql的表中新增了一個字段,現(xiàn)數(shù)據(jù)庫如下:
表名 w_faqclass:?? id: 自增?? |?? pid: 父類ID?? |? xid: 排序ID?? |? classname: 分類名稱? |? rank:? 等級
定義:
一級分類,pid 為 0 ,rank 為"/"
二級分類,pid 為 一級分類的id,rank 為"/一級分類的id/"
三級分類,pid 為 二級分類的id,rank 為"/一級分類的id/二級分類的id/"
依此類推...
1. 基礎(chǔ)函數(shù)/*
利于遞歸返回已經(jīng)進行了排序的無限級分類的數(shù)組
不想用遞歸的話也可以用?like?來獲取后再進行排序,我比較懶,就不寫那種獲取方式了,其實用?like?更好,推薦用那種方式
$datatable????:?數(shù)據(jù)表名
$startid????:?開始父類ID
$wheretColumns??:父類列名
$xColumns????:?排序列名
$xtype??????:?排序方式
$returnArr????:?返回數(shù)組
*/
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????:?數(shù)據(jù)表名
$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?""
?>
//保存時的操作,需要判斷是否為主分類,當(dāng)為主類時,?rank?值設(shè)為?/
//查詢父類的?rank?值,用父類的?rank?加上?父類的?id?值
if($pid?!=?0){
$pidrank?=?SelectValue('w_faqclass',$pid,'rank','id');
$rank?=?$pidrank.$pid."/";
}else{
$rank?=?"/";
}
3. 修改分類<?php
/*
注意,因為是修改,在此頁面加載時已將當(dāng)前分類的所有值讀出來了,對應(yīng)是:$pid,$rank
*/
$classArr?=?ReadClass('w_faqclass','0','asc',array());
$canum?=?count($classArr);
echo?"";
echo?"主分類";
for($i=0;?$i
//?因為是修改,所以當(dāng)前分類不能選擇自身或自身以下的分類,多加個?rank?值的優(yōu)勢啊,哈哈,以前做單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){
...
}
上述內(nèi)容就是使用php與mysql怎么實現(xiàn)一個無限級分類,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。
總結(jié)
以上是生活随笔為你收集整理的php mysql怎么实现,使用php与mysql怎么实现一个无限级分类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 点击文本框弹出时间,点击Inpu
- 下一篇: oracle pl/sql编程详解,Or