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
Dec 14 PHP
php sprintf()函数让你的sql操作更安全
Jul 23 PHP
解析php中两种缩放图片的函数,为图片添加水印
Jun 14 PHP
Session服务器配置指南与使用经验的深入解析
Jun 17 PHP
PHP的PSR规范中文版
Sep 28 PHP
yii的CURD操作实例详解
Dec 04 PHP
php使用wordwrap格式化文本段落的方法
Mar 17 PHP
smarty模板引擎之配置文件数据和保留数据
Mar 30 PHP
laravel中命名路由的使用方法
Feb 24 PHP
php + WebUploader实现图片批量上传功能
May 06 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
Oct 14 PHP
PHP 命名空间和自动加载原理与用法实例分析
Apr 29 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
适用于抽奖程序、随机广告的PHP概率算法实例
2014/04/09 PHP
浅谈php中include文件变量作用域
2015/06/18 PHP
PHP获取昨天、今天及明天日期的方法
2016/02/03 PHP
php中关于长度计算容易混淆的问题分析
2016/05/27 PHP
Yii2中SqlDataProvider用法示例
2016/09/22 PHP
原生php实现excel文件读写的方法分析
2018/04/25 PHP
javascript mouseover、mouseout停止事件冒泡的解决方案
2009/04/07 Javascript
extJs 常用到的增,删,改,查操作代码
2009/12/28 Javascript
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
Javascript异步编程模型Promise模式详细介绍
2014/05/08 Javascript
node.js中的path.resolve方法使用说明
2014/12/08 Javascript
javascript原型链继承用法实例分析
2015/01/28 Javascript
jQuery实现转动随机数抽奖效果的方法
2015/05/21 Javascript
JavaScript实现把数字转换成中文
2015/06/29 Javascript
jQuery树形控件zTree使用小结
2016/08/02 Javascript
AngularJS教程 ng-style 指令简单示例
2016/08/03 Javascript
jQuery插件HighCharts实现气泡图效果示例【附demo源码】
2017/03/13 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
2017/03/21 Javascript
详解vue项目优化之按需加载组件-使用webpack require.ensure
2017/06/13 Javascript
windows下更新npm和node的方法
2017/11/30 Javascript
使用mint-ui实现省市区三级联动效果的示例代码
2018/02/09 Javascript
快速了解Node中的Stream流是什么
2019/02/13 Javascript
[36:14]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第二局
2016/02/28 DOTA
Python爬虫实战:分析《战狼2》豆瓣影评
2018/03/26 Python
Django项目中添加ldap登陆认证功能的实现
2019/04/04 Python
HTML5拖拽文件上传的示例代码
2021/03/04 HTML / CSS
怎样从/向数据文件读/写结构
2014/11/23 面试题
爱情保证书范文
2014/02/01 职场文书
人事科岗位职责范本
2014/03/02 职场文书
优秀团员事迹材料1000字
2014/08/20 职场文书
升国旗演讲稿
2014/09/05 职场文书
2014-2015学年工作总结
2014/11/27 职场文书
销售督导岗位职责
2015/04/10 职场文书
市直属机关2016年主题党日活动总结
2016/04/05 职场文书
python调试工具Birdseye的使用教程
2021/05/25 Python
详解Python+OpenCV绘制灰度直方图
2022/03/22 Python