[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来操作数据库:

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

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

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

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

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

  mysql> CREATE DATABASE mybbs;

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

[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] 我的微型论坛的简单教程[已完成]

  建立用户表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=" 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"];

  */

  ?>

  运行结果如下图:

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

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

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

  代码如下:

  

  <?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>

  

  运行结果如下图:

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

  

  现在数据库中还没有数据,所以,我们运行首页,只显示“对不起,论坛尚在建设中……”。既然我们很希望看到结果,就往数据库中加几条数据吧!!当然,直接在MySQL客户端运行查询语句"insert into forums (field1,field2,...fieldN) values (value1,value2,...valueN)"是可行的,但是,作为WEB程序,这样做显然没啥意义。我们靠表单来插入数据。

  建立一个新文件:add_forum.php。首先说明的是,这个页面是管理员用来添加版块的,开始肯定要判断当前用户有没有管理权限。现在我们只为了首页显示数据而已,所以,可以先不加验证程序。我用DW做的添加论坛版块的表单如下图:

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

  其中排序指论坛排列顺序,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");    //执行完插入则跳转到首页

  ?>

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

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

  最终显示效果:

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

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

[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时应该这样:

  <?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时的每个页面,头部都要有这个函数出现。

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

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

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

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

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

  <?php

  session_start(); if(!isset($_SESSION["username"])||!isset($_SESSION["islogined"])){

  echo"<a href=\"login.php\">登陆</a>    <a href=\"register.php\">注册</a>";

  }else{

  echo $_SESSION["username"].",<a href=\"control.php\">我的资料</a>    <a href=\"loginout.php\">注销</a>";

  if($_SESSION["groupID"]=="2") echo "    <a href=\"admin_forums.php\">论坛管理</a>";

  }

  ?>

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

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

  <?php

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

  ?>

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

  <?php

  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分页我们可以使用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

  首先取得当前论坛:

  <?php

  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 "当前论坛为:<a href=\"index.php\">$gb_name</a>-->>$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和总条数来结算的。代码如下:

  <?php

  //接上面代码

  $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"];

  ?>

  <tr>

  <td><?php echo "<img src=\"$face\">" ?></td>

  <td><?php echo "<div class=\"bold\"><a class=\"forum\" href=\"thread.php?T=".$FID."&F=".$F."\">".$title."</a></div>" ?></td>

  <td><?php echo $author ?></td>

  <td><?php echo $no_of_reply." / ".$no_of_hit ?></td>

  <td><div class="lastupdate"><?php echo $lt." By ".$la ?></div></td>

  </tr>

  <?php

  }

  Show_pages($num,$F,$intpage,$list_rows);

  }else{

  echo"本版块没有帖子";

  }

  ?>

  显示结果如下:

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

  分页就是上面代码中体现出来的Show_pages($num,$F,$intpage,$list_rows)。效果就是从1到10,从11-20这样的分页。分页的思路就是这样:

  我们得到了所需要的数据:总记录,当前显示页码,每页显示的条数,总记录和每页显示的条数可以得到总页码。如果总页码小于等于10,那么直接输出 1到总页码就可以了。如果大于10,那就根据当前页码显示具体的分页,比如,总页码13页,当前第11页,那么将按照11-13的显示方式输出。同时还会有上一页,下一页等辅助翻页按钮。图示如下:

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

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

  代码如下:

  

  Function Show_pages($number,$F,$intpage,$list_rows){

  $pageno=ceil($number/$list_rows);

  echo "\n<table width=90% border=0 align=center cellpadding=0 cellspacing=0 class=mrg-top>";

  echo "  <tr>\n    <td align=right>\n  <table border=0 cellpadding=0 cellspacing=0>\n    <tr>";

  echo "<td id=pagetop>第".$intpage."页/共".$pageno."页</td>";

  if($pageno>1)

  echo "\n    <td><div class=pagefirst><a href=?intpage=1&F=".$F.$IsT."><<</a></div></td>";

  if($intpage>1)

  echo "\n    <td><div class=pagefirst><a href=?intpage=".($intpage-1)."&F=".$F.$IsT."><</a></div></td>";

  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    <td><div class=pagefirst><a href=?intpage=".$i."&F=".$F.">".$i."</a></div></td>";

  }elseif($e==0){

  for($i=$g;$i<=$intpage;$i++) echo "\n    <td><div class=pagefirst><a href=?intpage=".$i."&F=".$F.">".$i."</a></div></td>";

  }else{

  for($i=$c;$i<=$pageno;$i++) echo "\n    <td><div class=pagefirst><a href=?intpage=".$i."&F=".$F.">".$i."</a></div></td>";

  }

  }else{

  for($i=1;$i<=10;$i++)

  echo "\n    <td><div class=pagefirst><a href=?intpage=".$i."&F=".$F.">".$i."</a></div></td>";

  }

  }else{

  for($i=1;$i<=$pageno;$i++)

  echo "\n    <td><div class=pagefirst><a href=?intpage=".$i."&F=".$F.">".$i."</a></div></td>";

  }if($pageno>$intpage)

  echo "\n    <td><div class=pagefirst><a href=?intpage=".($intpage+1)."&F=".$F.">></a></div></td>";

  if($pageno>1)

  echo "\n    <td><div class=pagefirst><a href=?intpage=".$pageno."&F=".$F.">>></a></div></td>";

  echo "</td>\n  </tr>";

  echo "\n</table></td></tr></table>";

  }

  

  我上面的代码自己也认为比较烂,有经验的大鸟不要笑我……^@^,帖个好些的分页代码。

  分页这里主要利用的就是LIMIT,熟悉了它的用法,简单的分页程序就可以搞定了……

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

  <?php

  if(!isset($_SESSION["username"])){

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

  }

  ?>

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

  <?php

  $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"<a href=addnew.php?F=$F><img src=\"images/add.gif\" /></a>";

  }else{

  echo"<a href=addnew.php?F=$F><img src=\"images/add.gif\" /></a>";

  }

  ?>

  addnew.php?F=N 这里传递函数。表明添加新帖子要添加到论坛版块。

  添加页面如图所示:

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

  点击放大

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

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

  <?php

  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编号。

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

  <?php

  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"    <a href=\"editor.php?F=$F&T=$T&ID=$ID\" class=\"forum\">编辑</a>";

  }elseif($_SESSION["username"] && $_SESSION["islogined"]){

  if($_SESSION["username"]==$author) echo "    <a href=\"editor.php?F=$F&T=$T&ID=$ID\" class=\"forum\">编辑</a>";

  }

  ?>

[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] 我的微型论坛的简单教程[已完成]

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

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

  http://www.phpchina.com/bbs/viewthread.php?tid=13765&highlight=

  这里是按照我的理解来写的这个论坛的连接数据库类: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);

  类中其他方法的使用同上;

  */

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

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

  我的

  QQ:278502721;

  MSN:fengyuedao#hotmail.com或eastsin.com#hotmail.com;

  E-mail:numsix#163.com

  以上将#换成@

  希望得到您的指导。