如题,代码如下:function delNodes($id,$Conn){
   $sql="select * from tvmenu where bid='$id'";
   $result_sun=mysql_query($sql,$Conn); 
   $num=mysql_num_rows($result_sun); 
   if($num>0){
      for($i=0;$i<$num;$i++){    
         $rs=mysql_fetch_array($result_sun); 
     delNodes($rs["id"],$Conn);  
  }    
   }else{
   $sql="delete FROM tvmenu WHERE id='$id'"; 
   $qu=mysql_query($sql,$Conn); 
if($qu){
$del="";
echo  "<script language='javascript'>alert('删除成功!');window.location='tree.php'</script>";

}
 }
}

delNodes($b,$Conn);数据表如下:
id  bid  name
1    0   电视1 
2    0   电视2  
3    1   电视3  
4    1   电视4  
5    2   电视5 
24   23   4444 
7    3   电视7  
8    3   电视8 
9    3   电视9  
10   5   电视10  
11   5   电视11 
12   5   电视12  
22   12   2222 
23   22   3333  

解决方案 »

  1.   

    查询所有的nodes
    然后进行遍历查找属于他的子类的key
    数据库查询只要一次.但是取出来的数据要也要循环遍历
      

  2.   

    可以先递归查询出id
    然后del in id(id列表)注意这种批量删除可能会出错而回滚
      

  3.   

    强烈建议这个封装成2个函数~
    而且你这个逻辑上有很大问题。1.每一次进入这个函数不管是干什么都要先查询一次,很浪费。
    2.你这是2个不同表之间的操作,参数$id有2个作用,阅读性不好,以后再看这个代码你肯定忍不住将他们封装成2个函数。
    3.你需要明确区别每次进来的是id还是bid……这个函数本身阅读性就不好。
    4.你每次进来首先会将$id理解为bid,那么如果tvmenu下有多个id、bid同样的情况,就是误删。考虑到你现在在学习使用递归,那就帮你改一下……/**
         * 
         * @param <int> $id
         * @param <array> $Conn
         * @param <bool> $is_id 
         */
        function delNodes($id, $Conn, $is_id = false) {
            if ($is_id) {
                $sql = "select * from tvmenu where bid='$id'";
                $result_sun = mysql_query($sql, $Conn);
                $num = mysql_num_rows($result_sun);   //获取tvmenu下的数据总数
                if ($num > 0) {  //如果有就递归
                    for ($i = 0; $i < $num; $i++) {
                        $rs = mysql_fetch_array($result_sun);
                        delNodes($rs["id"], $Conn,true); //通过第三个参数说明这是一个id字段
                    }
                }
            } else {
                $sql = "delete FROM tvmenu WHERE id='$id'";
                $qu = mysql_query($sql, $Conn);
                if ($qu) {
                    $del = "";
                    echo "<script language='javascript'>alert('删除成功!');window.location='tree.php'</script>";
                }
            }
        }
        
    delNodes($b,$Conn);
      

  4.   

    不好意思,打错了,是同一个表。
    但字段不同,而字段内容都是整数,原来的检测方式容易出现重复而误删。增加参数$is_id来判断是id字段的处理还是bid字段的处理较好。
      

  5.   

             $Conn=mysql_connect("localhost","root","123456"); 
    mysql_select_db("tree");  //打开数据库
    mysql_query("SET NAMES 'utf8'"); //避免乱码
    $b=trim($_GET["b"]);    //删除子类及自身函数
        function delNodes($id,$Conn){
                   $sql="select * from tvmenu where bid='$id'";
                   $result_sun=mysql_query($sql,$Conn); 
                   $num=mysql_num_rows($result_sun);  //查询该分类下子类数量
                   if($num>0){  
                      while($rs=mysql_fetch_array($result_sun)){  //循环调用递归
                         delNodes($rs["id"],$Conn); 
                      }               
                   }else{
                       $sql="delete FROM tvmenu WHERE id='$id'"; 
                       $qu=mysql_query($sql,$Conn);   //如果没有子类,直接删除
                            if($qu){
                                $del="";
                                echo  "<script language='javascript'>alert('删除成功!');window.location='tree.php'</script>";
                                //exit;
                            }
                 }
        }
        
        delNodes($b,$Conn); tvmenu数据表如下:
      

  6.   

    没看出大问题来, 应该管用, 你出现什么问题?
    野蛮点的作法可以是:(伪代码:)SQL:删除该id节点;
    do{
      SQL:删除父节点不存在的节点; 
      check affect row, if affected_row==0 break;
    }
      

  7.   

    我出的问题是只执行一次,例如删除Id=5的记录,得到结果是:id=5和id=10 这两条记录存在,为删除!
      

  8.   


    11和12删掉了没有?
    如果删10或11这样底层的能删掉吗?
    加一句echo $id; 在函数入口, 看你函数的递归调用情况,是否中途停止了等.....
    自己做点调试其实很有趣
      

  9.   

    获取所有分类 (缓存或查询数据库)
    采用算法计算出对于子分类下的ID
    找到后采用SQL的in  删除
    你这样肯定要干死服务器
    最多执行两次SQL 
    第一次 查询分类
    第二次删数据
      

  10.   

    其实你就是要删除所有bid=3的id们。
    我认真看了一下,你不需要用递归啊,而且在这个循环里用递归是不理想的,不太合适。你还是老实的像我这样写吧。/**
         * 
         * @param <int> $id
         * @param <array> $Conn
         * @param <bool> $is_id 
         */
        function delNodes($id, $Conn, $is_id = false) {
            if ($is_id) {
                $sql = "select * from tvmenu where bid='$id'";  //获取所有要删除的id
                $result_sun = mysql_query($sql, $Conn);
                $num = mysql_num_rows($result_sun);   //获取tvmenu下的数据总数
                while ($row = mysql_fetch_array($result_sun)) {
                    $sql = "delete FROM tvmenu WHERE id='{$row['id']}'";
                    $qu = mysql_query($sql, $Conn);
                    if ($qu) {
                        $del = "";
                        echo "<script language='javascript'>alert('删除成功!');window.location='tree.php'</script>";
                    }
                }
            }
        }