第31章 创建一个Web论坛

吸引网站用户的一个好方法是建立Web论坛。它可以用于哲学讨论组和产品技术支持等多种用途。在本章中,我们将使用PHP来实现Web论坛。当然,也可以选择已有的软件包,例如Phorum,来建立自己的论坛。

Web论坛有时候又叫做讨论公告牌或主题讨论组。论坛的想法就是允许论坛中的用户发表文章或提出问题,而其他人可以阅读并回复这些问题。在论坛中,每个讨论的主题叫做一个话题(thread)。

在这个项目中,我们要实现一个名为blah-blah的论坛,该论坛具有下面的功能。用户可以:

■通过发表文章开始新的讨论话题

■发表文章来回复已有的文章

■查看发表的文章

■查看论坛中的交谈话题

■查看文章之间的关系,也就是,查看哪篇文章是另外文章的回复

31.1 理解流程

建立论坛事实上是一个相当有趣的流程。我们需要一些方法来在数据库中存储文章的作者、标题、发表日期和内容信息。初看觉得这似乎与Book-O-Rama数据库没有多大不同。

然而,大多数主题讨论软件都以如下方式工作:给用户显示文章的同时,还显示出这些文章之间的关系。也就是说,可以看出哪些文章是回复另外一些文章的(以及它们是哪篇文章的回复),以及哪些文章是新讨论的话题。

我们可以看到在许多地方看到实现这些功能的论坛例子,包括Slashdot:http://slashdot.org。

需要仔细考虑的地方是确定如何显示这些文章之间的关系。对于目前这个系统来说,用户应该能够查看单个的消息,一个显示有相互关系的谈论话题,或者系统中所有话题。

用户还必须能发表新主题的文章或者进行回复。这只是简单的部分。

31.2 解决方案的组成

正如我们前面介绍的,保存及检索作者和消息文本是非常容易的。该应用程序最困难的部分是如何找到一种保存所需信息的数据库结构,以及一种高效率浏览该结构的方法。

如图31-1所示就是一个可能的正在讨论中的文章结构。

第31章 创建一个Web论坛 - 图1

图 31-1 主题讨论中的一个文章可能是一个新话题的第一篇文章,也可能是对其他文章的响应

在图31-1中,可以看到关于某主题的一个初始发表的文章,该文章具有3篇回复文章。这些回复文章中的某些又有回复文章。这些文章还可能回复等。

仔细查看图31-1,可以得到如下启示,我们应该如何保存并检索文章数据及文章间的连接。图中显示了一种树形结构。如果我们做过很多编程工作,会发现这是一种很常用的数据结构。在图31-1中,有节点(或说文章)和连接(或文章之间的关系),正如任何树形结构一样。(如果对树形数据结构不熟悉,不用担心——我们会在开始主题讨论之前介绍这些基本知识。)

掌握这些知识的诀窍是:

1)找到一种将这些树形结构映射到物理存储器的方法——在这个例子中,就是映射到MySQL数据库。

2)找到一种能够按要求重建数据的方法。

对于这个项目,我们将以实现一个能够保存使用当中的文章的MySQL数据库为开始。我们将创建一些简单的界面来实现文章的保存。

当载入待显示的文章列表时,我们会将每篇文章的标题放进一个tree_node的PHP类。每一个tree_node将包含一个文章标题以及对该文章的回复。

这些回复将保存在一个数组中,而每个回复本身又是一个tree_node,它可以包含由该文章的回复组成的一个数组,而这些回复本身同样又是tree_node,如此继续下去。直到遇到我们所说的叶子节点(leaf node),叶子节点本身不再包含回复。这样,我们就有了一个如图31-1所示的树形结构。

在这里,我们先介绍一些术语:要回复的消息称作当前节点的父节点。该消息的任何回复可以称作当前节点的子节点。如果把该树形结构想象成家庭树,就很容易记住这一点。

该树形结构的第一篇文章(没有父节点的那篇)有时候叫做根节点。

提示 将第一篇文章称作根节点可能不太直观,因为通常我们都将根节点画在图的顶部,不像实际的树根。

要建立并显示这个树形结构,我们将编写一些递归函数。(在第5章中,我们已经讨论过递归函数。)

我们决定使用一个类来表示这种数据结构,因为对于这个应用程序来说,这样更易于建立一种复杂的、动态可扩展的数据结构。它也意味着,我们可以使用简单而别致的代码来完成相当复杂的工作。