关 键 词:
无限分类&树型论坛的实现方法
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
`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);
}
}
{
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> </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>
//
// +-------------------------------------------------
// | 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> </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(); //释放
?>
//
// +-------------------------------------------------
// | 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开发资源论坛讨论。
// +-------------------------------------------------
// | 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显示图片的EXIF信息
·显示数码图片的EXIF信息 Discuz插件ForDisc
·在PHP中cookie和session的使用总结
·哪个CMS比较好用-Mambo出鞘,谁与争锋?
·在PHP中使用Header()函数介绍
·用PHP实现JS的escape和unescape函数功能
·Cute Editor for PHP 6.0─ 一個所見即所得
·每一個 PHP 開發者都應該認識的十個開發項
·整理的Discuz程序文件目录含义表
·使用PHP伪造sessionid做防刷新功能
·显示数码图片的EXIF信息 Discuz插件ForDisc
·在PHP中cookie和session的使用总结
·哪个CMS比较好用-Mambo出鞘,谁与争锋?
·在PHP中使用Header()函数介绍
·用PHP实现JS的escape和unescape函数功能
·Cute Editor for PHP 6.0─ 一個所見即所得
·每一個 PHP 開發者都應該認識的十個開發項
·整理的Discuz程序文件目录含义表
·使用PHP伪造sessionid做防刷新功能
热门技术文档
·国外主流PHP框架评测
·用PHP显示图片的EXIF信息
·显示数码图片的EXIF信息 Discuz插件ForDisc
·在PHP中cookie和session的使用总结
·哪个CMS比较好用-Mambo出鞘,谁与争锋?
·在PHP中使用Header()函数介绍
·用PHP实现JS的escape和unescape函数功能
·Cute Editor for PHP 6.0─ 一個所見即所得
·每一個 PHP 開發者都應該認識的十個開發項
·整理的Discuz程序文件目录含义表
·用PHP显示图片的EXIF信息
·显示数码图片的EXIF信息 Discuz插件ForDisc
·在PHP中cookie和session的使用总结
·哪个CMS比较好用-Mambo出鞘,谁与争锋?
·在PHP中使用Header()函数介绍
·用PHP实现JS的escape和unescape函数功能
·Cute Editor for PHP 6.0─ 一個所見即所得
·每一個 PHP 開發者都應該認識的十個開發項
·整理的Discuz程序文件目录含义表
最新图文档
本站编辑推荐:(本站开通Delphi4PHP专区,欢迎进入论坛交流!)
- · 3分钟快速了解 Delphi for PHP 特色 (中文), PDF档
- · 购买Delphi for PHP的五大理由, PDF档
- · Delphi for PHP 使用规格介绍, PDF档
- · Delphi for PHP 問答集 (From CodeGear)
- · Delphi for PHP 产品价格表
编缉最近更新文章
网站赞助商
搜索您感兴趣的内容




