RSS订阅
PHP程序员站--WWW.PHPERZ.COM  
网站地图
高级搜索
收藏本站

 当前位置:主页 >> PHP基础 >> 基础文章 >> 文章内容
用PHP做商品无限级的分类程序
[收藏此页[打印本页]   
来源:互联网  作者:song2004_2008  发布时间:2007-12-31

转自:http://blog.csdn.net/song2004_2008/archive/2006/07/21/953672.aspx

根据动网的论坛无限级的分类,特开发了PHP版的无限级的分类. php程序员之家

即然是PHP,数据表当然是 MYSQL:在应用之前,先在mysql中建立数据表.b_mtype.其中的字段包括:typeid,typename,parentid,paretnstr,rootid,child,orders. phperz.com

具体PHP程序如下:
以下为引用的内容:

<?php
      $ToDo=$_GET["ToDo"];
    switch($ToDo)
    {
        
   case "add":
   echo add();
   break;
  
   case "edit":
    echo edit();
   break;

php程序员之家

    case "saveadd":
    echo saveadd();
   break;
  
   case "saveedit":
   echo saveedit();
   break;
  
   case "del":
   echo del();
   break;
     
   default:
?> www~phperz~com

<table width="96%"  border="0" align="center" cellpadding="0" cellspacing="0" class="tblborder">
  <tr>
    <td valign="top"><table width="99%"  border="0" cellspacing="1" cellpadding="3">
        <tr>
          <td width="55%" height="20" align="center" bgcolor="#698FC7"><span class="tblhead"><b>商品类别设置</b></span></td>
         
        </tr>
    </table>
      <table width="99%" bgcolor="#cccccc" cellspacing="1" cellpadding="3">
        <tr bgcolor="#F9F9F9"> php程序员站
          <td width="10%">ID</td>
          <td width="32%">类别名称</td>
          <td width="22%">排序</td>
          <td width="40%">操作</td>
        </tr>
  <?php
      
  $query=mysql_query("select * from b_mtype order by rootid,orders");
  //echo $query;
  while($arr=mysql_fetch_array($query))
  {
   
  ?>
        <tr>
          <td  bgcolor="#FFFFFF"><?php echo $arr["typeid"];?></td> php程序员站
          <td  bgcolor="#FFFFFF"><?php if ($arr["depth"]>0) {
                     for($i=1;$i<=$arr["depth"];$i++){ echo "&nbsp;";}
    }?> www~phperz~com

      <? if($arr["child"]>0) { echo "+";}else {echo "-";}?> 
      <? if($arr["parentid"]==0) { echo "<b>";}?>
      <? echo $arr["typename"];?>
      <? if ($arr["child"]>0) {?>(<? echo $arr["child"];?>)<? }?></td>
          <td bgcolor="#FFFFFF"><?php echo $arr["orders"];?></td>
          <td bgcolor="#FFFFFF"><a href="mer_type.php?ToDo=add&editid=<?php echo $arr["typeid"];?>"><U>添加版面</U></a>
    | <a href="mer_type.php?ToDo=edit&editid=<?php echo $arr["typeid"]?>"><U>基本设置</U></a> php程序员站
           |  <? if($arr["child"]==0){?><a href="mer_type.php?ToDo=del&editid=<? echo $arr["typeid"];?>" onClick="{if(confirm('删除将包括该类别的所有内容,确定删除吗?')){return true;}return false;}"><U>删除</U></a><?}else{?><a href="#" onClick="{if(confirm('该类别含有下属类别,必须先删除其下属类别方能删除本类别!')){return true;}return false;}"><U>删除</U></a><?}?>&nbsp;< /td>
        </tr>
  <?php
  }
  ?>
      </table>
    </td>
  </tr>
</table>
<?php
    break;
   }
   ?> www.phperz.com

<?php  ///增加类别
 function add(){ phperz.com

  // global $db,$postnum,$editid;
   $editid=$_REQUEST["editid"];
 
    $query=mysql_query("select typeid from b_mtype order by typeid desc limit 1");
 while($arr=mysql_fetch_array($query)){
 
 if (!$arr["typeid"]){
     $postnum=1;
  
 }else{
     $postnum=$arr["typeid"]+1;
  
 }
  if(!$postnum) $postnum=1;
 }
?>
   <form name="form1" method="post" action="mer_type.php?ToDo=saveadd">
        <table width="94%"  align="center"  border="0" cellpadding="3" cellspacing="1">
          <tr bgcolor="#CCCCCC">
            <td colspan="2" bgcolor="#698FC7"><span class="tblhead"><b>创建新的类别</b></span></td> phperz~com
          </tr>
             <input type="hidden" name="newtypeid" value="<? echo $postnum;?>" />
          <tr>
            <td width="13%">类别名称:</td>
            <td width="87%"><input name="typename" type="text" id="typename"></td>
          </tr>
         <tr>
           <td width="52%" height=30 bgcolor="#FFFFFF"><U>所属类别</U></td>
            <td width="48%" bgcolor="#FFFFFF"> php程序员站
            <select name=btype>
            <option value="0">做为主类别</option>
            <?
    $query=mysql_query("select * from b_mtype order by rootid,orders");  
    while($arr=mysql_fetch_array($query)){ ?>
            <option value="<? echo $arr["typeid"]?>" <?php if($editid == $arr['typeid']){ echo " selected"; }?>>
            <? if($arr["depth"]>0) {
              for($i=1;$i<=$arr["depth"];$i++)
     {
       echo "-";

phperz.com


         }
      
             }?>
             <? echo $arr["typename"]?></option>
            <?
          } 
             ?>
            </select>
            </td>
          </tr>
          <tr>
            <td>&nbsp;</td>
            <td><input type="submit" name="Submit" value="保存"></td> php程序员之家
          </tr>
        </table>
</form>
<? }?>
php程序员站

<?php   /////保存增加的类别
function saveadd(){ php程序员之家

$ntid  =$_REQUEST["newtypeid"];
$tn    =$_REQUEST["typename"];
$btype =$_REQUEST["btype"]; php程序员站


//echo $btype;

www.phperz.com

if ($ntid=="" or $tn=="")
{
die( "参数有误,请重新填写." );
}

www.phperz.com

if ($btype!=0){
 
   $result=mysql_query("select rootid,typeid,depth,orders,parentstr from b_mtype where typeid='$btype'");
   $aa=mysql_fetch_array($result);
   $rootid=$aa['rootid'];
   //echo "aaaaaaaaaaa";
   $parentid=$aa['typeid'];
   $depth=$aa['depth'];
   $orders=$aa['orders'];
   $parentstr=$aa['parentstr'];
   //echo $rootid; php程序员站

   if(($aa["depth"]+1)>20){  die("本分类限制最多只能有20级分类"); } php程序员站

} php程序员站

if($ntid == $btype)
{
die("您所指定的typeid值重复。");
}

www~phperz~com

if($btype!=0){

php程序员站

  $depth=$depth+1;
  $rootid=$rootid;
  $orders =$ntid;
  $parentid =$btype;
  //$child = $child;
  if ($parentstr=="0"){
     $parentstr=$btype;
  }else{
     $parentstr=$parentstr.",".$btype;
  }

phperz.com

 }else{
  $depth=0;
  $rootid=$ntid;
  $orders=1;
  $parentid=0;
  $child=0;
  $parentstr=0;
}

phperz.com

$query=mysql_query("insert into b_mtype values('$ntid','$tn','$parentid','$parentstr','$depth','$rootid','','$orders','')") ;
   

php程序员站

if ($btype!=0)
  {
     if ($depth>0)
     {
     //当上级分类深度大于0的时候要更新其父类(或父类的父类)的版面数和相关排序
     for ($i=1;$i<=$depth;$i++){
  //更新其父类版面数
  if ($parentid!=""){
  $query=mysql_query("update b_mtype set child=child+1 where typeid='$parentid'");
  }
  //得到其父类的父类的版面ID
  $result=mysql_query("select parentid from b_mtype where typeid='$parentid'");
  $par=mysql_fetch_array($result);
  if ($par['parentid']!=""){
   $parentid=$par['parentid'];
  }
  //当循环次数大于1并且运行到最后一次循环的时候直接进行更新
  if ($i==$depth && $parentid!=""){
  $query=mysql_query("update b_mtype set child=child+1 where typeid='$parentid'"); php程序员站
  }
  }//for循环结果
 //更新该版面排序以及大于本需要和同在本分类下的版面排序序号
   $query=mysql_query("update b_mtype set orders=orders+1 where rootid='$rootid' and orders>'$orders'");
   //$orders1=$orders+1;
   //echo "orders1=".$orders1;
   $query=mysql_query("update b_mtype set orders='$orders'+1 where typeid='$ntid'");
 
 
  }else{
 
   //当上级分类深度为0的时候只要更新上级分类版面数和该版面排序序号即可
 
   $query=mysql_query("update b_mtype set child=child+1 where typeid='$btype'");
   $result=mysql_query("select max(orders) from b_mtype where typeid='$ntid'");
   $ord=mysql_fetch_array($result);
  
   $query=mysql_query("update b_mtype set orders='$ord[0]'+1 where typeid='$ntid'");
  }
    echo "类别填加成功";

phperz.com


 
  }
}
?>
www~phperz~com

<?PHP   ////修改设置
 function edit(){
  //global $db,$editid,$tn,$arr; php程序员站

$editid=$_REQUEST["editid"];

phperz.com

$result=mysql_query("select * from b_mtype where typeid='$editid'");
$tn=mysql_fetch_array($result);
?>    
 <form  name="form2" action ="mer_type.php?ToDo=saveedit" method="post">      
<input type="hidden" name="editid" value="<?php echo $editid;?>">
<table width="90%" border="0"  align=center cellpadding="3" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<th height=24 colspan=2>编辑类别:<?PHP echo $tn["typename"];?></th>
</tr>
<tr>
<td width="52%" height=30 bgcolor="#FFFFFF">类别名称</td>
<td width="48%" bgcolor="#FFFFFF">
<input type="text" name="typename" size="35"  value="<?php echo $tn["typename"];?>">

php程序员站

</td>
</tr>

phperz.com

<tr>
<td width="52%" height=30 bgcolor="#FFFFFF"><U>所属类别</U><BR>
  所属类别不能指定为当前类别<BR>所属类别不能指定为当前版面的下属类别</td>
<td width="48%" bgcolor="#FFFFFF">
<select name="class">
<option value="0">做为主类别</option>
<?
 $query=mysql_query("select * from b_mtype order by rootid,orders");
 
while($arr=mysql_fetch_array($query))
{ ?>
<option value="<?php echo $arr[typeid]?>" <?php if ($tn["parentid"] == $arr["typeid"]) { echo "selected"; } ?>><? if ($arr["depth"]>0) {?>
<?for ($i=1;$i<=$arr["depth"];$i++){ echo "-";}?>
<? } ?><?php echo $arr["typename"]?></option>
<?
 }
?>
</select> php程序员站
</td>
</tr> php程序员站

<tr>
<td width="52%" height=24 bgcolor="#FFFFFF">&nbsp;</td>
<td width="48%" bgcolor="#FFFFFF">
<input type="submit" name="Submit" value="提交修改">
</td>
</tr>
</table>
</form>
 
<?
 } phperz~com

?> www~phperz~com


<?php  /////保存修改
function saveedit(){
  //global $db,$aa,$bb,$cc,$dd,$ee,$ff,$gg,$ii,$jj,$kk,$ll,$mm,$nn,$qq,$rr;
  $editid=$_REQUEST["editid"];
  $btype=$_REQUEST["class"];
  $tn=$_REQUEST["typename"];

phperz~com

  if($editid == $btype ){ die ("所属论坛不能指定自己"); } php程序员站

  $result=mysql_query("select * from b_mtype where typeid='$editid'");
  $aa=mysql_fetch_array($result);
  $newtypeid=$aa["typeid"];
  $typename=$aa["typename"];
  $parentid=$aa["parentid"];
  $iparentid=$aa["parentid"];
  $parentstr=$aa["parentstr"];
  $depth = $aa["depth"];
  $rootid = $aa["rootid"];
  $child = $aa["child"];
  $orders = $aa["orders"];
 
  ////判断所指定的类别是否其下属类别
  if ($parentid ==0){
 if ($btype!= 0) {
 $result=mysql_query("select rootid from b_mtype where typeid='$btype'");
 $b=mysql_fetch_array($result);
 if ($rootid == $bb['rootid']) {
  die("您不能指定该版面的下属论坛作为所属论坛11");
  } 
 }
 
   }else{ php程序员之家
 $result=mysql_query("select typeid from b_mtype where parentstr like '%$parentstr%' and typeid='$btype'");
 $cc=mysql_fetch_array($result);
 if ($cc[0]){
  
  die("您不能指定该版面的下属论坛作为所属论坛2");
  
 }
  } www~phperz~com

  if ($parentid ==0){
 $parentid=$editid;
 $iparentid=0;
  }
  mysql_query("update b_mtype set typename='$tn',parentid='$btype' where typeid='$editid'"); php程序员之家

  $result1=mysql_query("select max(rootid) from b_mtype");
  $ss=mysql_fetch_array($result1);
  $maxrootid=$ss["rootid"]+1;
  if (!$maxrootid){ $maxrootid=1;}
 

www~phperz~com

 //假如更改了所属类别
//需要更新其原来所属版面信息,包括深度、父级ID、版面数、排序、继承版主等数据
//需要更新当前所属版面信息
//继承版主数据需要另写函数进行更新--取消,在前台可用typeid in parentstr来获得 php程序员之家

if ($parentid != $btype && !($iparentid==0 && $btype==0)) {
   //如果原来不是一级分类改成一级分类
   //echo "ggg";
     if ($iparentid>0 && $btype==0)
     {
  echo "第一部分";
  //更新当前版面数据
  mysql_query("update b_mtype set depth=0,orders=0,rootid='$editid',parentid=0,parentstr='0' where typeid='$newtypeid'");
  $parentstr=$parentstr .",";
  $result=mysql_query("select count(*) from b_mtype where parentstr like '%$parentstr%'");
  $dd=mysql_fetch_array($result);
  $postcount=$dd[0];
  echo "postcount=".$postcount;
      if (empty($postcount))
   {
      $postcount=1;
      }else{
      $postcount=$postcount+1; phperz.com
      }
  //更新其原来所属类别版面数
  mysql_query("update b_mtype set child=child-'$postcount' where typeid='$iparentid'");
  //更新其原来所属类别数据,排序相当于剪枝而不需考虑
  for ($i=1;$i<=$depth;$i++)
   {
   ////得到其父类的父类的版面ID
   $result2=mysql_query("select parentid from b_mtype where typeid='$iparentid'");
   $ee=mysql_fetch_array($result2);
   if (!$ee[0]){
    $iparentid=$ee[0];
    mysql_query("update b_mtype set child=child-'$postcount' where typeid='$iparentid'");
          }
      } //for end
  
  if ($child >0){    //m1
  //更新其下属类别数据
  //有下属类别,排序不需考虑,更新下属类别深度和一级排序ID(rootid)数据

www.phperz.com

  //更新当前版面数据
   
    $i=0;
    $query=mysql_query("select * from b_mtype where parentstr like '%$parentstr%'");
    while($arr=mysql_fetch_array($query)){

www~phperz~com

    $i++;
    $mParentStr=strtr($arr['parentstr'],$parentstr," ");
    mysql_query("update b_mtype set depth=depth-'$depth',rootid='$maxrootid',parentstr='$mParentStr' where typeid='$arr[typeid]");
    }
   }  //m1 end
   }elseif ($iparentid > 0 && $btype >0) {
    
  echo "第二部分";
    //将一个分类别移动到其他分类别下
    //获得所指定的类别的相关信息
    $result=mysql_query("select * from b_mtype where typeid='$btype'");
    $gg=mysql_fetch_array($result);
    //得到其下属版面数
    $parentstr=$parentstr .",";
    $iparentstr=$parentstr.$editid;
    echo $iparentstr;
    $result1=mysql_query("select count(*) from b_mtype where parentstr like '%$iparentstr%'"); phperz.com
    $ii=mysql_fetch_array($result1);
    $postcount=$ii[0];
    echo "postcount1=".$postcout;
    if (empty($postcount)){ $postcount=1; }

www~phperz~com

    //在获得移动过来的版面数后更新排序在指定类别之后的类别排序数据

phperz.com

     $query=mysql_query("update b_mtype set orders=orders+'$postcount'+1 where rootid='$gg[rootid]' and orders>'$gg[orders]'");
    //更新当前版面数据
     If($gg[parentstr]=="0") {
    
       // $idepth=$gg[depth]+1;
       // $iorders=$gg[orders]+1;

php程序员站

        mysql_query("update b_mtype set depth='$gg[depth]'+1,orders='$gg[orders]'+1,rootid='$gg[rootid]',parentid='$btype',parentstr='$gg[typeid]' where typeid='$newtypeid'");
     }Else{
     $aparentstr=$gg['parentstr'].",".$gg['typeid'];
        $idepth=$gg['depth']+1;
        $iorders=$gg['orders']+1;
        mysql_query("update b_mtype set depth='$idepth',orders='$iorders',rootid='$gg[rootid]',parentid='$btype',parentstr='$aparentstr' where typeid='$editid'");
     }
     $i=1;
    // echo "ghh";
     //如果有则更新下属版面数据
     //深度为原有深度加上当前所属类别的深度
  $iparentstr=$parentstr.$newtypeid;
       $query=mysql_query("select * from b_mtype where parentstr like '%$iparentstr%' order by orders");

www.phperz.com


     while($arr=mysql_fetch_array($query)){   // m2
      $i++;
          If ($gg['parentstr']=="0") {
           $iParentStr=$gg['typeid'].",".strtr($arr['parentstr'],$parentstr," ");
       }Else{
           $iParentStr=$gg["parentstr"] .",".$gg["typeid"] . "," . strtr($arr['parentstr'],$parentstr," ");
       }
       echo "iParentStr=".$iParentStr;
  
       $query=mysql_query("update b_mtype set depth=depth+'$gg[depth]'-'$depth'+1,orders='$gg[orders]'+'$i',rootid='$gg[rootid]',parentstr='$iParentStr' where typeid='$arr[typeid]'");
     }  ///m2 end
www.phperz.com

     $parentid=$btype;
     if ($rootid==$gg['rootid']) {  ///m3
    //在同一分类下移动
    //更新所指向的上级类别版面数,i为本次移动过来的版面数
    //更新其父类版面数
      $query=mysql_query("update b_mtype set child=child+'$i' where (! parentid=0) and typeid='$parentid'");
      for ($k=1;$k<=$gg['depth'];$k++){
  //得到其父类的父类的版面ID
    $result=mysql_query("select parentid from b_mtype where (! parentid=0) and typeid='$parentid'");
    $vv=mysql_fetch_array($result);
     if ($vv[0]){
   $parentid=$vv[0];
   //更新其父类的父类版面数
   mysql_query("update b_mtype set child=child+'$i' where (! parentid=0) and  typeid='$parentid'");
      }

php程序员站

     
   } // for end
     //更新其原父类版面数
     mysql_query("update b_mtype set child=child-'$i' where (! parentid=0) and typeid='$iparentid'");
     //更新其原来所属类别数据
 
     for ($k=1;$k<=$depth;$k++){
    //得到其原父类的父类的版面ID
    $result1=mysql_query("select parentid from b_mtype where (! parentid=0) and typeid='$iparentid'");
    $zz=mysql_fetch_array($result1);
    if ($zz[0]){
   $iparentid=$zz[0];
   
   //更新其原父类的父类版面数
   mysql_query("update b_mtype set child=child-'$i' where (! parentid=0) and  typeid='$iparentid'");
     }
    }//for end
     
    }else{  ////m3 end php程序员站
   echo "ccc";
    //更新所指向的上级类别版面数,i为本次移动过来的版面数
    //更新其父类版面数
   mysql_query("update b_mtype set child=child+'$i' where typeid='$parentid'");
    for ($k=1;$k<=$gg["depth"];$k++){
  //得到其父类的父类的版面ID
  $result2=mysql_query("select parentid from b_mtype where typeid='$parentid'");
  $yy=mysql_fetch_array($result2);
  if ($yy[0]){
   $parentid=$yy[0];
   //更新其父类的父类版面数
   mysql_query("update b_mtype set child=child+'$i' where typeid='$parentid'");
   }
  
     } //for end
     //更新其原父类版面数
     mysql_query("update b_mtype set child=child-'$i' where typeid='$iparentid'");
     //更新其原来所属类别数据 www~phperz~com
     for ($k=1;$k<=$depth;$k++){
  //得到其原父类的父类的版面ID
  $query=mysql_query("select parentid from b_mtype where typeid='$iparentid'");
  while($arr=mysql_fetch_array($query))
   {
        if ($arr[0]){
         $iparentid=$arr[0];
         //更新其原父类的父类版面数
         mysql_query("update b_mtype set child=child-'$i' where typeid='$iparentid'");
            }
       }
      } //for end
   } ///m3 end 
   }else{
  echo "第三种情况";
 //如果原来是一级类别改成其他类别的下属类别
 //得到所指定的类别的相关信息
 $result=mysql_query("select * from b_mtype where typeid='$btype'"); php程序员之家
 $gg=mysql_fetch_array($result);
 echo $rootid;
 $result1=mysql_query("select count(*) from b_mtype where rootid='$rootid'");
 $qq=mysql_fetch_array($result1);
 $postcount=$qq[0];
 //更新所指向的上级类别版面数,i为本次移动过来的版面数
 $parentid=$btype;
 //更新其父类版面数
 mysql_query("update b_mtype set child=child+'$postcount' where typeid='$parentid'");
 
 for ($k=1;$k<=$gg['depth'];$k++){
  //得到其父类的父类的版面ID
  $result2=mysql_query("select parentid from b_mtype where typeid='$parentid'");
  $rr=mysql_fetch_array($result2);
  if ($rr[0]){
   $parentid=$rr[0];
   //更新其父类的父类版面数
   mysql_query("update b_mtype set child=child+'$postcount' where typeid='$parentid'");
  }
 
 } ///for end
 //在获得移动过来的版面数后更新排序在指定类别之后的类别排序数据 php程序员站
 mysql_query("update b_mtype set orders=orders+'$postcount'+1 where rootid='$gg[rootid]' and orders>'$gg[orders]'");
 $i=0;
 $query=mysql_query("select * from b_mtype where rootid='$rootid' order by orders");
 while($arr=mysql_fetch_array($query))
 {
   $i++;
   if ($arr['parentid'] ==0)
   {
  if ($gg['parentstr'] =="0")
   {
         $parentstr=$gg['typeid'];
      }else{
         $parentstr=$gg['parentstr'] .",".$gg['typeid'];
      }
    mysql_query("update b_mtype set depth=depth+'$gg[depth]'+1,orders='$gg[orders]'+'$i',rootid='$gg[rootid]',parentstr='$parentstr',parentid='$btype' where typeid='$arr[typeid]'");
  
   }else{
  if ($gg['parentstr'] =="0"){

php程序员站


        $parentstr=$gg['typeid'] ."," . $arr['parentstr'];
      }else{
        $parentstr=$gg['parentstr'] .",".$gg['typeid'] .",". $arr['parentstr'];
      }
     mysql_query("update b_mtype set depth=depth+'$gg[depth]'+1,orders='$gg[orders]'+'$i',rootid='$gg[rootid]',parentstr='$parentstr' where typeid='$arr[typeid]'"); www.phperz.com

    }
  }///while end
 }//else end
  echo "<p>类别修改成功!<br>";
 }
 
}
?>

www.phperz.com

<?php
function  del(){ www.phperz.com

////更新其上级版面类别数,如果该类别含有下级类别则不允许删除
$editid=$_REQUEST["editid"];
$result=mysql_query("select parentstr,child,depth from b_mtype where typeid='$editid'");
$aa=mysql_fetch_array($result);
if ($aa[0]!="") {
if ($aa[1]>0){
 die("该类别含有下属类别,请删除其下属类别后再进行删除本类别的操作");

phperz.com

}
//如果有上级版面,则更新数据 phperz~com

if ($aa[2]>0){
echo $aa[0];
 $query=mysql_query("update b_mtype set child=child-1 where typeid in ($aa[0])");
}
$query=mysql_query("delete from b_mtype where typeid='$editid'"); phperz.com


}
//echo $editid;
//echo $arr[0];
 echo  "类别删除成功!";
}
?> phperz.com

phperz.com


 
 相关文章
 
发表评论
全部评论(0条)
 
 站内搜索
 热门搜索 基础  mysql  url  adodb
高级搜索 网站地图 站长工具 IP查询 收藏本站
 热点文章
 随机推荐
网站首页 | 网站地图 | 高级搜索 | RSS订阅
PHP程序员站 Copyright © 2007,PHPERZ.COM All Rights Reserved 粤ICP备07503606号 联系站长