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


本文整理自网络,侵删。

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

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

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

下面开始吧:

我的论坛的功能:

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

1、PHP环境搭建及MYSQL安装我不在说了,经典原来有详细说明的帖子。你还可以参照:
http://bbs.blueidea.com/viewthread.php?tid=1645815
或者
http://www.phpe.net/articles/363.shtml

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

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

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

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

mysql> CREATE DATABASE mybbs;

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



以下论坛建表同理:
建立论坛版块表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`)
    ->);

运行成功后图如下所示:

建立用户表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:连接标识,不写就默认是上次使用的连接,具体见下面。

完整的写法如下:


<?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中:<!--#include file="conn.asp"-->
php中:
<?php
require("conn.php");
%>
或者:
<?php
include("conn.php");
?>
如果你希望测试下刚才连接数据库是否成功,就输出mysql_error()来看:


<?php
mysql_connect("localhost","root","root");
mysql_select_db("mybbs");

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

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

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


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

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


<?php
$gb_name="东讯科技PHP微型论坛";        //微型论坛的名字,用在网页的title标签里
$gb_version="&nbsp;Version 1.0";    //版本号
$gb_copyright="Powered by <a href=\"http://www.eastsin.com\" target=\"_blank\">Eastsin-东讯科技 2006</a>";    //版权及连接

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

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

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

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

<!--#include file="conn.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()执行后的结果。所以,我这样写:


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

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


<?php
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"]."</br>";
    }
}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"];
*/
?>
运行结果如下图:

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

代码如下:

<?php
require("conn.php");

……

?>
<table width="90%" border="0" align="center" cellpadding="5" cellspacing="1">
  <tr>
    <td colspan="3">论坛列表</td>
  </tr>
  <tr>
    <td width="6%"><strong>状态</strong></td>
    <td width="70%"><strong>论坛</strong></td>
    <td width="24%"><strong>最后更新</strong></td>
  </tr>
<?php
$sql="select * from forums";
$result=mysql_query($sql);
$num=mysql_num_rows($result);
if($num>0){
    while($row=$db->db_fetch_array($result)){
?>
  <tr>
    <td></td>
    <td><?php echo "<div class=\"bold\"><a class=\"forum\" href=\"forums.php?F=".$row["ID"]."\">".$row["forum_name"]."</a></div>".$row["forum_description"] ?></td>
    <td><div><?php echo $row["last_post_time"]." By ".$row["last_post_author"]?></div></td>
  </tr>
<?php
    }
}else{
echo "<tr><td colspan=3>对不起,论坛尚在建设中……</td></tr>";
}
close_db();    //调用close_db()函数,关闭连接,释放系统资源
?>
</table>

运行结果如下图:




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

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

<form name="form" action="save_forum.php" method="post"><table width="400" border="0" align="center" cellpadding="5" cellspacing="1" class="mrg-top maintable">
  <tr id="title">
    <td colspan="2">论坛管理</td>
  </tr>
  <tr>
    <td width="23%"><strong>论坛名称</strong></td>
    <td width="77%"><input name="forum_name" type="text" class="input" id="forum_name" /></td>
  </tr>
  <tr>
    <td><strong>论坛简介</strong></td>
    <td><textarea name="forum_description" cols="30" rows="5"></textarea></td>
  </tr>
  <tr>
    <td><strong>论坛排序</strong></td>
    <td><input name="forum_order" type="text" class="input" id="forum_order" />
      <input name="isguest" type="checkbox" id="isguest" value="1" />
      完全开放</td>
  </tr>
  <tr>
    <td></td>
    <td><input name="Submit" type="submit" class="btn" value="添加" />
      <input name="Submit2" type="reset" class="btn" value="重置" /></td>
  </tr>
</table></form>

表单可以用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="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");    //执行完插入则跳转到首页
?>

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

最终显示效果:

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("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.;</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.;</script>";
}

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

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

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

<?php
$username="abc";
$_SESSION["username"]=$username;

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

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

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

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

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

<?php
session_start(); if(!isset($_SESSION["username"])||!isset($_SESSION["islogined"])){
echo"<a href=\"login.php\">登陆</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"register.php\">注册</a>";
}else{
echo $_SESSION["username"].",<a href=\"control.php\">我的资料</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"loginout.php\">注销</a>";
if($_SESSION["groupID"]=="2") echo "&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"admin_forums.php\">论坛管理</a>";
}
?>

阅读剩余部分

相关阅读 >>

php+apache实现网址伪静态

详解discuz! 7.0 数据调用功能图文教程

可兼容ie的获取及设置cookie的jquery.cookie函数方法

discuz-x系列教程 dx的css命名规则、缓存、加载机制

网站数据自动备份方法

修改destoon会员公司的伪静态中的com目录的方法

discuz!论坛个性签名代码全集大汇总

微信公众平台开发入门教程(sae方倍工作室)

Discuz论坛的ubb编辑器(增加灵活调用,支持asp)

destoon调用自定义模板及样式的公告栏

更多相关阅读请进入《Discuz论坛》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...