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
IIS环境下快速安装、配置和调试PHP5.2.0
Dec 17 PHP
php流量统计功能的实现代码
Sep 29 PHP
php5.5中类级别的常量使用介绍
Oct 02 PHP
彻底删除thinkphp3.1案例blog标签的方法
Dec 05 PHP
PHP邮件群发机实现代码
Feb 16 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
Nov 10 PHP
Yii2 批量插入、更新数据实例
Mar 15 PHP
全面解析PHP面向对象的三大特征
Jun 10 PHP
php的常量和变量实例详解
Jun 27 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
Jul 26 PHP
Laravel中日期时间处理包Carbon的简单使用
Sep 21 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实现编辑和保存文件的方法
2015/07/20 PHP
脚本吧 - 幻宇工作室用到js,超强推荐base.js
2006/12/23 Javascript
javascript innerHTML、outerHTML、innerText、outerText的区别
2008/11/24 Javascript
ajax 文件上传应用简单实现
2009/03/03 Javascript
js文本框输入点回车触发确定兼容IE、FF等
2013/11/19 Javascript
IE、FF浏览器下修改标签透明度
2014/01/28 Javascript
我的Node.js学习之路(四)--单元测试
2014/07/06 Javascript
基于jquery ui的alert,confirm方案(支持换肤)
2015/04/03 Javascript
深入学习JavaScript中的Rest参数和参数默认值
2015/07/28 Javascript
js焦点文字滚动效果代码分享
2015/08/25 Javascript
关于Bootstrap按钮组件消除黄框的方法
2017/05/19 Javascript
微信分享调用jssdk实例
2017/06/08 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
在一般处理程序(ashx)中弹出js提示语
2017/08/16 Javascript
JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
2018/02/06 Javascript
Vue实现带进度条的文件拖动上传功能
2018/02/23 Javascript
JavaScript 正则命名分组【推荐】
2018/06/07 Javascript
iview同时验证多个表单问题总结
2018/09/29 Javascript
webpack中如何加载静态文件的方法步骤
2019/05/18 Javascript
Python写的英文字符大小写转换代码示例
2015/03/06 Python
Python计算三维矢量幅度的方法
2015/06/15 Python
Python中Scrapy爬虫图片处理详解
2017/11/29 Python
pandas获取groupby分组里最大值所在的行方法
2018/04/20 Python
python实现AES加密解密
2019/03/28 Python
决策树剪枝算法的python实现方法详解
2019/09/18 Python
Python如何使用函数做字典的值
2019/11/30 Python
Python使用for生成列表实现过程解析
2020/09/22 Python
谈谈对css属性box-sizing的了解
2017/01/04 HTML / CSS
墨西哥网上购物:Linio墨西哥
2016/10/20 全球购物
如何整合JQuery和Prototype
2014/01/31 面试题
员工自我鉴定范文
2013/10/06 职场文书
社区党总支书记先进事迹材料
2014/01/24 职场文书
义和团口号
2014/06/17 职场文书
先进班集体申报材料
2014/12/26 职场文书
一封真诚的自荐信帮你赢得机会
2019/05/07 职场文书
tensorboard 可视化之localhost:6006不显示的解决方案
2021/05/22 Python