频道直达 - 专题 - 新闻 - 基础 - 高级 - 安装 - 技巧 - 数据库 - 手册 - PHP - Linux - Java - MySQL - Apache - 麻辣堂 - 狼盟 - Rails社群 - 搜索 - 下载 - 开源 - 论坛
PHP开发资源网 主页>>PHP基础教程>> 收藏此文 | 收藏本站 | 设为首页

无限分类&树型论坛的实现方法

来源:www.phpres.com 作者:Angelover 出处:www.phpres.com 2007-5-1 10:51:33 进入讨论组
关 键 词: 无限分类&树型论坛的实现方法

分类表数据表参考:

CREATE TABLE `mf_sort` (
  `sortid` smallint(3) unsigned NOT NULL auto_increment,
  `main` tinyint(2) unsigned NOT NULL default '0',
  `parentid` smallint(3) unsigned NOT NULL default '0',
  `layer` smallint(3) unsigned NOT NULL default '0',
  `orders` tinyint(2) unsigned NOT NULL default '0',
  `sort` varchar(100) NOT NULL default '',
  PRIMARY KEY  (`sortid`),
  KEY `main` (`main`,`parentid`,`layer`,`orders`)
) ;
#sortid 类别编号
#main 根分类
#parentid 父ID
#layer 分类等级
#orders 排列顺序
#输出的时候 order by `main` asc, `orders` asc

两个主要的函数

function get_main_layer_orders($parentid)
{
    global $x_db;
    $sql  = "select `main`, `layer`, `orders` ";
    $sql .= "from `mf_sort` ";
    $sql .= "where `sortid`='$parentid'";
    $x_db->exec($sql);
    $data   = $x_db->get_data();
    $layer  = $data[0]['layer']+1;
    $main   = $data[0]['main'];
    $orders = $data[0]['orders'];

    $sql  = "select `sortid` from `mf_sort` ";
    $sql .= "where `parentid`='$parentid'";
    $x_db->exec($sql);
    $n = $x_db->n;
    if ($n>0)
    {
        $lastid = $parentid;
        get_lastid($lastid);
        $sql    = "select `orders` from `mf_sort` ";
        $sql   .= "where `sortid`='$lastid'";
        $x_db->exec($sql);
        $data   = $x_db->get_data();
        $orders = $data[0][0];
        $sql    = "update `mf_sort` ";
        $sql   .= "set `orders`=`orders`+1 ";
        $sql   .= "where `orders`>$orders and `main`='$main'";
        $x_db->exec($sql);
        $orders = $orders + 1;
        return array($main, $layer, $orders);
    }
    else
    {
        $sql    = "update `mf_sort` ";
        $sql   .= "set `orders`=`orders`+1 ";
        $sql   .= "where `orders`>$orders and `main`='$main'";
        $x_db->exec($sql);
        return array($main, $layer, $orders+1);
    }
}

//取得最后一个有效sortid
function get_lastid(&$parentid)
{
    global $x_db;
    $pre  = $parentid;
    $sql  = "select max(`sortid`) as `id` ";
    $sql .= "from `mf_sort` ";
    $sql .= "where `parentid` = '$parentid'";
    $x_db->exec($sql);
    $data = $x_db->get_data();
    $id   = $data[0]['id'];
    if (empty($id))
    {
        $parentid = $pre;
    }
    else
    {
        $parentid = $id;
        get_lastid($parentid);
    }
}

演示页面: http://tech.2fs.cn/mf_sort/sort.php
sort.php的代码:

<?php
//
// +-------------------------------------------------
// | id: sort.php                                 
// +-------------------------------------------------
// | Copyright (c) Arvan        
// +-------------------------------------------------
// | Creat Date:   2003-9-25
// | Modify Date:  2003-9-26
// | Note:
// |
// |
// |
// +--------------------------------------------------
//

include_once "global.php";

$sql = "select `sortid`, `sort`, `parentid`, `layer` from `mf_sort` order by `main` desc, `orders` asc";
$x_db->exec($sql);
$data = $x_db->get_data();
?>
<html>
<head>
<title>类别管理</title>
<meta http-equiv="Content-Type" content="text/html; charset=??????">
<link href="main.css" rel="stylesheet" type="text/css">
<script language="JavaScript">
function add_new_sort(parentsort)
{   
    if (parentsort=='')
    {
        alert('请正确选择类别!');
        return false;
    }
    addarea.innerHTML = "# 为了好的显示效果,此部分省略";
}
</script>
</head>

<body bgcolor="#F2F2F2">
<p>&nbsp;</p>
<form name="form1" method="post" action="mf_sort_conf.php">
  添加根分类:
  <input name="newmainsort" type="text" id="newmainsort">
  <input name="action" type="hidden" value="newmainsort">
  <input type="submit" name="submit" value="确定">
</form><br><br>
<form name="form2" method="post" action="mf_sort_conf.php">
  <select name="parentsort">
    <option>分类列表</option>
    <?
    for ($i=0; $i<sizeof($data); $i++)
    {   
        $layer  = $data[$i]['layer'];
        $sort   = $data[$i]['sort'];
        $sortid = $data[$i]['sortid'];
        $space = '';
        for($s=0; $s<$layer; $s++)
        {
            $space = $space."--";
        }
        echo "<option value=\"$sort\">$space"."$sort</option>\n";
    }
    ?>
  </select>
  <input type="button" name="action" value="编辑" disabled>
  <input type="button" name="action" value="删除" disabled>
  <input type="button" value="添加子分类" onClick="return add_new_sort(this.form.parentsort.value)">
</form>
<br><br>
<span id="addarea"></span>
</body>
</html>

mf_sort_conf.php的代码:

<?php
//
// +-------------------------------------------------
// | id: mf_sort_conf.php                                 
// +-------------------------------------------------
// | Copyright (c) Arvan      
// +-------------------------------------------------
// | Creat Date:  2003-9-26
// | Modify Date: 2003-9-26
// | Note:
// |
// |
// |
// +--------------------------------------------------
//

include_once "global.php";

$action  =& $_POST['action'];
if ($action=='newmainsort') //添加根分类
{
    $newmainsort =& $_POST['newmainsort'];
    $sql  = "select max(`main`) as `main` from `mf_sort`";
    $x_db->exec($sql);
    $data = $x_db->get_data();
    $main = $data[0]['main']+1;
   
    $sql  = "insert into `mf_sort` ";
    $sql .= "(`sortid`, `main`, `parentid`, `layer`, `orders`, `sort`) ";
    $sql .= "values('', '$main', '0', '0', '0', '$newmainsort')";
    $x_db->exec($sql);
    $n    = $x_db->n;
    if ($n>0)
    {
        Alert("添加成功!", $url='sort.php');
        exit;
    }
}

if ($action=='newsort') //添加子分类
{
    $parentsort =& $_POST['parentsort']; //父类名
    $newsort    =& $_POST['newsort'];    //子类名(即需要添加的分类名)

    $sql  = "select `sortid` from `mf_sort` ";
    $sql .= "where `sort`='$parentsort'";
    $x_db->exec($sql);
    $data = $x_db->get_data();
   
    $parentid = $data[0][0];
    $MLO      = get_main_layer_orders($parentid);
    $main     = $MLO[0];
    $layer    = $MLO[1];
    $orders   = $MLO[2];

    $sql  = "insert into `mf_sort` ";
    $sql .= "(`sortid`, `main`, `parentid`, `layer`, `orders`, `sort`) ";
    $sql .= "values('', '$main', '$parentid', '$layer', '$orders', '$newsort')";
    $x_db->exec($sql);
    $n    = $x_db->n;
    if ($n>0)
    {
        Alert("添加成功!", $url='sort.php');
        exit;
    }
}

$x_db->free(); //释放
?>


$x_db 所用到的数据库类
/*****
// +-------------------------------------------------
// | Id: vbf_db.php                                 
// +-------------------------------------------------
// | Copyright (c)  
// | Author:Arvan
// +-------------------------------------------------
// | Create Date: 2003-6-23
// | Modify Date:
// | Note:
// |        数据库操作的类
// |
// |
// +-------------------------------------------------
*****/

class TDb{
        var $host;
        var $user;
        var $password;
        var $database;

        var $n;
        var $result="";
        var $conn="";

        var $debug = true;
        var $errMsg = "";

        function TDb($host,$user,$password,$database){
                $this->host=$host;
                $this->user=$user;
                $this->password=$password;
                $this->conn=@mysql_connect($host,$user,$password) or die("<br><br><b>Err:</b>SQL busy,please try again later!");
               
                $this->set_db($database);

                $this->errMsg ="";
                $this->n = 0;
        }
        //end of func tdb

        function exec($sql, $db_name = ''){
                if (($db_name != '') && ($db_name != $this->database)){
                        $old_db = $this->database;
                        $this->set_db($db_name);
                }
                $this->n = 0;
                $this->result=@mysql_query($sql,$this->conn);
                if (mysql_error() != ""){
                        $this->errMsg = mysql_error();
                        if ($this->debug){
                                echo "<br><br><b>Err:</b>Fail to execute this SQL query:$sql<br><br>$this->errMsg";
                        }else{
                                echo "<br><br><br><b>Err:</b>Please check the query is normal and make sure that It's allowed!";
                        }
                        exit;
                }
                $this->n = @mysql_affected_rows();
                if($old_db != ''){
                        $this->set_db($old_db);
                }
                return true;
        }

        function get_data(){
                if($this->result==""){
                        echo "<br><br><b>Err:</b>There is no result please run method exec(\$sql) first";
                        exit;
                }
                $count=0;
                while($row=mysql_fetch_array($this->result)){
                        $data[$count]=$row;
                        $count++;
                }
                mysql_free_result($this->result);
                return $data;
        }
        //end of func get_data


        function get_ins_id(){
                return mysql_insert_id();
        }

        function free(){
                mysql_close($this->conn);
        }

        function set_db($db_name){
                if($db_name != $this->database){//select new table while they are different
                        @mysql_select_db($db_name) or die("<br><b>Err:</b>Fail to select $db_name table, make sure it's allowed to do this!");
                        $this->database=$db_name;
                }
                return true;
        }

        function get_cur_db(){
                return $this->database;
        }
}
//End of class db
欢迎进入PHP开发资源论坛讨论。
收藏此文】【 】【打印】【关闭
相关文章
图文推荐
论 坛 资 源
PHP开发资源网奋斗目标
阅读排行:
热门技术文档
最新图文档
本站编辑推荐:(本站开通Delphi4PHP专区,欢迎进入论坛交流!)
编缉最近更新文章
网站赞助商
搜索您感兴趣的内容
 
   网站首页 -  网站地图 -  网站合作 -  手册中心 -  通用网址 -  网站论坛 -  网站投稿 -  友情链接 -  帮助中心
版权所有:PHP开发资源网 © 2003-2008 通用网址:PHP资源网 合作媒体: 赛迪网IT技术
互联网违法和不良信息举报中心 | 不良信息举报信箱