Home  >  Article  >  Backend Development  >  [php] 我的微型论坛的简单教程[已完成]_php实例

[php] 我的微型论坛的简单教程[已完成]_php实例

PHP中文网
PHP中文网Original
2016-05-17 09:39:161878browse

一直做ASP的我,最近开始学PHP了。第一个作品就是这个微型论坛(也可以叫做留言本),虽然没啥技术含量,但是想起04年刚来的经典论坛学ASP时,起步困难,所以想把我近来学PHP的一点心得写出来,希望给和我一样学习PHP的朋友一点参考,能让初学者走的弯子少一点,顺利点。也算我为论坛做的一点贡献吧。(其实说这是教程我心虚的很,主要我也是初学者,代码写的菜,希望有经验者能给予指点)。

最好手边能有一本PHP基础的书,我用的书一本是人民邮电的《精通PHP+MYSQL应用开发》(很多人都反映它不怎么样);另一本是北京理工大学出版社的《PHP基础教程》,书比较老了,但是介绍的PHP函数比较细致。我文字表达能力有限,希望看不明白的同学表骂我……

另:我利用下班时间写这篇东西,打算一边完善这个小论坛一边写。因为时间有限,作者水平更有限,所以我准备每天更新一点直到写完为止,要一下子全部写完我估计很有难度,希望大家见谅)

下面开始吧:

我的论坛的功能:

用户分三个级别:游客;注册用户;管理员
用户:用户注册;登陆;发帖;回复;编辑自己的帖子;
管理员:管理(包括添加、修改、删除)论坛版块;管理帖子(置顶、精华、移动、删除);
如果版块完全开放则游客也可以发帖子。

1、PHP环境搭建及MYSQL安装我不在说了,经典原来有详细说明的帖子。你还可以参照:
http://www.php.cn/
或者
http://www.php.cn/

这里来在你的电脑上搭建PHP运行环境。我的环境:WIN2000+APACHE 2.23+MYSQL 5.0

2、建立数据库。
PHPMYADMIN是个不错的管理MYSQL的东东,大家可以使用它来建立数据库。我用的是MYSQL-FRONT,也很好用。其实一个软件,顺手就好,用不着跟风。呵呵。或者你也可以使用MYSQL本身提供的MySQL Command Line Client来操作数据库:

[php] 我的微型论坛的简单教程[已完成]_php实例

[php] 我的微型论坛的简单教程[已完成]_php实例

输入登陆密码,登陆成功后显示如下:

[php] 我的微型论坛的简单教程[已完成]_php实例

建立mybbs数据库,代码如下:

mysql> CREATE DATABASE mybbs;

成功后显示Query OK, 1 row affected。

[php] 我的微型论坛的简单教程[已完成]_php实例



以下论坛建表同理:
建立论坛版块表forums,结构如下:

mysql>CREATE TABLE `forums` (
    ->`ID` int(11) NOT NULL auto_increment,
    ->`forum_name` varchar(50) NOT NULL default '',
    ->`forum_description` varchar(200) NOT NULL default '',
    ->`last_post_author` varchar(50) NOT NULL default '',
    ->`last_post_time` datetime NOT NULL default '0000-00-00 00:00:00',
    ->`forum_order` tinyint(3) NOT NULL default '0',
    ->`isguest` tinyint(3) NOT NULL default '0',
    ->PRIMARY KEY  (`ID`)
    ->);

运行成功后图如下所示:

[php] 我的微型论坛的简单教程[已完成]_php实例

建立用户表member,结构如下

mysql>CREATE TABLE `member` (
    ->`ID` int(11) NOT NULL auto_increment,
    ->`groupID` tinyint(3) NOT NULL default '0',
    ->`username` varchar(50) NOT NULL default '',
    ->`real_name` varchar(50) NOT NULL default '',
    ->`password` varchar(50) NOT NULL default '',
    ->`email` varchar(50) NOT NULL default '',
    ->`headimg` varchar(50) NOT NULL default '',
    ->`homepage` varchar(50) default NULL,
    ->`qq` varchar(10) default NULL,
    ->`MSN` varchar(50) default NULL,
    ->`jointime` datetime NOT NULL default '0000-00-00 00:00:00',
    ->`no_of_post` smallint(6) default NULL,
    ->`sign` varchar(200) default NULL,
    ->PRIMARY KEY  (`ID`)
    ->);

建立主题表tioic,如下:

mysql>CREATE TABLE `topic` (
    ->`ID` int(11) NOT NULL auto_increment,
    ->`title` varchar(100) NOT NULL default '',
    ->`author` varchar(50) NOT NULL default '',
    ->`last_post_author` varchar(50) default NULL,
    ->`last_post_time` datetime NOT NULL default '0000-00-00 00:00:00',
    ->`no_of_hit` smallint(6) NOT NULL default '0',
    ->`no_of_reply` mediumint(9) NOT NULL default '0',
    ->`locked` tinyint(3) NOT NULL default '0',
    ->`face` varchar(50) default NULL,
    ->`topic` tinyint(3) NOT NULL default '0',
    ->`good` tinyint(3) NOT NULL default '0',
    ->`forum_id` mediumint(9) NOT NULL default '0',
    ->PRIMARY KEY  (`ID`)
    ->);

建立帖子表thread,结构如下:

mysql>CREATE TABLE `thread` (
    ->`ID` int(11) NOT NULL auto_increment,
    ->`topicID` smallint(6) NOT NULL default '0',
    ->`face` varchar(50) default NULL,
    ->`title` varchar(100) default NULL,
    ->`author` varchar(50) NOT NULL default '',
    ->`post_time` datetime NOT NULL default '0000-00-00 00:00:00',
    ->`subject` mediumtext NOT NULL,
    ->PRIMARY KEY  (`ID`)
    ->);

3、连接数据库
(1)连接数据库:mysql_connect(string hostname,string username ,string password);
hostname:服务器名。本机"localhost";
username:登陆用户名。我这里是"root";
password:登陆密码。我这里也是"root";
(2)选择数据库:mysql_select_db(string database_name,int[link_identifier]);
database_name就是数据库名,这里就是刚刚建立的mybbs了。
link_identifier:连接标识,不写就默认是上次使用的连接,具体见下面。

完整的写法如下:


mysql_connect("localhost","root","root");//千万不要漏了分号,唉,我自己就经常漏掉……
mysql_select_db("mybbs");

/*或者你可以这样写:
$connect_db=mysql_connect("localhost","root","root");
mysql_select_db("mybbs",$connect_db);
*/
?>
就象ASP里的conn一样,把这个连接单独放到一个文件里,方便以后调用。不过ASP用的include,PHP中使用require()或者include()而已,如下:

ASP中:
php中:
require("conn.php");
%>
或者:
include("conn.php");
?>
如果你希望测试下刚才连接数据库是否成功,就输出mysql_error()来看:


mysql_connect("localhost","root","root");
mysql_select_db("mybbs");

echo mysql_error();
?>
连接正常的话不会输出输出任何错误的。

(3)关闭数据库连接,可以释放系统资源。
mysql_close();

我们把连接和关闭数据库的程序都写在一个文件conn.php中吧:


CODE:
mysql_connect("localhost","root","root");
mysql_select_db("mybbs");

Function close_db(){
mysql_close();
}
//注意:函数一种是带返回值的,一种没有值。
?>
既然require()可以调用外部文件,我们不妨将常用的数据写进变量里然后也单独放在一个文件里,这和ASP道理一样的。我命名了一个文件global.php,用来初始化这些数据。


$gb_name="东讯科技PHP微型论坛"; //微型论坛的名字,用在网页的title标签里
$gb_version=" Version 1.0"; //版本号
$gb_copyright="Powered by Eastsin-东讯科技 2006";    //版权及连接

//其他的常用的数据可以在做程序的过程中不断的加到这个文件中来。
?>
现在已经存在两个文件了,一个conn.php,一个global.php。前一个是记录和MYSQL连接的文件,后一个是记录常用数据的文件。

4、好了,上面数据库也建立了,PHP连接数据库我们也做好了。那么,我们该学习对MYSQL数据库进行操作了吧:
select 查询;
update 更新;
insert 插入;
delete 删除;
如果你有ASP或其他语言基础的话,我想理解应该很easy吧!

那么第一步,从首页开始:读取数据库中的信息。首页主要是循环显示forums中的所有论坛版块。对于有基础的人来说,查询语句很容易:

$sql="select * from forums";
?>
那么,如何来执行这个查询语句呢?PHP中用mysql_query()函数来执行SQL语句。这里要注意的是:mysql_query()函数来执行SQL语句时,如果执行的是一个SELECT语句,执行后返回一个INT型的标识,如果是非SELECT语句(INSERT,UPDATE等)返回的是boolean型的数据。所以有ASP基础的同学不要把这里认为成已经成功得到记录集。我们可以先来看看ASP:


<%
sql="select * from forums"
rs.open sql,conn,1,1
do while not rs.eof
response.write rs("***")
rs.movenext
loop
%>
如果得到了数据,直接rs("***")就可以得到想要的数据了。但是PHP中这里,执行完mysql_query()函数,并没有得到最终我们想要的数据。还需要使用其他函数来获取最终数据,我经常使用mysql_fetch_array()和mysql_fetch_row()来获取查询结果。这两个函数操作的对象都是刚才mysql_query()执行后的结果。所以,我这样写:


require("conn.php"); //先把conn.php引入,目的就是打开数据库连接

$sql="select * from forums";
$result=mysql_query($sql);
while($rs=mysql_fetch_array($result)){
echo "论坛:".$rs["forum_name"]."
";
}
?>
这样运行,页面没有任何输出,因为我们刚建立的数据库中没有任何数据!那么,我希望让论坛更加人性化,假如没有论坛版块应该输出“对不起,论坛尚在建设中……”的字样应该怎么办??mysql_num_rows()可以得到结果数目,mysql_result()也可以。
mysql_num_rows(int result)用来获取查询结果数目。参数result是mysql_query()等返回的结果标识;
mysql_result(int resule,int row)用来获取查询记录集,参数result是mysql_query()等返回的结果标识,row是要获取记录的行号;
代码如下:


require("conn.php");

$sql="select * from forums";
$result=mysql_query($sql);
$num=mysql_num_rows($result);
if($num>0){
    while($rs=mysql_fetch_array($result)){
        echo "论坛:".$rs["forum_name"]."
";
    }
}else{
    echo "对不起,论坛尚在建设中……";
}
/* 或者你可以这样写
$sql="select count(*) from forums";
$num=mysql_result(mysql_query($sql),0);
$sql="select * from forums";
$result=mysql_query($sql);

或者这样写
$sql="select count(*) as num from forums";
$result=mysql_query($sql);
$num=mysql_fetch_array["num"];
*/
?>
运行结果如下图:

[php] 我的微型论坛的简单教程[已完成]_php实例

HOHO~~~~~,能够读取数据了,那下面我们该美化一下我们的首页了吧,用DW吧^@^。下面是首页论坛列表的表格在DW中(我美工不匝地,望大家先不要扔砖头……):

[php] 我的微型论坛的简单教程[已完成]_php实例

代码如下:

require("conn.php");

……

?>


 
   
 
 
   
   
   
 
$sql="select * from forums";
$result=mysql_query($sql);
$num=mysql_num_rows($result);
if($num>0){
    while($row=$db->db_fetch_array($result)){
?>
 
   
   
   
 
    }
}else{
echo "";
}
close_db();    //调用close_db()函数,关闭连接,释放系统资源
?>
论坛列表
状态论坛最后更新
".$row["forum_name"]."

".$row["forum_description"] ?>

对不起,论坛尚在建设中……


运行结果如下图:

[php] 我的微型论坛的简单教程[已完成]_php实例



现在数据库中还没有数据,所以,我们运行首页,只显示“对不起,论坛尚在建设中……”。既然我们很希望看到结果,就往数据库中加几条数据吧!!当然,直接在MySQL客户端运行查询语句"insert into forums (field1,field2,...fieldN) values (value1,value2,...valueN)"是可行的,但是,作为WEB程序,这样做显然没啥意义。我们靠表单来插入数据。
建立一个新文件:add_forum.php。首先说明的是,这个页面是管理员用来添加版块的,开始肯定要判断当前用户有没有管理权限。现在我们只为了首页显示数据而已,所以,可以先不加验证程序。我用DW做的添加论坛版块的表单如下图:

[php] 我的微型论坛的简单教程[已完成]_php实例

其中排序指论坛排列顺序,SQL语句"order by forum_list asc";完全开放的话游客可以发表、回复帖子,否则只注册会员才可以发帖。
表单的HTML部分如下:


 
   
 
 
   
   
 
 
   
   
 
 
   
   
 
 
   
   
 
论坛管理
论坛名称
论坛简介
论坛排序
     
      完全开放

     

表单可以用JS或VBS进行验证,也可以提交到save_forum.php后进行必要的验证。我这里对字符串检验不多说了,只研究插入数据的部分。
首先接收表单的值,要区分POST和GET方式,分别使用$_POST["**"]和$_GET["**"]来接受数据。

$forum_name=$_POST["forum_name"];
$forum_description=$_POST["forum_description"];
$forum_order=$_POST["forum_order"];
$isguest=$_POST["isguest"];

//这里注意isguest是复选框,在MYSQL里用0和1来表示是否选中
$isguest=isset($isguest)?1:0; //选中的话就是1,不选中的话就是0;
?>

写入数据库数据的SQL语句大家都很熟悉了,用insert来实现:

require_once("conn.php");

//刚才接收值的程序

$sql="insert into forums (forum_name,forum_description,forum_order,isguest)values('$forum_name','$forum_description','$forum_order','$isguest')";
mysql_query($sql); //到这里,数据已经插入了数据库
header("location:index.php"); //执行完插入则跳转到首页
?>

看看我添加页面和显示页面吧:

[php] 我的微型论坛的简单教程[已完成]_php实例

最终显示效果:

[php] 我的微型论坛的简单教程[已完成]_php实例

OK,现在已经实现了基本的数据插入和读取了。嘿嘿……下一步,和上面道理一样,注册和登陆界面,同样是用DW做表单,HTML代码我不在赘述,抓个图吧!会员注册就填写四个条件可以了(现在都讲究用户体验,能少填就少填吧^@^必要的验证自己研究去)

[php] 我的微型论坛的简单教程[已完成]_php实例

会员登陆见图

[php] 我的微型论坛的简单教程[已完成]_php实例


先写处理注册信息的部分代码:

//reg.php
require_once "conn.php";$username=$_POST["username"];
$password=md5(trim($_POST["password"]));
$email=trim($_POST["email"]);$groupID=1; //默认用户等级:1为注册会员,2为管理员
$real_name="未知"; //默认真实姓名,登陆后自己修改吧
$no_of_post=0; //刚注册用户发贴量肯定为0
$headimg="head/0.gif"; //默认用户头像
$sign="Nothing..."; //默认用户的签名$num=mysql_result(mysql_query("select count(*) from member where username='$username'"),0); //检查用户名是否已经被注册
/*上面程序其实就是:
$sql="select count(*) from member where username='$username'";
$result=mysql_query($sql);
$num=mysql_result($result,0);
*/
if($num){ //当用户名已经被注册时
echo "<script>alert('该用户名已经被注册!');location.href='register.php';</script>";
}else{
    $sql="insert into member (groupID,username,password,real_name,jointime,no_of_post,headimg,
email,sign) values ('$groupID','$username','$password','$real_name',now(),'$no_of_post','$headimg','$email','$sign')";
    $db->db_query($sql);
    //注意插入当前时间,00:00:00 00:00:00格式时用now(),看起来和ASP一样哦……
    //这里要特别注意了,注册后会员就会自动登陆,如下:
    $_SESSION["username"]=$username;
    $_SESSION["groupID"]='1';
    $_SESSION["islogined"]="OK";    //我自己加的一个项目,可有可无

    echo "<script>alert('注册成功!');location.href='index.php';</script>";
}

这里出现了SESSION,用来标识用户是否登陆。在PHP中的SESSION是怎样用的呢?按照书上说的,注册SESSION时应该这样:

$username="abc";
session_register("username");
?>

实际上,我们可以这样来用(象ASP那样直接赋值给SESSION变量),使用SESSION时直接拿来用就可以了。

$username="abc";
$_SESSION["username"]=$username;

//下面查看SESSION是否已经生效
if(session_is_registered("username")
echo "SESSION变量已经生效";
//因为它是变量,同样也可以这样来判断
if(isset($_SESSION["username"]))
echo "SESSION变量已经生效";
?>

这里要说明的是,使用SESSION时,必须首先使用session_start()函数。所以,使用SESSION时的每个页面,头部都要有这个函数出现。

这个时候,注册用户已经登陆了,那么,在首页上应该体现出来吧,见下图:

[php] 我的微型论坛的简单教程[已完成]_php实例

比较一下没登陆前这个位置:

[php] 我的微型论坛的简单教程[已完成]_php实例

实现起来当然靠上面刚讲的SESSION啦。代码如下:

session_start(); if(!isset($_SESSION["username"])||!isset($_SESSION["islogined"])){
echo"登陆    注册";
}else{
echo $_SESSION["username"].",我的资料    注销";
if($_SESSION["groupID"]=="2") echo "    论坛管理";
}
?>

上面的代码应该很简单,相信大家一看就会懂。值的一提的是,我用SESSION["groupID"]来判断是否管理员,如果是,则出现”论坛管理“的连接。

退出的页面loginout.php,逻辑很简单,把所有SESSION释放掉就OK了,PHP中释放全部SESSION的方法是:

SESSION_DESTROY();//或者使用session_unregister()来注销SESSION
?>

然后登陆其实也很简单了(你明白了注册步骤,登陆就应该很容易了)。部分代码:

session_start();require_once("conn.php"); //先接收用户登陆表单传来的值,这里略去$sql="select * from member where username='$username'";
$result=mysql_query($sql);
$num=mysql_num_rows($result);    //得到记录的数量
if($num){  //如果用户存在,则检查密码是否正确
    $rs=mysql_fetch_array($result);
    if($rs["password"]!=md5($password)){
        echo"<script>alert('密码不正确,请返回检查!');location.href='login.php';</script>";
    }else{//用户名、密码都正确,注册SESSION变量,然后跳转到首页
        $_SESSION["username"]=$username;
        $_SESSION["groupID"]=$rs["groupID"];
        $_SESSION["islogined"]="OK";
        echo"<script>alert('登陆成功!');location.href='index.php';</script>";
    }
}else{//如果没有这个用户
    echo"<script>alert('没有这个用户,请返回检查!');location.href='login.php';</script>";
}
?>

今天实现了添加论坛版块,用户注册、登陆的功能了,也知道了SESSION的基本用法。

我们在第一章里已经讲了首页如何显示论坛版块,当然,在第二章节里我们论坛添加了排序功能,那么SQL语句当然也应该改成$sql="select * from forums order by forum_list",默认为ASC,顺序排列数据。
现在我们来讨论显示分论坛显示主题的情况。我命名为forums.php.
利用F作为参数,具体来显示某个论坛的帖子。

[php] 我的微型论坛的简单教程[已完成]_php实例

现在我们进入“测试版块”来显示本论坛下的所有主题。显示结果如图:

[php] 我的微型论坛的简单教程[已完成]_php实例

具体显示主题列表要解决的主要问提就PHP的分页。PHP分页我们可以使用LIMIT来实现。具体用法:"select clumn field1,...,filedN from table_name limit start_num,end_num";
limit作用是限定结果行数。这里可以提取指定的条数,也可以从查询结果中取出中间值。举个例子来说明:
$sql="select * from [topic] limit 5";
作用是取出topic表中顺序前5条数据;
$sql="select * from [topic] limit 9,10";
提取10条信息,从第9条开始提取。

我们forums.php首先接收F的值:$F=$_GET["F"];注意这里是GET
首先取得当前论坛:

require_once("conn.php");
require_once("global.php");$F=$_GET["F"];
$sql="select forum_name from forums where ID='$F'";
$result=mysql_query($sql);
$rs=mysql_fetch_array($result);
$forum_name=$rs["forum_name"];echo "当前论坛为:$gb_name-->>$forum_name";
?>

我们这里的分页当然使用"select clumn field1,...,filedN from table_name limit start_num,end_num";这种方式。
end_num当然就是我们global.php我们定义的论坛常用的变量$list_rows,而start_num如何计算呢?依靠的是当前页面intpage,每页显示条数$list_rows和总条数来结算的。代码如下:

//接上面代码
$result=mysql_query("select count(ID) from topic where forum_id='$F'");
$num=mysql_result($result,0); //获得总条数$intpage=$_GET["intpage"];
if($intpage) $intpage=1;
$start_num=($intpage-1)*$list_rows; //获取limit开始位置$sql="select ID,title,author,last_post_author as la,last_post_time as lt,no_of_hit,no_of_reply,locked,face,topic,good from topic where forum_id='$F' order by topic desc,last_post_time desc limit $start_num,$list_rows";
$result=mysql_query($sql);//这里当然就是表格的HTML代码啦,自己写吧if($num>0){
    while($rs=mysql_fetch_array($result)){
        $FID=$row["ID"];
        $author=$row["author"];
        $title=$row["title"];
        $no_of_reply=$row["no_of_reply"];
        $no_of_hit=$row["no_of_hit"];
        $lt=$row["lt"];
        $la=$row["la"];
        $topic=$row["topic"];
        $good=$row["good"];
        $locked=$row["locked"];
        $face=$row["face"];
?>
 
    " ?>
    ".$title."

" ?>
   
   
   


 
}
Show_pages($num,$F,$intpage,$list_rows);
}else{
echo"本版块没有帖子";
}
?>

显示结果如下:

[php] 我的微型论坛的简单教程[已完成]_php实例

分页就是上面代码中体现出来的Show_pages($num,$F,$intpage,$list_rows)。效果就是从1到10,从11-20这样的分页。分页的思路就是这样:
我们得到了所需要的数据:总记录,当前显示页码,每页显示的条数,总记录和每页显示的条数可以得到总页码。如果总页码小于等于10,那么直接输出 1到总页码就可以了。如果大于10,那就根据当前页码显示具体的分页,比如,总页码13页,当前第11页,那么将按照11-13的显示方式输出。同时还会有上一页,下一页等辅助翻页按钮。图示如下:

[php] 我的微型论坛的简单教程[已完成]_php实例

[php] 我的微型论坛的简单教程[已完成]_php实例

代码如下:

Function Show_pages($number,$F,$intpage,$list_rows){
$pageno=ceil($number/$list_rows);
echo "\n

";
echo "  \n   
\n  \n    ";
echo "";
if($pageno>1)
echo "\n    ";
if($intpage>1)
echo "\n    ";

if($pageno>10){
    $a=Floor($pageno/10);
    $b=Floor($intpage/10);
    $c=$b*10+1;
    $d=$b*10+10;
    $e=$intpage%10;
    $g=($b-1)*10+1;
    if($intpage>10){
        if($b<$a){
        for($i=$c;$i<=$d;$i++) echo "\n   

";
        }elseif($e==0){
        for($i=$g;$i<=$intpage;$i++) echo "\n    ";
        }else{
        for($i=$c;$i<=$pageno;$i++) echo "\n    ";
        }
    }else{
    for($i=1;$i<=10;$i++)
    echo "\n    ";
    }
}else{
    for($i=1;$i<=$pageno;$i++)
    echo "\n    ";
}if($pageno>$intpage)
echo "\n    ";
if($pageno>1)
echo "\n    ";
echo "\n  ";
echo "\n
第".$intpage."页/共".$pageno."页

<<

<

".$i."

".$i."

".$i."

".$i."

".$i."

>

>>

";
}


 


我上面的代码自己也认为比较烂,有经验的大鸟不要笑我……^@^,帖个好些的分页代码。
分页这里主要利用的就是LIMIT,熟悉了它的用法,简单的分页程序就可以搞定了……

因为论坛本身的设置是如果该论坛完全开放的话,游客可以发帖子。

if(!isset($_SESSION["username"])){
$_SESSION["username"]="Guest";
}
?>

那么该论坛的页面应该相应的有添加帖子的按钮:

$F=$_GET["F"];
$result=mysql_fetch_array(mysql_query("select isguest from forums where ID='$F'"));
$isguest=$result["isguest"]; //从数据库中提取该论坛版块是否完全开放,如果完全开放游客就可以发帖子了,否则只有注册用户才可以 if($isguest==0){
if($_SESSION["username"] && $_SESSION["islogined"]) echo"";
}else{
    echo"";
}
?>

addnew.php?F=N 这里传递函数。表明添加新帖子要添加到论坛版块。
添加页面如图所示:

[php] 我的微型论坛的简单教程[已完成]_php实例
点击放大

这里的表单里会有一个隐藏字段,记录论坛版面的ID号。

处理表单非常简单,就是INSERT来实现:

require_once "global.php";
require_once "conn.php"; $F=$_POST["F"];
$title=$_POST["title"];
$content=$_POST["Content"];
$author=$_POST["username"];
$face=$_POST["face"]; $result=mysql_fetch_array(mysql_query("select isguest from forums where ID='$F'"));
$isguest=$result["isguest"]; //下面肯定要再验证一下该论坛版块用户是否可以发帖
if($isguest==0){
    if(empty($_SESSION["username"])||empty($_SESSION["islogined"])){
    echo "<script>alert('您尚未登陆,请先登陆!');location='login.php';</script>";
    exit();
    }
} $sql="insert into topic (title,author,last_post_author,last_post_time,no_of_hit,no_of_reply,
locked,face,topic,good,forum_id) values ('$title','$author','$author',now(),0,0,0,'$face',0,0,'$F')";
mysql_query($sql); $topicID=mysql_insert_id();    //这里:mysql_insert_id()函数可以取出刚才插入操作成功后的ID值; //插入到主题表是第一步 $sql="insert into thread (topicID,face,title,author,post_time,subject) values ('$topicID','$face','$title','$author',now(),'$content')";
mysql_query($sql); //插入到帖子表是第二步 if($author!="Guest"){
$sql="update member set no_of_post = no_of_post + 1 where username='$author'";
mysql_query($sql); //如果不是游客的话就更新用户表。其实这里用户表中开始就应该存在一个管理员和一个游客的信息。游客发帖子默认的值为空,这样即使更新也更新不了。
}
?>

现在我们来看thread.php。这个页面和forums.php有很相似的地方,包括分页。只是这里提取了thread表中的所有数据。

[php] 我的微型论坛的简单教程[已完成]_php实例

如下:

$sql="select A.ID,A.title,A.author,A.post_time,A.subject,A.face,B.groupID,B.email,
B.headimg,B.homepage,B.qq,B.MSN,B.jointime,B.no_of_post,B.sign from thread A,member B where A.topicID=$T and A.author = B.username order by A.post_time asc limit $p_start,$tread_list_rows";
$result=mysql_query($sql);
//这里的SQL语句是查询2个表,MEMBER和THREAD表。 $sqlno="select * from thread where topicID='$T'";
$number=mysql_num_rows(mysql_query($sqlno)); while($row=mysql_fetch_array($result)){ //这里是HTML代码 }
?>

果当前用户有权限发表帖子,那么每页下面将出现快速回复的表单。

[php] 我的微型论坛的简单教程[已完成]_php实例
点击放大

if($isguest==0){
if($_SESSION["username"] && $_SESSION["islogined"]){
//这里是快速回复的HTML表单
}
}else{
//这里是快速回复的HTML表单
} //思路也很简单,如果完全开放,自然而然就出现回复表单,允许回复;否则如果用户登陆,就出现回复表单。
?>

回复表单里要有主题帖子的ID编号。

回复的代码同样是插入,然后更新相关表。

require_once "global.php";
require_once "conn.php"; $F=$_POST["F"];
$T=$_POST["T"];
$title=$_POST["title"];
$content=$_POST["Content"];
$author=$_POST["username"];
$face=$_POST["face"];$result=mysql_fetch_array($db->db_query("select isguest from forums where ID='$F'"));
$isguest=$result["isguest"];

if($isguest==0){
    if(empty($_SESSION["username"])||empty($_SESSION["islogined"])){
    echo "<script>alert('您尚未登陆,请先登陆!');location='login.php';</script>";
    exit();
    }
}

$sql="insert into thread (topicID,face,title,author,post_time,subject) values ('$T','$face','$title','$author',now(),'$content')";
$db->mysql_query($sql);
//插入表,同时记录TOPIC的主键 $sql="update topic set last_post_author ='$author',last_post_time=now(),no_of_reply = no_of_reply + 1 where ID = '$T'";
$db->mysql_query($sql);
//更新主题表,最后回复人,最后更新时间 $sql="update forums set last_post_author='$author',last_post_time=now() where ID='$F'";
$db->mysql_query($sql);
//更新论坛版块的信息,最后回复,最后更新时间 if($author!="Guest"){
$sql="update member set no_of_post = no_of_post + 1 where username='$author'";
mysql_query($sql);
//更新发帖人的发帖数量
}
?>

编辑帖子,同样要求权限。必须登陆;用户必须是帖子的作者;管理员可以管理所有的帖子

[php] 我的微型论坛的简单教程[已完成]_php实例

if($_SESSION["groupID"]=="2"){
echo" 编辑";
    }elseif($_SESSION["username"] && $_SESSION["islogined"]){
    if($_SESSION["username"]==$author) echo "    编辑";
}
?>

[php] 我的微型论坛的简单教程[已完成]_php实例
点击放大

require_once "global.php";
require_once "conn.php"; $F=$_GET["F"];
$T=$_GET["T"];
$ID=$_GET["ID"];
if(empty($F)||empty($T)||empty($ID)) echo "<script>history.back;</script>"; $sql="select A.author,A.title,A.face,A.subject,B.title as topictitle from thread A,topic B where A.ID='$ID' and A.topicID=B.ID";
$rs=mysql_fetch_array($db->db_query($sql));
$rename=$rs["author"];
$title=$rs["title"];
$face=$rs["face"];
$topictitle=$rs["topictitle"];
$resubject=$rs["subject"]; if($_SESSION["groupID"]!="2"){
if(($_SESSION["username"]!=$rename)||empty($_SESSION["islogined"])) echo "<script>history.go(-1);</script>";
} $sresult=mysql_fetch_array(mysql_query("select forum_name,isguest from forums where ID='$F'"));
$forum_name=$sresult["forum_name"]; //这里检查当前用户是否有编辑帖子的权限,并且按照ID号提取出该帖子的所有内容
?>

处理编辑的帖子就是更新原先数据。这里不做多说了。

//////////////////////////////////////////////////
下面到了个人资料管理。control.php,管理“我的资料”

[php] 我的微型论坛的简单教程[已完成]_php实例

[php] 我的微型论坛的简单教程[已完成]_php实例

这里比较简单,也不再写了。

正如5do8所说的,最好要把常用的程序(如连接数据库)写成类,容易管理,而且速度和性能上也有提高。我是个菜鸟,对于类不甚了解,想了解这个东西的朋友请参照这里:
http://www.php.cn/

这里是按照我的理解来写的这个论坛的连接数据库类:dbclass.php

class Eastsin {
    function db_connect($db_host_ip,$db_login_name,$db_login_password){
    mysql_connect($db_host_ip,$db_login_name,$db_login_password);
    }
    function db_select($db_name){
    mysql_select_db($db_name);
    }
    function db_query($sql){
    return mysql_query($sql);
    }
    function db_fetch_array($result){
    return mysql_fetch_array($result);
    }
    function db_result($query,$row){
    return mysql_result($query,$row);
    }
    function db_rows($query){
    return mysql_num_rows($query);
    }
    function db_ID(){
    return mysql_insert_id();
    }
    function db_close(){
    mysql_close();
    }
}

在使用的时候:

$db=new Eastsin;  //初始化一个类,并把这个对象赋给变量$db
$db->db_selsct($dbname);    //访问类的方法,类中定义的函数即为类的方法。 $sql="....";
$db->db_query($sql);
/*
上面两句等同于:
$sql="....";
mysql_query($sql);
类中其他方法的使用同上;
*/

我的论坛还在完善中,还有关于安全性、容错处理等我也再学习中。一个小论坛从思路上讲还是比较简单的,但是真正做起来还是要费些力气和脑筋的。 (源文件请大家允许我稍后发布)

这样,这个小教程算是简单的完成了。作者水平有限,也没有写过教程的经验,所以里面的不足之出大家多包涵指点。在此谢谢大家!!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn