微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用PHP删除select中所有类别的子级别

问题:

我试图通过使用类删除类别的所有子级别.目前我只能删除两个子级别,而不是三个子级别.

数据库表:

CREATE TABLE betyg_category (
  CID int(11) NOT NULL AUTO_INCREMENT,
  Item varchar(100) NOT NULL,
  Parent int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (CID)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

PHP类:

<?PHP
class ItemTree 
{ 
   var $itemlist = array();

   function ItemTree($query)
   {
      $result = MysqL_query($query) or die ('Database Error (' . MysqL_errno() . ') ' . MysqL_error());

      while ($row = MysqL_fetch_assoc($result)) 
      {
         $this->itemlist[$row['CID']] = array(
           'name'   => $row['Name'],
           'parent' => $row['Parent']
         );
      }
   }

   function get_tree($parent, $with_parent=0)
   {
      $item_tree = array();

      if ($with_parent == 1 && $parent != 0) 
      {
         $item_tree[$parent]['name'] = $this->itemlist[$parent]['name'];
         $item_tree[$parent]['parent'] = $this->itemlist[$parent]['parent'];
         $item_tree[$parent]['child'] = $this->get_tree($parent);

         return $item_tree;
      }

      foreach ($this->itemlist as $key => $val) 
      {
         if ($val['parent'] == $parent) 
         {
               $item_tree[$key]['name'] = $val['name'];
               $item_tree[$key]['parent'] = $val['parent'];
               $item_tree[$key]['child'] = $this->get_tree($key);
         }
      }

      return $item_tree;
   }

   function make_optionlist ($id, $class='', $delimiter='/')
   {
      $option_list = '';

      $item_tree = $this->get_tree(0);

      $options = $this->make_options($item_tree, '', $delimiter);

      if (!is_array($id)) 
      {
         $id = array($id);
      }

      foreach($options as $row) 
      {
         list($index, $text) = $row;
         $selected = in_array($index, $id) ? ' selected="selected"' : '';
         $option_list .= "<option value=\"$index\" class=\"$class\"$selected>$text</option>\n";
      }

      return $option_list;
   }

   function make_options ($item_tree, $before, $delimiter='/')
   {
      $before .= empty($before) ? '' : $delimiter;

      $options = array();

      foreach ($item_tree as $key => $val) 
      {
         $options[] = array($key, '-&nbsp;'.$before.$val['name']);
         if (!empty($val['child'])) {
            $options = array_merge($options, $this->make_options($val['child'], $before.$val['name'], $delimiter));
         }
      }

      return $options;
   }

   function get_navlinks ($navid, $tpl, $startlink='', $delimiter=' &raquo; ')
   {
      // $tpl typ: <a href="index.PHP?id={id}" class="navlink">{name}</a>

      $search = array('{id}', '{name}');

      $navlink = array();

      while (isset($this->itemlist[$navid])) 
      {
         $replace = array($navid, $this->itemlist[$navid]['name']);
         $navlink[] = str_replace($search, $replace, $tpl);
         $navid = $this->itemlist[$navid]['parent'];
      }

      if (!empty($startlink)) 
      {
         $navlink[] = str_replace($search, array(0, $startlink), $tpl);
      }

      $navlink = array_reverse($navlink);

      return implode($delimiter, $navlink);
   }

   function show_tree ($parent=0, $tpl='%s', $ul_class='', $li_class='')
   {
      $item_tree = $this->get_tree($parent);

      return $this->get_node($item_tree, $parent, $tpl, $ul_class, $li_class);
   }

   function get_node ($item_tree, $parent, $tpl, $ul_class, $li_class)
   {
      // $tpl typ: <a href="item.PHP?id={id}" class="treelink" style="color:blue">{name}</a>

      $search = array('{id}', '{name}'); 

      $output = "\n<ul class=\"$ul_class\">\n";

      foreach ($item_tree as $id => $item) 
      {
         $replace = array($id, $item['name']);
         $output .= "<li class=\"$li_class\">".str_replace($search, $replace, $tpl);
         $output .= !empty($item['child']) ? "<br />".$this->get_node ($item['child'], $id, $tpl, $ul_class, $li_class) : '';
         $output .= "</li>\n";
      }

      return $output . "</ul>\n"; 
   }

   function get_id_in_node ($id)
   {
      $id_list = array($id);

      if (isset($this->itemlist[$id])) 
      {
         foreach ($this->itemlist as $key => $row) 
         {
            if ($row['parent'] == $id) 
            {
               if (!empty($row['child'])) 
               {
                 $id_list = array_merge($id_list, get_id_in_node($key));
               } else 
               {
                 $id_list[] = $key;
               }
            }
         }

      }
      return $id_list;
   }

   function get_parent ($id)
   {
      return isset($this->itemlist[$id]) ? $this->itemlist[$id]['parent'] : false;
   }

   function get_item_name ($id)
   {
      return isset($this->itemlist[$id]) ? $this->itemlist[$id]['name'] : false;
   }
}
?>

场景:

假设您在以下结构中具有以下结构:

>文学
> – 整合资源
> —-测试1

它将在数据库表中产生以下结果:

当我尝试删除这个子级别时,它会将最后一个子级别留在数据库中,同时它应该删除它.结果将是:

PHP代码

//Check if delete button is set
if (isset($_POST['submit-deletecategory'])) 
{
    //Get $_POST variables for category id
    $CategoryParent = intval($_POST['CategoryList']);

    //Check if category is selected
    if ($CategoryParent != "#") 
    {
        //Get parent category and subsequent child categories
        $query = "SELECT CID, Item AS Name, Parent FROM " . TB_CATEGORY . " ORDER BY Name";
        $items = new ItemTree($query);

        if ($items->get_item_name($_POST['CategoryList']) !== false) 
        {
            //Build up erase list
            $CategoryErase = $items->get_id_in_node($CategoryParent);
            $CategoryEraseList = implode(", ", $CategoryErase);
        } 
        else 
        {
            $CategoryEraseList = 0;
        }

        //Remove categories from database
        $query = "DELETE FROM " . TB_CATEGORY . " WHERE CID IN ($CategoryEraseList)";
        $result = MysqL_query($query) or die ('Database Error (' . MysqL_errno() . ') ' . MysqL_error());

       //Return a confirmation notice
       header("Location: settings.PHP");
       exit;
    }
}

提前感谢您提供解决问题的任何指导.

解决方法:

这是一种方法:使用递归函数,它首先查找叶子项(树中最深的).您首先删除子项,然后删除父项.对于每个孩子,你先移除孩子的孩子等等……

deleteSub(1);

function deleteSub($cat_id) {
    $request = "SELECT * FROM ". TB_CATEGORY ." WHERE Parent = ".$cat_id;
    $results = MysqL_query($request);
    while($child = MysqL_fetch_array($results)) 
    {
        deleteSub($child["CID"]);
    }
    $request = "DELETE FROM ". TB_CATEGORY ." WHERE CID = ".$cat_id;
    return MysqL_query($request);
}

一种更好的方法是使用这种递归函数将CID存储在一个数组中,然后发出一个DELETE请求,但我认为你将能够调整这段代码.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐