![PHP项目开发全程实录(第4版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/587/24172587/b_24172587.jpg)
2.11 社区论坛模块设计
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P103_15034.jpg?sign=1739059506-GBQPIAaIy9RULZOs0DcRwhcta6RO04OC-0-170c191ce066e968d212222f98e6941a)
视频讲解
社区论坛模块为网站的浏览者提供一个交流的平台,以此来扩大网站的影响力,汇聚更多的人气,宣传企业形象,推广企业产品。
2.11.1 社区论坛模块概述
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P103_40983.jpg?sign=1739059506-ft1gu1TL55Le0Mx77j6xUXp7VqPvTqAp-0-c0be9565834f247329b779ec95d06b19)
图2.33 社区论坛流程图
社区论坛模块为浏览者、会员、客户和企业之间提供一个大的交流平台,根据身份的不同,分别给予不同的操作权限。社区论坛模块的操作流程如图2.33所示。
在本论坛中,浏览者只能够查看帖子;注册会员既可以查看帖子,也可以发布和回复帖子;管理员则具有发布、回复、查看和删除的权限。
2.11.2 社区论坛模块技术分析
在社区论坛模块的实现过程中,通过JavaScript脚本和下拉列表框的结合实现一个不同版块之间快速跳转的功能,从而能够更加灵活、方便地实现不同版块之间的跳转。
下面分析该技术是如何实现的。该技术的实现综合3个方面的内容,以一个下拉列表框为主,通过PHP语句从数据库中读取数据作为下拉列表框的值,应用onchange事件来调用JavaScript脚本,实现不同版块之间的跳转。这里以bbs_top.php文件中的快速跳转功能为例进行分析。关键代码如下:
例程14 代码位置:资源包\TM\02\bcty365\bbs_top.php
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P103_40984.jpg?sign=1739059506-W8tOWWD2CIEywQ0ZybCyTUBBeRDYEqzR-0-3b3c0a1e12aafe3300f24b5a88aa07fa)
代码贴士
❶onChange:某元素失去焦点,并且从用户最后一次访问以来,其值已经改变。location:用于访问窗口的当前定位(URL),既可被读取,又可被置换,可以通过其实现某个页面的定位或者更新。
❷<option value='… '>…</option>:下拉列表框中输出的值,以及显示的内容。
该技术实现的运行结果如图2.34所示,它将实现从JSP版块跳转到PHP版块。
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P104_15062.jpg?sign=1739059506-CY7JX9fLlcRcsecjY1zTfgRNcMyUoBdu-0-3139d1a89b74b97737ce10775867c6fd)
图2.34 版块跳转功能的运行结果
2.11.3 论坛分类的实现过程
论坛分类使用的数据表:tb_bbs、tb_type_big、tb_type_small
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P104_15081.jpg?sign=1739059506-aWfXuVILn4MDqnLvpia1aOLC5s2KL3IM-0-2c840b26e1fff08cbf97f34cfcbb61d3)
图2.35 论坛分类的运行结果
论坛分类可以分为两类:一是论坛中大的版块分区,分为综合信息讨论区、操作系统、程序设计交流区和数据库技术4个版块,其数据存储于tb_type_big数据表中。二是对应不同的版块中不同语言和技术的分类,分为6种,其数据存储于tb_type_small表中。论坛分类的运行结果如图2.35所示。
论坛分类的实现原理很简单,首先从tb_type_big表中读取6个版块中的数据,进行循环输出,然后在版块中嵌套循环,用于输出不用语言的分类数据。该功能主要通过bbs_index.php文件来完成,bbs_index.php文件的程序代码如下:
例程15 代码位置:资源包\TM\02\bcty365\bbs_index.php
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P104_40988.jpg?sign=1739059506-5NGU5jYHHECkhckz9Kbi2v3fCecgjC3f-0-eb3e6611bbfe4e1b832b76e821dd4eec)
代码贴士
❶do…while循环语句,对论坛中大的版块分类进行循环输出。
❷do…while循环语句,对论坛中一个版块的不同语言和技术进行循环输出。
注意
在应用do…while循环语句时,while后的分号不能省略。
2.11.4 论坛帖子浏览的实现过程
论坛帖子浏览使用的数据表:tb_bbs、tb_user、tb_reply
论坛帖子浏览主要输出指定帖子的详细信息,包括发帖人、用户级别和注册的时间,以及帖子的主题、内容和发帖时间,包括上传的图片。本模块是用户权限使用体现的最明显地方,可以分为3种情况:第一以浏览者进行登录,只能是浏览帖子的内容,没有其他权限;第二以会员进行登录,可以对帖子进行回复,发表自己的看法;第三以管理的身份进行登录,不但可以回复帖子,而且可以对任何人发布和回复的帖子进行删除和顶帖的操作。下面就来看一下以管理员身份进行登录时都具备哪些权限,运行结果如图2.36所示。
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P106_15129.jpg?sign=1739059506-5dbKmf30jr2UXqqAB8bOp236sbwNbTXv-0-16995d7aefa91dbb195e7ed16cdafc47)
图2.36 管理员浏览帖子的结果图
论坛帖子浏览的功能通过bbs_lookbbs.php文件完成,首先根据传递的ID值读取指定的帖子数据,然后判断登录用户的类型,最后根据用户不同的类型执行不同的操作。代码如下:
例程16 代码位置:资源包\TM\02\bcty365\bbs_lookbbs.php
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P106_40992.jpg?sign=1739059506-gFm7HayZ7fKOdzKPFItjxlYXt2FylKV2-0-0a17bfa4dccf58a3542888f7d0280ebf)
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P107_40993.jpg?sign=1739059506-FWJCYMLgewl8raBLmF2dnrKUbQxbok2d-0-8ed350ab064b90733c837568f0d0f1a5)
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P108_40994.jpg?sign=1739059506-8ZYA89l4d83G5cyLZGmi10WEJjLBYjKp-0-d81f2e65da21e211079205b3ac23619e)
代码贴士
❶$info4["usertype"]:判断用户的类型,如果值为1是管理员,否则为普通会员。
❷$infob[photo]:判断发布的帖子中是否含有图片,如果有则输出,没有则不输出。
❸stripslashes():将应用addcslashes()函数处理后的字符串返回原样。
❹判断登录用户是否具有顶帖的权限。
❺判断登录用户是否具有删除帖子的权限。
说明
上面给出的是该文件的部分代码,主要讲解了该功能的实现方法,完整的代码可以参考本书资源包中的TM\02\bcty365\bbs_lookbbs.php文件。
2.11.5 论坛帖子发布的实现过程
论坛帖子发布使用的数据表:tb_bbs、tb_user
论坛帖子发布通过两个文件来完成:一个是帖子发布信息的提交页bbs_pubbs.php;另一个是对提交的数据进行处理的retrieve.php文件。该功能实现的运行结果如图2.37所示。
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P108_15181.jpg?sign=1739059506-dh8EXrAsR6uxrMBZuzDYxgnDW9jCyHGn-0-0b86d9927d2f825c17ac2e9e3106b8b8)
图2.37 帖子发布模块的运行结果
在发布信息的提交页中,显示当前用户的个人信息,设置添加数据表单元素,其中表单元素的设计如表2.9所示。
表2.9 发布信息页中使用的表单元素
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-T109_15283.jpg?sign=1739059506-EF6sHxFeVaenBLEmMx06T4TkaP0MuohY-0-d2f07f0572004460e38c535259acf8ec)
在retrieve.php页中对表单提交的数据进行处理,将数据存储到tb_bbs表中,并且更新用户信息表tb_user中pubtimes字段的值,其中还应用了图片上传技术,将图片上传到服务器中指定的文件夹下。retrieve.php文件的代码如下:
例程17 代码位置:资源包\TM\02\bcty365\retrieve.php
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P109_40997.jpg?sign=1739059506-yTzrlYdplF4j5WzBjg6OLLDDl7w8rQAw-0-9a4e8d63af2df53e3cb2b73018bef556)
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P110_40998.jpg?sign=1739059506-Bn9Wb3dvI9KDb6SWNk77kr0bZI0adhh5-0-39a229ace6c0990e130ed31c45a561a9)
代码贴士
❶$_FILES['bbs_photo']["name"]:$_FILES[]全局变量,获取表单提交文件的原始名称。
❷strtolower():将指定的字符转换为小写字母。
stristr():获取指定字符串(A)在另一个字符串(B)中首次出现的位置到(B)字符串末尾的所有字符串。该函数如果执行成功则返回剩余的字符串,否则将返回false。
❸mt_rand():生成一个随机数,用于上传文件的名称。
❹move_uploaded_file():将指定的文件上传到指定的文件夹下。
2.11.6 论坛帖子回复的实现过程
论坛帖子回复使用的数据表:tb_bbs、tb_user、tb_reply
回复论坛中的帖子,必须是以会员或者管理员的身份进行登录,否则不能进行帖子的回复操作,其运行结果如图2.38所示。
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P111_15320.jpg?sign=1739059506-y5QFuwqAxNWyQX5AhuWywfh7aKOxXheH-0-e415d1008ac0d388b19e69161cb81469)
图2.38 论坛帖子回复的运行结果
论坛帖子回复功能的实现主要通过bbs_lookbbs.php和savereply.php两个文件。其中应用JavaScript脚本对回复帖子的文本框进行输出和隐藏的控制。在bbs_lookbbs.php文件中,帖子回复使用的表单元素如表2.10所示。
表2.10 论坛帖子回复中的重要表单元素
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-T111_15398.jpg?sign=1739059506-zLmbkmczMApISVfNYk5iBl4KzoCFnwQ6-0-a4c903c38fdd96412a16fadad1b14c63)
在帖子回复表单bbs_lookbbs.php页中,首先判断登录用户是否具有回复的权限,然后根据提交的值展开回复表单的文本框,在文本框中输入回复的主题和内容,最后将数据提交到表单处理页savereply.php中。bbs_lookbbs.php的主要代码如下:
例程18 代码位置:资源包\TM\02\bcty365\bbs_lookbbs.php
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P112_41001.jpg?sign=1739059506-DW02A690xlC80jiW9D8GSdPEDyGTR4Lx-0-3fe10c98aaed73fb9297ad6ca37232e8)
表单处理页savereply.php将表单提交的数据存储到指定的数据库中,其实现的方法与论坛发布中的表单处理技术是相同的,有关该技术的详细讲解请参考2.11.5节,这里不再赘述。
2.11.7 单元测试
在测试网上社区的论坛模块时,发现发帖时上传的图片不能够正常显示,运行结果中出现错误提示,如图2.39所示。分析错误原因,在图片上传成功后,没能正确地读取数据库中指定图片的路径。
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P112_15423.jpg?sign=1739059506-vgChSyrC1LhkbJhWzrf5QFyUkWzsGZqs-0-a1a37f9e3c9588baf82ac72f83807578)
图2.39 程序运行错误结果图
在bbs_lookbbs.php页面中查看获取的图片路径是否正确。发现在读取数据库中图片路径的代码段中,使用了错误的字段名称,数据库中图片路径存储使用的字段名是photo,而在程序代码段中使用的却是photos。错误代码如下:
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P113_41002.jpg?sign=1739059506-iaqrcJaoDVclyxnXJ2BGUEE1IF078PLu-0-f3225a0260c6b2d5e015cab1cee93e0c)
将代码段中的字段名进行修改,然后重新运行程序,图片正常显示。