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数据库连接
Oct 09 PHP
PHP 时间转换Unix时间戳代码
Jan 22 PHP
PHP 写文本日志实现代码
May 18 PHP
网站用php实现paypal整合方法
Nov 28 PHP
PHP在不同页面间传递Json数据示例代码
Jun 08 PHP
PHP实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)
May 10 PHP
经典PHP加密解密函数Authcode()修复版代码
Apr 05 PHP
yii2.0实现pathinfo的形式访问的配置方法
Apr 06 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
Aug 07 PHP
PHP利用DWZ.CN服务生成短网址
Aug 11 PHP
PHP预定义接口――Iterator用法示例
Jun 05 PHP
PHP连接SQL server数据库测试脚本运行实例
Aug 24 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
构建简单的Webmail系统
2006/10/09 PHP
PHP用mysql数据库存储session的代码
2010/03/05 PHP
PHP变量的作用范围实例讲解
2020/12/22 PHP
Javascript Object.extend
2010/05/18 Javascript
JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享
2013/07/02 Javascript
查看大图功能代码jquery版
2013/11/05 Javascript
jquery使用淘宝接口跨域查询手机号码归属地实例
2013/11/28 Javascript
JavaScript实现俄罗斯方块游戏过程分析及源码分享
2015/03/23 Javascript
基于JavaScript实现鼠标向下滑动加载div的代码
2016/08/31 Javascript
AngularJs Understanding the Model Component
2016/09/02 Javascript
jQuery中Find选择器用法示例
2016/09/21 Javascript
vuejs指令详解
2017/02/07 Javascript
深入浅析Vue.js中 computed和methods不同机制
2018/03/22 Javascript
webpack打包多页面的方法
2018/11/30 Javascript
vue实现歌手列表字母排序下拉滚动条侧栏排序实时更新
2019/05/14 Javascript
Vue的属性、方法、生命周期实例代码详解
2019/09/17 Javascript
微信小程序如何播放腾讯视频的实现
2019/09/20 Javascript
jQuery 判断元素是否存在然后按需加载内容的实现代码
2020/01/16 jQuery
Python用GET方法上传文件
2015/03/10 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
2018/10/14 Python
使用celery执行Django串行异步任务的方法步骤
2019/06/06 Python
python 绘制拟合曲线并加指定点标识的实现
2019/07/10 Python
django的ORM操作 删除和编辑实现详解
2019/07/24 Python
python飞机大战pygame游戏框架搭建操作详解
2019/12/17 Python
Python实现Kerberos用户的增删改查操作
2020/12/14 Python
移动端Html5页面生成图片解决方案
2018/08/07 HTML / CSS
LTD Commodities:礼品,独特发现,家居装饰,家用器皿
2017/08/11 全球购物
英国在线购买马术服装:EQUUS
2019/07/12 全球购物
自荐信格式简述
2014/01/25 职场文书
教师敬业奉献模范事迹材料
2014/05/18 职场文书
群众对十八届四中全会的期盼
2014/10/17 职场文书
2014旅游局党组书记党建工作汇报材料
2014/11/02 职场文书
2014年精神文明建设工作总结
2014/11/19 职场文书
2015年女生节活动总结
2015/02/27 职场文书
有关骆驼祥子的读书笔记
2015/06/26 职场文书
ConditionalOnProperty配置swagger不生效问题及解决
2022/06/14 Java/Android