Heim  >  Artikel  >  Backend-Entwicklung  >  php无限极分类实现的两种解决方法

php无限极分类实现的两种解决方法

PHP中文网
PHP中文网Original
2017-03-21 14:32:461132Durchsuche

本篇文章介绍了,在php中无限极分类实现的两种解决方法。需要的朋友参考下

method of classify one

<?php
/*

reader: 这是自己写的无限极分类实现方法 里面的编辑方法只是对分类名进行了编辑 
没有进行移动操作 小弟能力有限忘大家多多包涵啊

 第一种方法:CREATE TABLE `types` (
  `type_id` int(11) NOT NULL AUTO_INCREMENT,
  `type_name` varchar(20) NOT NULL,
  `type_p_id` varchar(64) NOT NULL DEFAULT &#39;-&#39;,
  PRIMARY KEY (`type_id`),
  KEY `type_name` (`type_name`),
  KEY `tname` (`type_name`)
) ENGINE=MyISAM AUTO_INCREMENT=14 DEFAULT CHARSET=utf8
注:
 这里没做字段有效验证;
 type_id     表示主键自增 
 type_name     表示分类名
 type_p_id     表示分类路径 这里的分类路径是 上层父类的分类路径加上此类的主键id 用逗号隔开
*/
error_reporting(7);
header("Content:text/html;charset=utf-8");
//这里先进行操作的判断
$arr = array(&#39;list&#39;,&#39;add&#39;,&#39;del&#39;,&#39;edit&#39;,&#39;addok&#39;,&#39;edit_ok&#39;);
$act= in_array($_GET[&#39;ac&#39;],$arr)?$_GET[&#39;ac&#39;]:$arr[0];
//连接数据库
$conn = mysql_connect("localhost","root","root")or die(&#39;数据库连接失败&#39;);
mysql_select_db("study",$conn);
mysql_query("set names utf8");
//根据分类层进行排序
$sql = "select * from types order by type_p_id";
$sql1 = mysql_query($sql);
//添加分类
if($act == "addok"){
    $type_id = $_POST[&#39;type_id&#39;];
    $type_name = $_POST[&#39;type_name&#39;];
    //如果等于0表示是跟目录
    if($type_id=="0"){
        $sql = "insert into types set type_name = &#39;{$type_name}&#39;";
        $res = mysql_query($sql);
        $id = mysql_insert_id();
        $sql = "update types set type_p_id = &#39;$id,&#39; where type_id=$id";
        $res = mysql_query($sql);
        if( mysql_affected_rows ()>0){
            echo "<script>location.href=&#39;ok.php?act=list&#39;</script>";
        }else{
            echo "<script>alert(&#39;添加失败&#39;);</script>";
        }
    }//如果不等于0
    else{
        //根据typeid 找到 该id下的type_p_id
        $sql = "select type_p_id from `types` where type_id =  $type_id";
        $res = mysql_query($sql);
        $res = mysql_fetch_assoc($res);
        $type_id = $res[&#39;type_p_id&#39;];

        //先将名称插入进去
        $sql = "insert into types set type_name = &#39;{$type_name}&#39;";
        $res = mysql_query($sql);
        //获取最后执行的id 然后进行数据更新 主要更新 type_p_id
        $id = mysql_insert_id();
        $sql = "update types set type_p_id = &#39;$type_id$id,&#39; where type_id=$id";
        $res = mysql_query($sql);
        if($res){
            echo "<script>location.href=&#39;ok.php?act=list&#39;</script>";
        }else{
            echo "<script>alert(&#39;添加失败&#39;);</script>";
        }
    }
}elseif($act=="add"){
?>
<form method="post" action="?ac=addok">
新分类名称:    <input type="text" name="type_name"><br/>
当前分类:<select name="type_id" >
    <option  value="0">顶级分类</option>
    <?php
    //循环遍历分类
    while($res = mysql_fetch_assoc($sql1)){
        //查找 ","号出现的次数
        $m=substr_count($res[&#39;type_p_id&#39;],",");
        //使用空格替换 "空格"
        $strpad = str_pad("",$m*8*2," ");
        if($m==1){
            $sele = "disabled";
        }else{
            $sele = "";
        }
    ?>
        <option value="<?php echo $res[&#39;type_id&#39;]?>"><?php  echo $strpad.$res[&#39;type_name&#39;]?></option>
    <?php
    }
    ?>
    </select><br />
    <input type="submit"  value="添加"/>
</form>
<?php                
}elseif($act == "list"){
    //获取列表根据 分类层进行排序
    $sql = "select * from types order by type_p_id";
    $res = mysql_query($sql);
?>
<table width="50%" style="font-size:12px;margin-left:20%;">
<tr><td>id</td><td>分类名</td><td>path路径</td><td>操作</td></tr>
<?php
while($arr = mysql_fetch_assoc($res)){?>
<tr>
    <td><?php echo $arr[&#39;type_id&#39;]?></td>
    <td><?php echo $arr[&#39;type_name&#39;]?></td>
    <td><?php echo $arr[&#39;type_p_id&#39;]?></td>
    <td ><a href="?ac=edit&type_id=<?php echo $arr[&#39;type_id&#39;];?>">编辑</a> |
        <a href="?ac=del&type_id=<?php echo $arr[&#39;type_id&#39;];?>">删除</a></td>
</tr>
<?php 
    }
?>
</table>
<input type="button"  value="添加"  onclick="(location.href=&#39;?ac=add&#39;)">
<?php                
}elseif($act == "edit"){
    $id = $_GET[&#39;type_id&#39;];
    $sql = "select *from  `types` where type_id=$id ";
    $res = mysql_query($sql);
    echo "<form  method=&#39;post&#39;  action=&#39;?ac=edit_ok&#39;>";
    while($arr = mysql_fetch_assoc($res)){
        echo "当前名称:{$arr[&#39;type_name&#39;]}"."<br />";
        echo "新名称:<input type=&#39;text&#39;  name=&#39;n_type_name&#39;  >"."<br />";
        echo "<input type=&#39;hidden&#39;  value={$arr[&#39;type_id&#39;]} name=&#39;id&#39;/>";
    }
    echo "<input type=&#39;submit&#39;  value=&#39;更新&#39;>";
    echo "</form>";
}elseif($act == "edit_ok"){
    $name = trim($_POST[&#39;n_type_name&#39;]);
    $id = $_POST[&#39;id&#39;];
    if(!empty($name)){
        $sql = "update  `types` set type_name=&#39;$name&#39; where type_id=$id";
        mysql_query($sql);
        echo "<script>location.href(&#39;ok.php?act=list&#39;)</script>";
    }else{
        echo "<script>location.href(&#39;ok.php?act=list&#39;)</script>";
    }
}elseif($act == &#39;del&#39;){
    //这里的删除是要把当前分类 和当前的子分类都要删除 所以用到$id%
    $id = $_GET[&#39;type_id&#39;];
    $sql ="delete from `types` where type_p_id like &#39;$id%&#39; ";
    $res = mysql_query($sql);
    if($res){
        echo "<script>location.href(&#39;ok.php?act=list&#39;)</script>";
    }else{
        echo "<script>alert(&#39;删除失败&#39;);</script>";
    }
}
?>

types表:

下面是效果图:

method of classify two

<?php
/*

reader:
    这是自己写的无限极分类实现方法 里面的编辑很简单的(你们懂得。) 就没写了
    没有进行移动操作 小弟能力有限忘大家多多包涵啊
第二种方法:
CREATE TABLE `types` (
  `type_id` int(11) NOT NULL AUTO_INCREMENT,
  `type_name` varchar(20) NOT NULL,
  `type_p_id` varchar(64) NOT NULL,
  PRIMARY KEY (`type_id`),
  KEY `type_name` (`type_name`),
  KEY `tname` (`type_name`)
) ENGINE=MyISAM AUTO_INCREMENT=14 DEFAULT CHARSET=utf8
注:
 这里没做字段有效验证;
 type_id     表示主键自增 
 type_name     表示分类名
 type_p_id     表示分类路径 这里的分类路径是 上层的分类id 如果是当前分类 这个值为 0 
*/
error_reporting(7);
header("Content-type:text/html;charset=utf-8");
//这里先进行操作的判断
$arr = array(&#39;list&#39;,&#39;add&#39;,&#39;del&#39;,&#39;edit&#39;,&#39;addok&#39;,&#39;edit_ok&#39;);
$act= in_array($_GET[&#39;ac&#39;],$arr)?$_GET[&#39;ac&#39;]:$arr[0];
//连接数据库
$conn = mysql_connect("localhost","root","root")or die(&#39;数据库连接失败&#39;);
mysql_select_db("study",$conn);
mysql_query("set names utf8");

if($act=="add"){
    /**
    *    @access public
    * @param array $types 数组 这里的数组要传引用&
    *    @param interal $pid 所属的分类上层分类id
    *    @param int $path 分类层 默认从0开始每次循环加一
    * @return array();
    */
function getTypes(&$types=array(),$pid=0,$path=0){
     $sql = "select * from `type` where type_p_id = $pid";
    $res = mysql_query($sql);
    while($row = mysql_fetch_assoc($res)){
        $str = "";
        for($i=0;$i<$path;$i++){
            $str.=" ";
        }
        $row[&#39;new_type_name&#39;] = $str.$row[&#39;type_name&#39;];
        $types[] = $row;
        getTypes($types,$row[&#39;type_id&#39;],($path+1));
    }
    return $types;
}
//获取分类 调用函数
getTypes($types);
//获取列表根据 分类层进行排序
$sql1 = "select * from type order by type_id";
$sqll = mysql_query($sql1);
?>
<form method="post" action="?ac=addok">
新分类名称:    <input type="text" name="type_name"><br/>
当前分类:<select name="type_id" >
    <option  value="0">顶级分类</option>
    <?php
    //循环这个数组将分类正确输出
    for($i=0;$i<count($types);$i++){
    ?>
        <option value="<?php echo $types[$i][&#39;type_id&#39;]?>"><?php  echo $types[$i][&#39;new_type_name&#39;]?></option>
    <?php
    }
    ?>
    </select><br />
    <input type="submit"  value="添加"/>
</form>
<?php
}elseif($act == "addok"){
    $type_name = $_POST[&#39;type_name&#39;];
    $type_id = $_POST[&#39;type_id&#39;];
    $sql = "insert into `type`(type_name,type_p_id) values (&#39;$type_name&#39;,&#39;$type_id&#39;)";
    $res = mysql_query($sql);
    if(mysql_insert_id()>0){
        echo "<script>location.href=&#39;two.php?act=list&#39;</script>";
    }else{
        echo "<script>alert(&#39;添加失败&#39;);</script>";
    }
}elseif($act == "list"){
    //获取列表根据 分类层进行排序
    $sql = "select * from type order by concat(type_id,type_p_id)";
    $res = mysql_query($sql);
?>
<table width="50%" style="font-size:12px;margin-left:20%;">
<tr><td>id</td><td>分类名</td><td>path路径</td><td>操作</td></tr>
<?php
while($arr = mysql_fetch_assoc($res)){?>
<tr>
    <td><?php echo $arr[&#39;type_id&#39;]?></td>
    <td><?php echo $arr[&#39;type_name&#39;]?></td>
    <td><?php echo $arr[&#39;type_p_id&#39;]?></td>
    <td ><a href="?ac=edit&type_id=<?php echo $arr[&#39;type_id&#39;];?>">编辑</a> |
        <a href="?ac=del&type_id=<?php echo $arr[&#39;type_id&#39;];?>">删除</a></td>
</tr>
<?php
}
?>
</table>
<input type="button"  value="添加"  onclick="(location.href=&#39;?ac=add&#39;)">
<?php 
}elseif($act == "del"){
    /***
        这里要删除大分类的时候必须要删除该大分类下的子分类
        所以这里开始mysql事务 mysql 事务开启的方式 事务详细说明请参考
    */
    mysql_query("SET AUTOCOMMIT=1");//开启事务
    $type_id = $_GET[&#39;type_id&#39;];
    //删除该分类
    $sqlone = "delete from `type` where type_id=$type_id";
    //删除该分类下的子分类
    $sqltwo = "delete from `type`where type_p_id=$type_id";
    $res1 = mysql_query($sqlone);
    $res2 =    mysql_query($sqltwo);
    if($res1 && $res2)
    {
        mysql_query("COMMIT");
        echo "<script>location.href=&#39;two.php?act=list&#39;</script>";
    }else{
            mysql_query("ROLLBACK");
        echo "<script>alert(&#39;删除失败&#39;);</script>";
    }
}
?>

type表:

 

下面是效果图

写的确实不怎么样啊 还望大家见谅。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn