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


Posted in PHP onApril 28, 2013

今天写了下无限极分类 下面就把代码贴上来了 写的不怎么样。

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 '-',
  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('list','add','del','edit','addok','edit_ok');
$act= in_array($_GET['ac'],$arr)?$_GET['ac']:$arr[0];
//连接数据库
$conn = mysql_connect("localhost","root","root")or die('数据库连接失败');
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['type_id'];
    $type_name = $_POST['type_name'];
    //如果等于0表示是跟目录
    if($type_id=="0"){
        $sql = "insert into types set type_name = '{$type_name}'";
        $res = mysql_query($sql);
        $id = mysql_insert_id();
        $sql = "update types set type_p_id = '$id,' where type_id=$id";
        $res = mysql_query($sql);
        if( mysql_affected_rows ()>0){
            echo "<script>location.href='ok.php?act=list'</script>";
        }else{
            echo "<script>alert('添加失败');</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['type_p_id'];
        //先将名称插入进去
        $sql = "insert into types set type_name = '{$type_name}'";
        $res = mysql_query($sql);
        //获取最后执行的id 然后进行数据更新 主要更新 type_p_id
        $id = mysql_insert_id();
        $sql = "update types set type_p_id = '$type_id$id,' where type_id=$id";
        $res = mysql_query($sql);
        if($res){
            echo "<script>location.href='ok.php?act=list'</script>";
        }else{
            echo "<script>alert('添加失败');</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['type_p_id'],",");
        //使用空格替换 "空格"
        $strpad = str_pad("",$m*8*2," ");
        if($m==1){
            $sele = "disabled";
        }else{
            $sele = "";
        }
    ?>
        <option value="<?php echo $res['type_id']?>"><?php  echo $strpad.$res['type_name']?></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['type_id']?></td>
    <td><?php echo $arr['type_name']?></td>
    <td><?php echo $arr['type_p_id']?></td>
    <td ><a href="?ac=edit&type_id=<?php echo $arr['type_id'];?>">编辑</a> |
        <a href="?ac=del&type_id=<?php echo $arr['type_id'];?>">删除</a></td>
</tr>
<?php 
    }
?>
</table>
<input type="button"  value="添加"  onclick="(location.href='?ac=add')">
<?php                
}elseif($act == "edit"){
    $id = $_GET['type_id'];
    $sql = "select *from  `types` where type_id=$id ";
    $res = mysql_query($sql);
    echo "<form  method='post'  action='?ac=edit_ok'>";
    while($arr = mysql_fetch_assoc($res)){
        echo "当前名称:{$arr['type_name']}"."<br />";
        echo "新名称:<input type='text'  name='n_type_name'  >"."<br />";
        echo "<input type='hidden'  value={$arr['type_id']} name='id'/>";
    }
    echo "<input type='submit'  value='更新'>";
    echo "</form>";
}elseif($act == "edit_ok"){
    $name = trim($_POST['n_type_name']);
    $id = $_POST['id'];
    if(!empty($name)){
        $sql = "update  `types` set type_name='$name' where type_id=$id";
        mysql_query($sql);
        echo "<script>location.href('ok.php?act=list')</script>";
    }else{
        echo "<script>location.href('ok.php?act=list')</script>";
    }
}elseif($act == 'del'){
    //这里的删除是要把当前分类 和当前的子分类都要删除 所以用到$id%
    $id = $_GET['type_id'];
    $sql ="delete from `types` where type_p_id like '$id%' ";
    $res = mysql_query($sql);
    if($res){
        echo "<script>location.href('ok.php?act=list')</script>";
    }else{
        echo "<script>alert('删除失败');</script>";
    }
}
?>

types表:

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

下面是效果图:

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

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('list','add','del','edit','addok','edit_ok');
$act= in_array($_GET['ac'],$arr)?$_GET['ac']:$arr[0];
//连接数据库
$conn = mysql_connect("localhost","root","root")or die('数据库连接失败');
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['new_type_name'] = $str.$row['type_name'];
        $types[] = $row;
        getTypes($types,$row['type_id'],($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]['type_id']?>"><?php  echo $types[$i]['new_type_name']?></option>
    <?php
    }
    ?>
    </select><br />
    <input type="submit"  value="添加"/>
</form>
<?php
}elseif($act == "addok"){
    $type_name = $_POST['type_name'];
    $type_id = $_POST['type_id'];
    $sql = "insert into `type`(type_name,type_p_id) values ('$type_name','$type_id')";
    $res = mysql_query($sql);
    if(mysql_insert_id()>0){
        echo "<script>location.href='two.php?act=list'</script>";
    }else{
        echo "<script>alert('添加失败');</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['type_id']?></td>
    <td><?php echo $arr['type_name']?></td>
    <td><?php echo $arr['type_p_id']?></td>
    <td ><a href="?ac=edit&type_id=<?php echo $arr['type_id'];?>">编辑</a> |
        <a href="?ac=del&type_id=<?php echo $arr['type_id'];?>">删除</a></td>
</tr>
<?php
}
?>
</table>
<input type="button"  value="添加"  onclick="(location.href='?ac=add')">
<?php 
}elseif($act == "del"){
    /***
        这里要删除大分类的时候必须要删除该大分类下的子分类
        所以这里开始mysql事务 mysql 事务开启的方式 事务详细说明请参考
    */
    mysql_query("SET AUTOCOMMIT=1");//开启事务
    $type_id = $_GET['type_id'];
    //删除该分类
    $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='two.php?act=list'</script>";
    }else{
            mysql_query("ROLLBACK");
        echo "<script>alert('删除失败');</script>";
    }
}
?>

type表:

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

 

下面是效果图

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

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

PHP 相关文章推荐
用php获取远程图片并把它保存到本地的代码
Apr 07 PHP
snoopy PHP版的网络客户端提供本地下载
Apr 15 PHP
过滤掉PHP数组中的重复值的实现代码
Jul 17 PHP
又拍云异步上传实例教程详解
Apr 19 PHP
PHP记录和读取JSON格式日志文件
Jul 07 PHP
微信支付开发交易通知实例
Jul 12 PHP
PHP面向对象程序设计之命名空间与自动加载类详解
Dec 02 PHP
PHP截取发动短信内容的方法
Jul 04 PHP
PHP实现统计所有字符在字符串中出现次数的方法
Oct 17 PHP
Django 标签筛选的实现代码(一对多、多对多)
Sep 05 PHP
php基于Redis消息队列实现的消息推送的方法
Nov 28 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
Jun 02 PHP
php 目录遍历、删除 函数的使用介绍
Apr 28 #PHP
基于php权限分配的实现代码
Apr 28 #PHP
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
Apr 28 #PHP
phpcms模块开发之swfupload的使用介绍
Apr 28 #PHP
php中get_headers函数的作用及用法的详细介绍
Apr 27 #PHP
使用php get_headers 判断URL是否有效的解决办法
Apr 27 #PHP
php中serialize序列化与json性能测试的示例分析
Apr 27 #PHP
You might like
第十二节 类的自动加载 [12]
2006/10/09 PHP
php minixml详解
2008/07/19 PHP
PHP OPCode缓存 APC详细介绍
2010/10/12 PHP
thinkPHP5.0框架开发规范简介
2017/03/25 PHP
PHP调用接口用post方法传送json数据的实例
2018/05/31 PHP
实现php删除链表中重复的结点
2018/09/27 PHP
PHP 8新特性简介
2020/08/18 PHP
PHP dirname功能及原理实例解析
2020/10/28 PHP
用JS操作FRAME中的IFRAME及其内容的实现代码
2008/07/26 Javascript
jquery isEmptyObject判断是否为空对象的函数
2011/02/14 Javascript
js与jquery中获取当前鼠标的x、y坐标位置的代码
2011/05/23 Javascript
一个JavaScript操作元素定位元素的实例
2014/10/29 Javascript
基于jquery实现的自动补全功能
2015/03/12 Javascript
javascript实现unicode与ASCII相互转换的方法
2015/12/10 Javascript
使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
2016/02/15 Javascript
微信小程序 WXML、WXSS 和JS介绍及详解
2016/10/08 Javascript
JavaScript实现三级联动菜单效果
2017/08/16 Javascript
JavaSctit 利用FileReader和滤镜上传图片预览功能
2017/09/05 Javascript
JavaScript事件处理程序详解
2017/09/19 Javascript
详解AngularJS之$window窗口对象
2018/01/17 Javascript
vue使用localStorage保存登录信息 适用于移动端、PC端
2019/05/27 Javascript
video.js添加自定义组件的方法
2020/12/09 Javascript
python实现数独算法实例
2015/06/09 Python
简单实现Python爬取网络图片
2018/04/01 Python
详解python selenium 爬取网易云音乐歌单名
2019/03/28 Python
Python基于gevent实现高并发代码实例
2020/05/15 Python
详解Selenium 元素定位和WebDriver常用方法
2020/12/04 Python
印尼旅游网站:via
2017/11/12 全球购物
Myholidays美国:在线旅游网站
2019/08/16 全球购物
大课间体育活动方案
2014/03/12 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
党的群众路线教育实践活动对照检查材料(个人)
2014/09/24 职场文书
2014年电信员工工作总结
2014/12/19 职场文书
总账会计岗位职责
2015/04/02 职场文书
六一儿童节主持开场白
2015/05/28 职场文书
安装Ruby和 Rails的详细步骤
2022/04/19 Ruby