web 中 bbs 例子(多次递归)
数据库设计:
create table `header`( // 父表
parent int not null, //父级
poster varchar(20) not null, //作者
posted
datetime, //时间
title varchar(100), //标题
children
tiny(1) default 0, //是否有回复(1)[YES] (0)[NO]
postid int not null primary key
// 主键
);
create table `body`( //具体内容
postid int not null primary
key,
text text
);
代码示例(省略头尾,只显示大概内容区):
<?php
/*
* expand_all() 全部展示
*
$expanded 标示那些已经展开的
* $expand 那些要被展开
*
$_GET['expand'] 表示那些是要被展示的
* $_GET['collapse']
表示那些是要折叠的
*/
session_start();
function
db_connect(){
$conn = new mysqli("localhost", "root", "123456",
"dbname");
$conn->query("set names utf8");
return $conn
}
//
全部要展示出来
function expand_all(&$expanded){
$sql = "select postid from
header where children = 1";
$conn = db_connect();
$result =
$conn->query($sql);
while($row = $result->fetch_assoc()){
$expanded[$row['postid']] = true;
}
}
// 调用函数 start开始的parent,
$row 标示行号,用于交替颜色
function display_tree($expanded, $row = 0, $start = 0){
echo "<table width='580'>\n";
$tree = new treenode($start, 1, true,
-1, $expanded);
$tree->display($row);
echo
"</table>\n";
}
if(!isset($_GET['expand'])){
$_SESSION['expanded'] = array();
}
//
那些是要显示出来的
if(isset($_GET['expand'])){
if($_GET['expand'] ==
'all'){
expand_all($_SESSION['expanded']);
}else{
$_SESSION[$_GET['expanded']] = true;
}
}
//
那些是要折叠
if(isset($_GET['collaspe'])){
if($_GET['collaspe'] ==
'all'){
$_SESSION['expanded'] = array();
}else{
unset($_SESSION[$_GET['collapse']]);
}
}
// class
class treenode
{
public $m_postid; // id
public $m_children; // 是否有回复
public $m_depth; // 深度,就是递归深入的深度
public $m_childlist; // 是一个数组,表示要展示的
id
function __construct($postid, $children, $expand, $depth,
$expanded){
$this->m_postid = $postid;
$this->m_children =
$chilren;
$this->m_depth = $depth;
$this->m_childlist =
array();
if($expand && $this->m_children){
$conn =
db_connect();
$query = "select * from header where parent = '" .
$this->postid . "' order by posted";
$result =
$conn->query($query);
for($count=0; $row = $conn->fetch_assoc();
$count++){
if($expanded[$row['postid']] == true){
$expand =
true;
}else{
$expand = false;
}
$this->m_childlist[$count] = new treenode($row['postid'],
$row['children'],$expand, $depth+1, $expanded);
}
}
}
function display($row){
if($this->depth>-1){
echo
"<tr><td bgcolor=\"";
if($row%2){
echo
"#cccccc\">";
}else{
echo "#ffffff\">"
}
// 缩进
for($i=0; $i<$this->depth; $i++){
echo
"  p;";
}
if($this->children &&
sizeof($this->m_childlist)){
echo "<a href=\"index.php?collapse=\""
. $this->postid . "\"><img
src=\"images/--.gif\"/></a>";
}else
if($this->children){
echo "<a href=\"index.php?expand=\"" .
$this->postid . "\"><img
src=\"images/++.gif\"/></a>";
}else{
echo
" ";
}
echo "<a
href=\"view.php?parent={$this->postid}\">" . $this->postid
."</a></td></tr>\n";
$row++;
}
$num_children = sizeof($this->m_childlist);
for($i=0;
$i<$num_children; $i++){
$row =
$this->m_childlist[$i]->display($row);
}
return $row;
}
}
//
最后调用
display_tree($_SESSION['expanded']);
?>
图片效果如下:
首页初始化时如下:
全部展开时如下
以下是部分展开的两个效果图:
web 中 bbs 例子(多次递归)的更多相关文章
- HT for Web中3D流动效果的实现与应用
流动效果在3D领域有着广泛的应用场景,如上图中医学领域可通过3D的流动直观的观察人体血液的流动,燃气领域可用于监控管道内流动的液体或气体的流向.流速和温度等指标. 如今企业数据中心机房普遍面临着设备散 ...
- 基于gSOAP使用头文件的C语言版web service开发过程例子
基于gSOAP使用头文件的C语言版web service开发过程例子 一服务端 1 打开VS2005,创建一个工程,命名为calcServer. 2 添加一个头文件calc.h,编辑内容如下: 1// ...
- 【spring实战第五版遇到的坑】3.1中的例子报错
按照书中的例子,一直做到第3.1章使用JDBC读写数据时,在提交设计的taco表单时,报了如下的异常信息: Failed to convert property value of type java. ...
- Web中的积累:外观模式 Facade
摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 壹 前言 目测好久没写文章了,距离上一篇文章也有二十多天.我是怎么了?哈 ...
- Html的本质及在web中的作用
概要 本文以一个Socket程序为例由浅及深地揭示了Html的本质问题,同时介绍了作为web开发者我们在开发网站时需要做的事情 Html的本质以及开发需要的工作 1.服务器-客户端模型 其实,对于所有 ...
- [翻译]Spring MVC RESTFul Web Service CRUD 例子
Spring MVC RESTFul Web Service CRUD 例子 本文主要翻译自:http://memorynotfound.com/spring-mvc-restful-web-serv ...
- C#中的函数式编程:递归与纯函数(二) 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面
C#中的函数式编程:递归与纯函数(二) 在序言中,我们提到函数式编程的两大特征:无副作用.函数是第一公民.现在,我们先来深入第一个特征:无副作用. 无副作用是通过引用透明(Referential ...
- java web中各种context的关系
我举得这篇文章解决了我的很多疑惑,理清了我以前不太清楚的Context关系,读懂这篇文章很有助于理解源码, 原文链接在这里:https://www.jianshu.com/p/2537e2fec546 ...
- 优化Web中的性能
优化Web中的性能 简介 web的优化就是一场阻止http请求最终访问到数据库的战争. 优化的方式就是加缓存,在各个节点加缓存. web请求的流程及节点 熟悉流程及节点,才能定位性能的问题.而且优化的 ...
随机推荐
- redis整合spring @Bean写法
jedis是一款java连接redis的客户端,spring基于jedis进行了封装,提供了简洁的操作redis的方法. 使用maven进行管理jar包之间的依赖: <dependency> ...
- 安卓开发20:动画之Animation 详细使用-主要通过java代码实现动画效果
AlphaAnimation 透明效果实现: activity_main.xml中仅仅是一个简单的图片,下面的例子都会使用这个xml: <RelativeLayout xmlns:android ...
- 自助用户选择VM Network
在VMM中为用户所属角色分配“作者VM网络”权限后,用户才可以在部署虚机的选择不同的VM Network,否则用户只能使用模板上所使用的VM Network,无法进行选择
- URAL - 1736 - Chinese Hockey
题意:n支队伍打比赛,每2队只进行1场比赛,规定时间内胜得3分,败得0分,若是打到了加时赛,那么胜得2分,败得1分,给出n支队伍最后的总得分,问这个结果是否是可能的,是的话输出“CORRECT”及各场 ...
- SignalR安装以及安装问题
正常节奏 介绍 SignalR 是 ASP.NET 团队正在开发的一个 Microsoft .NET Framework 库和 jQuery 插件,可能包括在以后版本的 ASP.NET 平台中. 它提 ...
- bind的例子
10.24 给定一个string,使用bind和check_size在一个int的vector中查找第一个大于string长度的值. #include<iostream> #include ...
- 写个 Hello World 而已,要不要这么震撼?!
Atom 编辑器的一个插件,可以让你写代码的时候体验狂拽酷炫的效果! 如果来点音乐.再配上机械键盘的话,写代码是不是爽到爆呢? 这货全名叫: activate-power-mode atom pack ...
- DiscreteSeekBar使用简介,一个带气泡的SeekBar
android自带的SeekBar样式比较古板,如果我们想让自己的SeekBar炫起来,那么可以考虑使用DiscreteSeekBar.DiscreteSeekBar是GitHub上的一个开源控件,地 ...
- ArcGIS Server JavaScript API 各命名空间的含义【转】
1.esri 命名空间 所有的对象都是在 esri 命名空间下的,esri 有自己的属性和方法. 如 esri.version 返回当前 JavaScript API 的版本号.e ...
- 通过文件读写方式实现Matlab和Modelsim的联合仿真
虽然Modelsim的功能非常强大,仿真的波形可以以多种形式进行显示,但是当涉及到数字信号处理的算法的仿真验证的时候,则显得有点不足.而进行数字信号处理是Matlab的强项,不但有大量的关于数字信号处 ...