php mysql implements unlimited classification, phpmysql unlimited level_PHP tutorial

WBOY
Release: 2016-07-12 09:05:11
Original
735 people have browsed it

php mysql implements unlimited classification, phpmysql has unlimited classification

Project idea analysis: A PHP project needs to use classification, but it is not sure how many levels it is divided into. So I want to make infinite classification.
At first I thought I would create 4 values ​​in the database as before, as follows:
id: auto-increment | pid: parent class ID | xid: sorting ID | classname: category name
Later, I thought that this was inconvenient when reading data and modifying it, and it was especially inconvenient when reading products, so I changed it to the following solution:
A new field has been added to the Mysql table. The database is now as follows:
Table name w_faqclass: id: auto-increment | pid: parent class ID | xid: sort ID | classname: category name | rank: level
Definition:
Level 1 classification, pid is 0, rank is "/"
Second-level classification, pid is the id of the first-level classification, rank is "/the id of the first-level classification/"
Three-level classification, pid is the id of the second-level classification, rank is "/the id of the first-level classification/the id of the second-level classification/"
And so on...
1. Basic functions

/*
利于递归返回已经进行了排序的无限级分类的数组
不想用递归的话也可以用 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];
  }
}
Copy after login

2. Add categories (directly used for selection in select)

<&#63;php
  $classArr = ReadClass('w_faqclass','0','asc',array());
  $canum = count($classArr);
   
  echo "<select name='pid'>";
  echo "<option value='0'>主分类</option>";
  for($i=0; $i<$canum; $i++){
    $rankArr = split("/",$classArr[$i]['rank']);
    $ranknum = count($rankArr);
    $t = "";
    for($j=1; $j<$ranknum; $j++){ //用于格式化显示子类
      $t .= "├┄┄";
    }
    echo "<option value='".$classArr[$i]['id']."'>".$t.$classArr[$i]['classname']."</option>";
  }
  echo "</select>"
&#63;> 
 
//保存时的操作,需要判断是否为主分类,当为主类时, rank 值设为 /
//查询父类的 rank 值,用父类的 rank 加上 父类的 id 值
if($pid != 0){
  $pidrank = SelectValue('w_faqclass',$pid,'rank','id'); 
  $rank = $pidrank.$pid."/";
}else{
  $rank = "/";  
}
Copy after login

3. Modify classification

<&#63;php
  /*
  注意,因为是修改,在此页面加载时已将当前分类的所有值读出来了,对应是:$pid,$rank
  */
  $classArr = ReadClass('w_faqclass','0','asc',array());
  $canum = count($classArr);
  echo "<select name='pid'>";
  echo "<option value='0'>主分类</option>";
 
  for($i=0; $i<$canum; $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<$ranknum; $j++){
      $t .= "├┄┄";
    }
    if($pid == $classArr[$i]['id']){
      $selected = "selected";  
    }else{
      $selected = "";
    }
    echo "<option value='".$classArr[$i]['id']."' ".$selected.">".$t.$classArr[$i]['classname']."</option>";
  }
  echo "</select>"
&#63;>
 
// 保存时的操作
// 要做到改动时该分类的所有子分类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."';");
Copy after login

4. Deletion and query are simple. I won’t go into details on this. Just remember to confirm whether there are subclasses under the class before deleting.

$zid = SelectValue('w_faqclass',$ids,'id','pid');
 
if($zid>0){
  ...
}
Copy after login

The above is the method of implementing Infinitus classification in php mysql. I hope it will be helpful to everyone's learning.

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/1070274.htmlTechArticlephp mysql implements unlimited classification, phpmysql unlimited project idea analysis: A PHP project needs to use classification, but not Determine how many levels it is divided into, so I want to make it an infinite level classification. At first I thought...
Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template