![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=1739414404-LfMjx0ryMdFoWCQ6jqTxwvtEcTuvN1eS-0-15df61f22b91c911f41f16e62b5c8e98)
视频讲解
社区论坛模块为网站的浏览者提供一个交流的平台,以此来扩大网站的影响力,汇聚更多的人气,宣传企业形象,推广企业产品。
2.11.1 社区论坛模块概述
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P103_40983.jpg?sign=1739414404-NDgXgsUYYGWHjCo5OrWbWpBJxa9krFZZ-0-fb6429d4f914f42cce38348a4cd68753)
图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=1739414404-JB7eQxvzWohUfkoBj191IrBkxTzLbOcm-0-7ac0438678036ecadf065c7d648dccc4)
代码贴士
❶onChange:某元素失去焦点,并且从用户最后一次访问以来,其值已经改变。location:用于访问窗口的当前定位(URL),既可被读取,又可被置换,可以通过其实现某个页面的定位或者更新。
❷<option value='… '>…</option>:下拉列表框中输出的值,以及显示的内容。
该技术实现的运行结果如图2.34所示,它将实现从JSP版块跳转到PHP版块。
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P104_15062.jpg?sign=1739414404-sGIADKV9BrHOYBlhJMRi3PQCIv6IG7h9-0-ee0e306c01d3882e5d9aab2edbc3387e)
图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=1739414404-igl05xEbXuHzQlHrS7wER85E3zPVd3ai-0-670f0d6eda9d4b145ceb1bc3a449dd97)
图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=1739414404-wwU8R7pTAkLfA12a1PZfTz5CaY3ZDCcG-0-b008fd4ed8235be1325ba9303dedbf5e)
代码贴士
❶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=1739414404-q0DZveOwW4t2F5gWaaXoefYiGXCuy1tD-0-50681c0779e2209acedf33bec3c46903)
图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=1739414404-QBfraamliucolo3j9xnPKRenFTDFsfFQ-0-119a09ace81ade748b6a39c4a5943a32)
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P107_40993.jpg?sign=1739414404-7WTR0RJzKEARCMw34I3ovzCskx4WOHVF-0-72248b8cbcb7a361108707439ebb5891)
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P108_40994.jpg?sign=1739414404-nmldA7TUTrRNPfg5mrwQ4iVHl8qtrmrs-0-d7c4817e686a9a1f560d1f22d518baa1)
代码贴士
❶$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=1739414404-CM9Kih1IhYDz0ovtlR9hh4c7osnt9Iyn-0-67e0318a0a77eff8ed102f15c45b6966)
图2.37 帖子发布模块的运行结果
在发布信息的提交页中,显示当前用户的个人信息,设置添加数据表单元素,其中表单元素的设计如表2.9所示。
表2.9 发布信息页中使用的表单元素
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-T109_15283.jpg?sign=1739414404-Nrp4Abp5jvhOJ8185uIuzXRkHr3Ak3xE-0-e6aeffc4dca3cea0750cc1849001c21a)
在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=1739414404-NthjygMocvF1YSGFXuu4EFwLTG75NfY0-0-5a79dce493b706e3683256b30011de32)
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P110_40998.jpg?sign=1739414404-wbyV3CC1uvjfDyDTwpwH2mQTvAVv0Brt-0-53a843fa60de994859770a266085aeab)
代码贴士
❶$_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=1739414404-DX89Vbf7EjRFt4OM677QMPM2MdlHHnA0-0-1b00b30f1a4057bac0d2ef0add3edbee)
图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=1739414404-QeZFEsq88RG4PfnuwlDnKaGzP789T5bi-0-98ee377abf82e8e130a83614c08ce66c)
在帖子回复表单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=1739414404-XYo3DEvGNUcMsjS5lDPZF0Ecsq0O2nQP-0-7df5e24cfa017a51b4243cb4de230cca)
表单处理页savereply.php将表单提交的数据存储到指定的数据库中,其实现的方法与论坛发布中的表单处理技术是相同的,有关该技术的详细讲解请参考2.11.5节,这里不再赘述。
2.11.7 单元测试
在测试网上社区的论坛模块时,发现发帖时上传的图片不能够正常显示,运行结果中出现错误提示,如图2.39所示。分析错误原因,在图片上传成功后,没能正确地读取数据库中指定图片的路径。
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P112_15423.jpg?sign=1739414404-YAvpeYr5Y4mwmYYOdgaJB1yu0SjkHTpr-0-7ab7cca2e18ef47048c8398a79450a69)
图2.39 程序运行错误结果图
在bbs_lookbbs.php页面中查看获取的图片路径是否正确。发现在读取数据库中图片路径的代码段中,使用了错误的字段名称,数据库中图片路径存储使用的字段名是photo,而在程序代码段中使用的却是photos。错误代码如下:
![](https://epubservercos.yuewen.com/614B35/13043251803826006/epubprivate/OEBPS/Images/Figure-P113_41002.jpg?sign=1739414404-R5n1jc1mTLqFOH7i2Xz92pcwYTdcIaNA-0-7f093f7039f2c0a01eb5fb8418a20d80)
将代码段中的字段名进行修改,然后重新运行程序,图片正常显示。