項目思路分析:一個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];
- }
- }
新聞熱點
疑難解答