最近问无限分类的类树问题比较多,所以一高兴自己写了一个,我刚写完的,大家用用看,看看怎么实现起来更快,更简单,把你的树也贴出来(要只查询一次数据库的)<br>
这是一棵分类列表的类树, 支持无限分类<br>
一个分类下面可以同时有"包含子类的分类"和"最终分类";<br>
唯一的优点是*****只需要进行一次的数据库*****查询.<br>
样子不是很好看,不过可以自定义修改,可以自己定义css加里面<br>
缓存方面还没有作,可以自己补上
下面例子的目录结构是这样的。
¦--Catagory.php <br>
¦--images----tree.jsp <br>
¦--images----treeopen.gif <br>
¦--images----treeclose.gif <br>
¦--images----line.gif <br>
/****************tree.jsp********************/
function expand(id){
node = document.all('node'+id);
if(node.style.display==''){
node.style.display = 'none';
document.images('img'+id).src = imgopen;
}else{
node.style.display = '';
document.images('img'+id).src = imgclose;
}
}
/****************Catagory.php********************/
<?php
define('CATAGORY_TREE_EXPEND_NONE',0);
define('CATAGORY_TREE_EXPEND_ALL',1);
class Catagory{
//基础分类数据
var $treeData = array();
//分类的等级结构数组,以分类的id值作为数组的关键字
var $treePList = array();
//自分类对应上级类的关系
var $treeCList = array();
/*
* 这个是大分类的模板
*
* __id__ 分类的编号
* __name__ 分类的名称
* __image__ 分类前面显示的图像名称 $imgOpen or $imgClose
* __open__ 分类当前是否是展开的
* __inner__ 子分类显示的位置 * 样式可以根据自己的需要任意修改 ,但是不能删除现有的元素
*/
var $blockTpl = '
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td colspan="2"><a onclick="expand(__id__); return false;" href="#">
<img src="/blog_article/__image__/index.html" border="0" width="15" height="15" id="img__id__"></a>
<a onclick="expand(__id__); return false;" href="#">
__name__</a></td>
</tr>
<tr id="node__id__" >
<td width="20"></td><td>__inner__</td>
</tr>
</table>';
/*
* 这个是小分类的模板
*
* see $blockTpl
*/
var $elementTpl = '<img src="/blog_article/images/line.gif" width="15" height="15"><a href="/blog_article/id/__id__.html"><font color="white">__name__</font></a><br/>';
/*
* 这个是当前位置显示模板
*
* see $blockTpl
*/
var $currentTpl = '<a href="/blog_article/id/__id__.html"><font color="white">__name__</font></a>';
var $js = "images/tree.js";
var $imgOpen = 'images/treeopen.gif';
var $imgClose = 'images/treeclose.gif';
var $imgLine = 'images/line.gif';
var $cachFile = '';
var $expand = 0;
var $result = array();
var $treeStr = '';
var $currentStr = '';
/*
* 用来初始化,传入分类数据
*
*param $data array()
*/
function Catagory(&$data){
$this->_init($data);
}
function _init($tmpData){
$plevel = $clevel = $treeData = array(); foreach($tmpData as $value){
$treeData[$value['id']] = $value;
$plevel[$value['pid']][$value['id']] = 'END';
$clevel[$value['id']] = $value['pid'];
}
$this->treeData = &$treeData;
$this->treePList = &$plevel;
$this->treeCList = &$clevel;
}
/*
* 解析分类列表
*
*param $cataId int 要解析的主分类的编号
*/
function parseNode($cataId=0){
$this->result = $this->treePList[$cataId];
if($this->result==null) die("Catagory id error");
$this->treeStr = $this->_doNode($this->result);
$this->treeStr .= $this->_jsParse();
}
function &_doNode(&$result){
$nstr = $estr = '';
foreach($result as $key=>$value){
if(isset($this->treePList[$key])){
$result[$key] = $this->treePList[$key];
$inner = $this->_doNode($result[$key]);
$nstr .= $this->_parseNodeTpl($key, $inner);
}else{
$estr .= $this->_parseElementTpl($key);
}
}
return $nstr.$estr;
}
function &_parseNodeTpl($cataId, $inner){
$data = $this->treeData[$cataId];
$str = preg_replace(' ¦__id__ ¦', $data['id'], $this->blockTpl);
$str = preg_replace(' ¦__name__ ¦', $data['name'], $str);
$str = preg_replace(' ¦__image__ ¦', ($this->expand? $this->imgClose:$this->imgOpen), $str);
$str = preg_replace(' ¦__open__ ¦', ($this->expand?'':'none'), $str);
$str = preg_replace(' ¦__inner__ ¦', $inner, $str);
return $str;
}
function _parseElementTpl($cataId){
$data = $this->treeData[$cataId];
$str = preg_replace(' ¦__id__ ¦', $data['id'], $this->elementTpl);
$str = preg_replace(' ¦__name__ ¦', $data['name'], $str);
$str = preg_replace(' ¦__image__ ¦', $this->imgLine, $str);
return $str;
} function _jsParse(){
$str = "<script language=\"javascript\">
imgopen = \"$this->imgOpen\";
imgclose = \"$this->imgClose\";
</script><script src=/index.html"$this->js\" language=\"javascript\"></script>";
return $str;
}
/*
* 展开分类$cataId
*
*param $cataId int 要展开的分类的编号
*/
function parseCurrent($cataId){
$str = '';
$str .= $this->_parseCurrentTpl($cataId);
while(isset($this->treeCList[$cataId]) && $this->treeCList[$cataId]!=0){
$cataId = $this->treeCList[$cataId];
$str = $this->_parseCurrentTpl($cataId).'->'.$str;
}
$this->currentStr = &$str;
}
function _parseCurrentTpl($cataId){
$data = $this->treeData[$cataId];
$str = preg_replace(' ¦__id__ ¦', $data['id'], $this->currentTpl);
$str = preg_replace(' ¦__name__ ¦', $data['name'], $str);
return $str;
}
/*
* 解析当前分类的路径
*
*param $cataId int 要解析的主分类的编号
*/
function expand($cataId){
if($this->expand>0) return ;
$str = '';
if(isset($this->treePList[$cataId])) $str .= "expand($cataId);";
while(isset($this->treeCList[$cataId]) && $this->treeCList[$cataId]!=0){
$str .= "expand(".$this->treeCList[$cataId].");";
$cataId = $this->treeCList[$cataId];
}
$this->treeStr .= "<script language=\"javascript\">$str</script>";
}
/*
* 返回当前分类的路径
*/
function getCurrentStr(){ return $this->currentStr;
}
/*
* 返回分类的类树
*/
function getTreeStr(){
return $this->treeStr;
}
function setTpl($blockTpl, $elementTpl, $currentTpl, $js){
$this->blockTpl = $blockTpl;
$this->elementTpl = $elementTpl;
$this->currentTpl = $currentTpl;
$this->js = $js;
}
function setImage($open, $close, $line){
$this->imgOpen = $open;
$this->imgClose = $close;
$this->imgLine = $line;
}
function setExpend($expand){
$this->expand = $expand;
}
}
//分类的基础数据的样子如下:
$data = array(array('id'=>1, 'name'=>'name1', 'pid'=>0, 'order'=>1),
array('id'=>2, 'name'=>'name2', 'pid'=>1, 'order'=>1),
array('id'=>3, 'name'=>'name3', 'pid'=>0, 'order'=>1),
array('id'=>4, 'name'=>'name4', 'pid'=>3, 'order'=>1),
array('id'=>5, 'name'=>'name5', 'pid'=>6, 'order'=>1),
array('id'=>6, 'name'=>'name6', 'pid'=>2, 'order'=>1),
array('id'=>7, 'name'=>'name7', 'pid'=>6, 'order'=>1),
array('id'=>8, 'name'=>'name8', 'pid'=>3, 'order'=>1),
array('id'=>9, 'name'=>'name9', 'pid'=>6, 'order'=>1),
array('id'=>10, 'name'=>'name10', 'pid'=>0, 'order'=>1),
array('id'=>11, 'name'=>'name11', 'pid'=>10, 'order'=>1),
array('id'=>12, 'name'=>'name12', 'pid'=>10, 'order'=>1),
array('id'=>13, 'name'=>'name13', 'pid'=>10, 'order'=>1),
array('id'=>14, 'name'=>'name14', 'pid'=>12, 'order'=>1),
array('id'=>15, 'name'=>'name15', 'pid'=>12, 'order'=>4),
); echo "<body bgcolor=\"blue\">";
$tree = new Catagory($data);
echo "<hr>下面是当前分类的类树<hr>";
//$tree->setExpend(1);
$tree->parseNode(0);
//$tree->parseNode(1);
//$tree->expand(9);
echo $tree->getTreeStr();
echo "<hr>下面是当前分类(分类的编号是9)的路径<hr>";
$tree->parseCurrent(9);
echo $tree->getCurrentStr();
笔者在网站开发中,采用PHP4.0+MySQL3.23.38建立了多种应用。下面,以一个简单的聊天室设计为例,介绍PHP+MySQL在网页开发中的应用。
1、总体设计
1. 1 构思与规划:
聊天室的基本原理,就是把每个连上同一网页的用户传送的发言数据储存起来,然后将所有的发言数据传给每一用户。也就是说,用数据库汇集每个人的发言,并将数据库中的数据传给每一个人就实现了聊天室的功能。
1.2 表设计
首先使用MySQL建立表chat用来储存用户的发言:
mysql> CREATE TABLE chat
-> (chtime DATATIME,
-> nick CHAR(10) NOT NULL,
->words CHAR(150));
表中只设定了三个域,chtime是发言的时间,nick为发言者的昵称,words是发言的内容,发言最多150个字符
1.3 网页设计
一个最简单的聊天室通常需要两个页框:一个页框是用户输入发言的表单,另一个用来显示大家的发言。所以代码段通常至少需要如下几段:
建立页框的结构(main.php)
显示大家发言的程序段(cdisplay.php)
传送用户发言的程序段(speak.php)
用户登录进入聊天室程序段(login.php)
2 、代码设计
以上规划完成后,就可以着手代码设计了,采用php可以非常简明实现以上的功能。
2.1 用户登录login.php,本段代码是一个完全HTML网页
<html>
<head>
<title>用户登录</title>
</head>
<body>请输入您的昵称<br>
<form action="/blog_article/main.html" method="post" target="_self">
<input type="text" name="nick" cols="20">
<input type="submit" value="登录">
</body>
</html>
用户提交自己的昵称后,就进入到聊天室,以下的处理交由main.php处理。
2.2 页框主体代码段main.php:
<?
setcookie("nick",$nick) //用cookie记录用户昵称,是常用的传递变量方法
?>
<html>
<title>山西铝厂聊天室试用版ver1.0</title>
<frameset rows="80%,*">
<frame src="/blog_article/cdisplay.html" name="chatdisplay">
<frame src="/blog_article/speak.html" name="speak">
</frameset>
</html>
2.3 显示发言cdisplay.php
本代码段的任务是将表chat中的数据取出,显示在页框中。每次刷新时,取数据库中最近的15条发言。同时,为防止数据库无限增大,需设计删除陈旧数据的功能。代码如下
<html>
<head>
<title>显示用户发言</title>
<meta http-equiv="refresh" content="5;url=cdisplay.php">
</head>
<body>
<?
$link_ID=mysql_connect("main","root");
//链接Mysql服务器 服务器名为main,管理员名为root
mysql_select_db("abc"); //选择数据库
$str="select * from chat ORDER BY chtime;" ; //查询字符串
$result=mysql_query($str, $link_ID); //送出查询
$rows=mysql_num_rows($result); //取得查询结果的记录笔数
//取得最后15笔发言,并显示
@mysql_data_seek($resut,$rows-15); //移动记录指针到前15笔记录
if ($rows<15) $l=$rows; else $l=15; //记录总数小于15,则最多为该记录数
for ($i=1;$i<=$l;$i++) {
list($chtime,$nick,$words)=mysql_fetch_row($result);
echo $chtime; echo " ";echo $nick; echo":" ; echo $words; echo "<BR>";
}
//清除库中过时的数据
@mysql_data_seek($result,$rows-20); //移动记录指针到前20笔记录
list($limtime)=mysql_fetch_row($result);
$str="DELETE FROM chat WHERE chtime<'$limtime' ;" ;
$result=mysql_query($str,$link_ID); //送出查询字符串,库中只留前20个记录
mysql_close($link_ID);
?>
</body>
</html>
2.4 送出发言到数据库speak.php
<html>
<head>
<title>发言</title>
</head>
<body>
<?
If ($words)
{ $link_ID=mysql_connect("main","root");
mysql_select_db("abc"); //数据库名为abc
$time=date(y).date(m).date(d).date(h).date(i).(date(s); //取得当前时间
$str="INSERT INTO chat(chtime,nick,words) values
('$time','$nick','$words');" ;
mysql_query($str,$link_ID); //送出发言到数据库
mysql_close($link_ID);
}
?>
//输入发言的表单
<form action="/blog_article/speak.html" method="post" target=" _self">
<input type="text" name="words" cols="20">
<input type="submit" value="发言">
</form>
</body>
</html>
完成以上工作后,一个简单的聊天室制作就完成了。当然,设计者可以根据个人爱好做一些个性化设计,如增加一个页框,显示当前聊天室人员名单、增加发言表情、取得发言者IP、进一步美化页面等等。
Apache Server是众多的WEB服务器软件中的一种,已经成为目前Internet上最流行的web服务器软件之一。比起其它web服务器软件(如PWS、IIS、UNIX),Apache有安装方便,配置简单,便于管理等优点。更重要的是它和PHP一样是完全免费的!所以受到了众多朋友的青睐,下面我就来讲讲如何安装及配置Apache和PHP,来吧,跟我STEP BY STEP!
第一步:下载Apache Server。Apache Server的最新版在Apache的官方网站(http://www.apache.org)可以找到,其实我们不需要去国外下载,国内有好几个网站,如http://phpuser.com、http://www.php.com.cn、http://www.phpchina.com都有,下载速度相当快!下载后一般文件名为apache_1_3_x_win32_r2.exe的自解压安装文件。其中1_3_x是apache的版本号,我们这里使用的是目前最新1.3.14版。
第二步:安装Apache Server。和一般的软件一样,安装过程非常简单,一路[next]下去,只是要将它的安装目录改为[C:\Apache](图1),安装完毕后在win98的[开始]-〉[程序]中就会多出[Apache Web Server]一个项目。这时候Apache Server安装成功,可以下一步了!!
图1
第三步:配置Apache Server。Apache Server的配置稍稍有一点麻烦,因为Apache Server最初是运行于UNIX上的,还带有许多UNIX的特性,如它的配置就需要专门的配置文件(后缀名为conf)来完成。Apache Server较早的版本有三个文件:httpd.conf、srm.conf和access.conf需要用户自己配置。现在我们用的版本就不需要对这三个文件都进行配置了,只要配置httpd.conf就行了!下面就是最关键的配置了。用WIN98自带的[记事本]打开C盘根目录下[Apache]目录下[CONF]中的httpd.conf文件(C:\Apache\conf\httpd.conf)。这个文件很长,但我们需要改动的地方不是很多,而且仔细看看这个文件的结构也不复杂,它是由说明语句和项目配置语句组成的。前面有“#”是对此句的注释,是说明语句,不起作用,其它的就是配置语句。在配置语句中,要进行如下改动:
1:找到ServerType(服务器类型),有两个为[standalone]和[inetd],[standalone]是用自己的进程来监听每一个连接,而[inetd]是在连接到达时启动Apache进程。一般都设为standalone,即此行改为:ServerType standalone
2:找到ServerRoot(服务器根目录),ServerRoot也就是Apache Server的安装目录,此行改为:
ServerRoot "C:\Apache"
3:找到port(服务器端口),一般默认情况下是80,如果你的pc上还装有其它的Web Server ,那必须将两者分开,如一个为80,一个为8080就可以了!!改为:port 80
4:找到ServerAdmin(服务器管理),这是应该填的是服务器管理员的E-mail。如果服务器产生错误,则会自动在错误页面上加上这个地址,你可以向他求救!在这里也可以不改动。
5:找到ServerName(服务器名),这个设置很重要,她也就是你的计算机的网络标识,一般为localhost。当然也可以自定,但一定要和你在win98的网络标识中写的一样(图2),这里改为:
ServerName localhost
图2
6:找到DocumentRoot(文档根目录),这里填的是默认的主目录地址,即在IE浏览器的地址栏中输入http://localhost/时IE就会自动到此目录下面去找index.html文件。改为:
DocumentRoot "C:/Apache/htdocs"(注意路径一定要加上引号)
7:找到DirectoryIndex(默认页面),这个默认页面就是在IE浏览器的地址栏中输入localhost时出现的画面。可以设多个文件后缀名,如.htm、.html、.php、.ph3。这里改为:
DirectoryIndex index.html index.htm index.php3 index.php(注意要用空格间隔),改完后在将C:\Apache\htdocs下的文件index.html.en改为index.html,让IE浏览器识别。
8:找到ScriptAlias(脚本别名),这里是指定CGI程序的目录,改为:
ScriptAlias /cgi-bin/ "C:/Apache/cgi-bin/"(注意路径一定要加上引号)
到此为止,Apache Server的配置基本上就完成了,可以检查一下配置的对不对。先运行Apache Server([开始]-)[程序]-)[Apache Web Server]-)[Start Apache])。运行成功后会弹出一个dos窗口(图3),如果弹出后马上就消失或者dos窗口内容不是图3,那么很有可能是你的第5条(ServerName)没设置对。运行成功后,在IE浏览器的地址栏中输入http://localhost/,如果没错应该出现图4画面。这就代表你已成功的配置了Apache服务器。
图3
图4
第四步:安装并配置PHP。PHP可以去http://www.php.com.cn下载得到最新版。我们这里使用的是4.04版,下载后文件为php-4.0.4-Win32.zip,大小为2.7MB。把它解压到C:\PHP4,安装就结束了。
第五步:配置PHP。把C:\PHP4目录下的文件php.ini-inst改名为php.ini并作如下改动:
1:找到DOC_ROOT=。它是服务器的根目录,改为:
DOC_ROOT=C:\Apache\htdocs
2:找到extension_dir=./改为:
extension_dir=C:\php4
存盘退出后再将C:\php4\目录下的文件php.ini复制到C:\windows目录下。
第六步:Apache Server和php都能工作了。还用最后一步,就是让它们同时工作。打开C:\apache\conf目录下的配置文件httpd.conf,并作如下改动:
1:找到[DocumentRoot "C:/Apache/htdocs"]下面第一次出现[<Directory >]......</Directory>]的地方,将其改为:
<Directory "c:/php4">
Options FollowSymLinks
AllowOverride None
</Directory>
2:在此文件的最后加入一下几句,这几句的意思是让Apache Server能够识别php应用程序。增加如下:
ScriptAlias /php3/ "c:/php4/" AddType application/x-httpd-php .php3 .php .phtml .php4
Action application/x-httpd-php "/php4/php.exe"
好了,到此为止,所有的配置工作都完成了!回头看看也不太难。不是吗?最后在检查一下是否成功了!
随便编一个php程序如下:
<?
print("在win9X/me下我成功的配置了Apache+php!!!");
?>
将这个程序命名为test.php并保存在C:\apache\htdocs目录下,然后打开IE,在地址栏中输入http://locahost/test,如出现图5画面则大功告成!!
图5