怎样用PHP写一个简单的论坛详解.docx
《怎样用PHP写一个简单的论坛详解.docx》由会员分享,可在线阅读,更多相关《怎样用PHP写一个简单的论坛详解.docx(20页珍藏版)》请在冰点文库上搜索。
![怎样用PHP写一个简单的论坛详解.docx](https://file1.bingdoc.com/fileroot1/2023-8/4/ff7b9875-62bc-4e2a-b6fe-9ffd49c320a6/ff7b9875-62bc-4e2a-b6fe-9ffd49c320a61.gif)
怎样用PHP写一个简单的论坛详解
怎样用PHP写一个简单的论坛详解
论坛的功能:
用户分三个级别:
游客;注册用户;管理员
用户:
用户注册;登陆;发帖;回复;编辑自己的帖子;
管理员:
管理(包括添加、修改、删除)论坛版块;管理帖子(置顶、精华、移动、删除);
如果版块完全开放则游客也可以发帖子。
1、PHP环境搭建及MYSQL安装我不在说了,经典原来有详细说明的帖子。
你还可以参照:
或者
这里来在你的电脑上搭建PHP运行环境。
我的环境:
WIN2000+APACHE2.23+MYSQL5.0
2、建立数据库。
PHPMYADMIN是个不错的管理MYSQL的东东,大家可以使用它来建立数据库。
我用的是MYSQL-FRONT,也很好用。
其实一个软件,顺手就好,用不着跟风。
呵呵。
或者你也可以使用MYSQL本身提供的MySQLCommandLineClient来操作数据库:
输入登陆密码,登陆成功后显示如下
建立mybbs数据库,代码如下:
mysql>CREATEDATABASEmybbs;
成功后显示QueryOK,1rowaffected。
以下论坛建表同理:
建立论坛版块表forums,结构如下:
mysql>CREATETABLE`forums`(
->`ID`int(11)NOTNULLauto_increment,
->`forum_name`varchar(50)NOTNULLdefault'',
->`forum_description`varchar(200)NOTNULLdefault'',
->`last_post_author`varchar(50)NOTNULLdefault'',
->`last_post_time`datetimeNOTNULLdefault'0000-00-0000:
00:
00',
->`forum_order`tinyint(3)NOTNULLdefault'0',
->`isguest`tinyint(3)NOTNULLdefault'0',
->PRIMARYKEY(`ID`)
->);
运行成功后图如下所示:
建立用户表member,结构如下
mysql>CREATETABLE`member`(
->`ID`int(11)NOTNULLauto_increment,
->`groupID`tinyint(3)NOTNULLdefault'0',
->`username`varchar(50)NOTNULLdefault'',
->`real_name`varchar(50)NOTNULLdefault'',
->`password`varchar(50)NOTNULLdefault'',
->`email`varchar(50)NOTNULLdefault'',
->`headimg`varchar(50)NOTNULLdefault'',
->`homepage`varchar(50)defaultNULL,
->`qq`varchar(10)defaultNULL,
->`MSN`varchar(50)defaultNULL,
->`jointime`datetimeNOTNULLdefault'0000-00-0000:
00:
00',
->`no_of_post`smallint(6)defaultNULL,
->`sign`varchar(200)defaultNULL,
->PRIMARYKEY(`ID`)
->);
建立主题表tioic,如下:
mysql>CREATETABLE`topic`(
->`ID`int(11)NOTNULLauto_increment,
->`title`varchar(100)NOTNULLdefault'',
->`author`varchar(50)NOTNULLdefault'',
->`last_post_author`varchar(50)defaultNULL,
->`last_post_time`datetimeNOTNULLdefault'0000-00-0000:
00:
00',
->`no_of_hit`smallint(6)NOTNULLdefault'0',
->`no_of_reply`mediumint(9)NOTNULLdefault'0',
->`locked`tinyint(3)NOTNULLdefault'0',
->`face`varchar(50)defaultNULL,
->`topic`tinyint(3)NOTNULLdefault'0',
->`good`tinyint(3)NOTNULLdefault'0',
->`forum_id`mediumint(9)NOTNULLdefault'0',
->PRIMARYKEY(`ID`)
->);
建立帖子表thread,结构如下:
mysql>CREATETABLE`thread`(
->`ID`int(11)NOTNULLauto_increment,
->`topicID`smallint(6)NOTNULLdefault'0',
->`face`varchar(50)defaultNULL,
->`title`varchar(100)defaultNULL,
->`author`varchar(50)NOTNULLdefault'',
->`post_time`datetimeNOTNULLdefault'0000-00-0000:
00:
00',
->`subject`mediumtextNOTNULL,
->PRIMARYKEY(`ID`)
->);
3、连接数据库
(1)连接数据库:
mysql_connect(stringhostname,stringusername,stringpassword);
hostname:
服务器名。
本机"localhost";
username:
登陆用户名。
我这里是"root";
password:
登陆密码。
我这里也是"root";
(2)选择数据库:
mysql_select_db(stringdatabase_name,int[link_identifier]);
database_name就是数据库名,这里就是刚刚建立的mybbs了。
link_identifier:
连接标识,不写就默认是上次使用的连接,具体见下面。
完整的写法如下:
php
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中:
--#includefile="conn.asp"-->
php中:
php
require("conn.php");
%>
或者:
php
include("conn.php");
?
>
如果你希望测试下刚才连接数据库是否成功,就输出mysql_error()来看:
php
mysql_connect("localhost","root","root");
mysql_select_db("mybbs");
echomysql_error();
?
>
连接正常的话不会输出输出任何错误的。
(3)关闭数据库连接,可以释放系统资源。
mysql_close();
我们把连接和关闭数据库的程序都写在一个文件conn.php中吧:
CODE:
php
mysql_connect("localhost","root","root");
mysql_select_db("mybbs");
Functionclose_db(){
mysql_close();
}
//注意:
函数一种是带返回值的,一种没有值。
?
>
既然require()可以调用外部文件,我们不妨将常用的数据写进变量里然后也单独放在一个文件里,这和ASP道理一样的。
我命名了一个文件global.php,用来初始化这些数据。
php
$gb_name="东讯科技PHP微型论坛";//微型论坛的名字,用在网页的title标签里
$gb_version="Version1.0";//版本号
$gb_copyright="PoweredbyEastsin-东讯科技2006";//版权及连接
//其他的常用的数据可以在做程序的过程中不断的加到这个文件中来。
?
>
现在已经存在两个文件了,一个conn.php,一个global.php。
前一个是记录和MYSQL连接的文件,后一个是记录常用数据的文件。
4、好了,上面数据库也建立了,PHP连接数据库我们也做好了。
那么,我们该学习对MYSQL数据库进行操作了吧:
select查询;
update更新;
insert插入;
delete删除;
如果你有ASP或其他语言基础的话,我想理解应该很easy吧!
那么第一步,从首页开始:
读取数据库中的信息。
首页主要是循环显示forums中的所有论坛版块。
对于有基础的人来说,查询语句很容易:
php
$sql="select*fromforums";
?
>
那么,如何来执行这个查询语句呢?
PHP中用mysql_query()函数来执行SQL语句。
这里要注意的是:
mysql_query()函数来执行SQL语句时,如果执行的是一个SELECT语句,执行后返回一个INT型的标识,如果是非SELECT语句(INSERT,UPDATE等)返回的是boolean型的数据。
所以有ASP基础的同学不要把这里认为成已经成功得到记录集。
我们可以先来看看ASP:
--#includefile="conn.asp"-->
<%
sql="select*fromforums"
rs.opensql,conn,1,1
dowhilenotrs.eof
response.writers("***")
rs.movenext
loop
%>
如果得到了数据,直接rs("***")就可以得到想要的数据了。
但是PHP中这里,执行完mysql_query()函数,并没有得到最终我们想要的数据。
还需要使用其他函数来获取最终数据,我经常使用mysql_fetch_array()和mysql_fetch_row()来获取查询结果。
这两个函数操作的对象都是刚才mysql_query()执行后的结果。
所以,我这样写:
php
require("conn.php");//先把conn.php引入,目的就是打开数据库连接
$sql="select*fromforums";
$result=mysql_query($sql);
while($rs=mysql_fetch_array($result)){
echo"论坛:
".$rs["forum_name"]."";
}
?
>
这样运行,页面没有任何输出,因为我们刚建立的数据库中没有任何数据!
那么,我希望让论坛更加人性化,假如没有论坛版块应该输出“对不起,论坛尚在建设中……”的字样应该怎么办?
?
mysql_num_rows()可以得到结果数目,mysql_result()也可以。
mysql_num_rows(intresult)用来获取查询结果数目。
参数result是mysql_query()等返回的结果标识;
mysql_result(intresule,introw)用来获取查询记录集,参数result是mysql_query()等返回的结果标识,row是要获取记录的行号;
代码如下:
php
require("conn.php");
$sql="select*fromforums";
$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="selectcount(*)fromforums";
$num=mysql_result(mysql_query($sql),0);
$sql="select*fromforums";
$result=mysql_query($sql);
或者这样写
$sql="selectcount(*)asnumfromforums";
$result=mysql_query($sql);
$num=mysql_fetch_array["num"];
*/
?
>
运行结果如下图:
HOHO~~~~~,能够读取数据了,那下面我们该美化一下我们的首页了吧,用DW吧^@^。
下面是首页论坛列表的表格在DW中(我美工不匝地,望大家先不要扔砖头……):
代码如下:
php
require("conn.php");
……
?
>
论坛列表
|
状态
论坛
最后更新
|
php
$sql="select*fromforums";
$result=mysql_query($sql);
$num=mysql_num_rows($result);
if($num>0){
while($row=$db->db_fetch_array($result)){
?
>
| phpecho"F=".$row["ID"]."\">".$row["forum_name"]."".$row["forum_description"]? > | phpecho$row["last_post_time"]."By".$row["last_post_author"]? > |
php
}
}else{
echo"
对不起,论坛尚在建设中……
";
}
close_db();//调用close_db()函数,关闭连接,释放系统资源
?
>
运行结果如下图:
现在数据库中还没有数据,所以,我们运行首页,只显示“对不起,论坛尚在建设中……”。
既然我们很希望看到结果,就往数据库中加几条数据吧!
!
当然,直接在MySQL客户端运行查询语句"insertintoforums(field1,field2,...fieldN)values(value1,value2,...valueN)"是可行的,但是,作为WEB程序,这样做显然没啥意义。
我们靠表单来插入数据。
建立一个新文件:
add_forum.php。
首先说明的是,这个页面是管理员用来添加版块的,开始肯定要判断当前用户有没有管理权限。
现在我们只为了首页显示数据而已,所以,可以先不加验证程序。
我用DW做的添加论坛版块的表单如下图:
其中排序指论坛排列顺序,SQL语句"orderbyforum_listasc";完全开放的话游客可以发表、回复帖子,否则只注册会员才可以发帖。
表单的HTML部分如下:
论坛管理
论坛名称
|
论坛简介 | |
论坛排序 |
完全开放 |
|
|
表单可以用JS或VBS进行验证,也可以提交到save_forum.php后进行必要的验证。
我这里对字符串检验不多说了,只研究插入数据的部分。
首先接收表单的值,要区分POST和GET方式,分别使用$_POST["**"]和$_GET["**"]来接受数据。
php
$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来实现:
php
require_once("conn.php");
//刚才接收值的程序
$sql="insertintoforums(forum_name,forum_description,forum_order,isguest)values('$forum_name','$forum_description','$forum_order','$isguest')";
mysql_query($sql);//到这里,数据已经插入了数据库
header("location:
index.php");//执行完插入则跳转到首页
?
>
看看我添加页面和显示页面吧:
最终显示效果:
OK,现在已经实现了基本的数据插入和读取了。
嘿嘿……下一步,和上面道理一样,注册和登陆界面,同样是用DW做表单,HTML代码我不在赘述,抓个图吧!
会员注册就填写四个条件可以了(现在都讲究用户体验,能少填就少填吧^@^必要的验证自己研究去)
会员登陆见图
先写处理注册信息的部分代码:
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("selectcount(*)frommemberwhereusername='$username'"),0);//检查用户名是否已经被注册
/*上面程序其实就是:
$sql="selectcount(*)frommemberwhereusername='$username'";
$result=mysql_query($sql);
$num=mysql_result($result,0);
*/
if($num){//当用户名已经被注册时
echo"";
}else{
$sql="insertintom