
第七章留言板与讨论板的设计与实现 本章主要介绍了留言反与讨论板的最据库结构、程序流程图及功使实现过程 71留言板的设计与实现 71.1留言板程序流程图 留言板程子流程如图7.1所示。 输人留古信惠 厂类交留合位息 处耳密宁(存储、制除) 查看留吉 凶言板程序流程图 7.12留言板数据的设计
1 本章主要介绍了留言板与讨论板的数据库结构、程序流程图及功能实现过程。 7.1 留言板的设计与实现 留言板的基本功能就是把访问者的意见、建议和问题等信息记录下来,并提供给其 他访问者(包括站长和网友)观看,以便人们进行交流。 留言板应该具有一个“留言表单”网页,以便访问者输入留言信息,并把信息传送 给服务器处理。留言信息被送到服务器时,ASP程序负责处理留言并将其存储起来,故需 在服务器端设置处理留言信息的程序和存储留言信息的数据库。此外,还要设计浏览留 言信息的网页。 留言板程序流程如图7.1所示。 建立留言数据库时,需要建主题、姓名、电子信箱、留言内容、留言时间和表情等字段。 主题、姓名、电子信箱和表情等字段是信息比较少的字段,可采用文本数据类型,留言内容 会占用较大空间,宜采用备注格式数据类型。而对于时间字段,我们把时间字段设为“日期/ 时间”类型,并设置默认值为NOW(),这样在创建新的记录时,系统自动填入建立该记录的 时间,保存了留言者的留言时间,由于浏览的留言信息以时间顺序排序,故该类型设置索引 项为“有(有重复)”。留言板数据库结构如图7-2所示。 输入留言信息 提交留言信息 处理留言(存储、删除) 查看留言 图 7-1 留言板程序流程图

设计形 图7-2 7.13留言板功能的实现 留言表单处理程 利用T 正印可。在
2 图7-2 根据留言板程序流程图可看出,完成一个完整的留言板系统,需要设计提交留言表单、 留言表单处理程序和浏览留言信息三部分内容。下面对设计中的关键技术作一说明。 1. 提交留言表单的设计 利用Dreamweaver的表单元素设计主题、姓名、电子信箱、留言内容、留言时间和表 情等字段。留言信息可能不只一行,采用文本区域框,其它输入项采用文本框即可。在 这里要注意的是: (1)所有的输入项都要放在一个表单框内。 (2)设置表单的发送对象为ASP程序,同时指明服务器端处理留言程序的ASP程序地 址,即中的action参数 值

2.留言表单处理程序 留言表单处理程序主要是把留言表单送来的留言信息存储在数据库中。读取留言表 单的内容用Request对象,短过Reques L对象把读取的值赋给变量,存入数居库中。若要 求留言板中有访问者的的IP地址,在此可用命令Request.ServerVariables0找出访问者 的的P地址,把得到的1P地址赋给变量。另外,还需用一个地址转向语句,以便用户能 看到自己的留言信么, 3,测览留言信总的设计 设计思想是打开数据库,逐一取得每个:录各个字假的值,并以一定的格式提供给访 问者。当信息过多时,就要给数据分页,故要设定每页显示的信总条数:与此同时,网 页要为访问者提供交互功能,即访问者能够决定显示第几页信息,可用文木框输入页数, 然后调用Request对象读取的入值并显示雷言信息,涉及到的部分程序如下: rs.p4 esize=器g光_sze(设置一页显示的留言条数) Page=CIng(Request(“Pge”)(袋取要显示的页数) If Page(1 then Pag】(若输入的页数小于1,则强制设为第1页) If Page>rs.Pa2 eCount then Page=rs.PageCount(若拾入的页数大于最大页数, 则送制设为最后一页) Showonepage rs,page Shoeonepa2e是·个显示留言的了程序,它根据脑和Page两个参数显示具体的页面, 其设计思想利用参数传递过来的值,打开数裙库的表的记录集丽,并显示Pag阳指定的页 面, 上述的提交留言板信息和显示信息在进行页面处理时放在一个页面上,一页显示10 条留言。这样可以诚少文件数,也方便最示和与留言 在留言板代马设计时,比较难的是分页功能的实现。该留言板在显示留言下方设计 了“上一页”、“下一页”、“第一页”、“最后一页”的功能。如图7-所示. 返回留言窗体下一页最后一页页次:1/2 图7-3 相关代码如下: 返回图言窗体 (福 if page◇1 then response.write "" response,write"上一页 end if if page<>rs.pagecount then responsc,write "F" 3
3 2.留言表单处理程序 留言表单处理程序主要是把留言表单送来的留言信息存储在数据库中。读取留言表 单的内容用Request对象,通过Request对象把读取的值赋给变量,存入数据库中。若要 求留言板中有访问者的的IP地址,在此可用命令Request.ServerVariables()找出访问者 的的IP地址,把得到的IP地址赋给变量。另外,还需用一个地址转向语句,以便用户能 看到自己的留言信息。 3.浏览留言信息的设计 设计思想是打开数据库,逐一取得每个记录各个字段的值,并以一定的格式提供给访 问者。当信息过多时,就要给数据分页,故要设定每页显示的信息条数;与此同时,网 页要为访问者提供交互功能,即访问者能够决定显示第几页信息,可用文本框输入页数, 然后调用Request对象读取输入值并显示留言信息,涉及到的部分程序如下: rs.pagesize=page_size (设置一页显示的留言条数) Page=Clng(Request(“Page”))(获取要显示的页数) If Pagers.PageCount then Page=rs.PageCount (若输入的页数大于最大页数, 则强制设为最后一页) Showonepage rs,page Shoeonepage是一个显示留言的子程序,它根据RS和Page两个参数显示具体的页面, 其设计思想利用参数传递过来的值,打开数据库的表的记录集RS,并显示Page指定的页 面。 上述的提交留言板信息和显示信息在进行页面处理时放在一个页面上,一页显示10 条留言。这样可以减少文件数,也方便显示和写留言。 在留言板代码设计时,比较难的是分页功能的实现。该留言板在显示留言下方设计 了“上一页”、“下一页”、“第一页”、“最后一页”的功能。如图7-3所示。 图7-3 相关代码如下: 返回留言窗体 1 then response.write "第一页" response.write "上一页" end if if page<>rs.pagecount then response.write "下一页

response,.write“/=rs.agecount>/font) 4,留言板程序功能 留言板的程序有两个,一个是1 iuyanban..sp,该文件主罗用于显示留言记录和输入 留言。当提交留言时,程序转向cu1i1 iuyan.asp,由该文件将输入的留言记求写入数据 库中,然后返回1 iuyanban,asD,显示留言,并准备输入下条留言。 留言板程序功能的实现图7-4所示。 Liuyanban.asp chuliliuyan.asp Lwyancanku.mdb 图7-4 5,分页功作参数说明 ASP中的分页功能就是将数据库的查而结果分页显示。实现步聚:首先将数据库中所 有符合查训条件的记录一次性〔或分批》读入【®心wdst中,存故在内存中,然后通过 ADO Recordset对象所提层的几个专门支持分页处理的属性:PageSiz以页大小)、 PageCount(页数日)以及AbsolutePage(地对页)宋管理分页处埋, 进行ADO存取数据库时的分页显示,其实就是对R©dst的记录进行染作。 Rr对象的属性和方法如下: ■以OF属性:目前指标指到ReoordSet的第一笔, ■EOF属性:目前指标指到RecordSet的最后一笔。 ■Mwe方法:移动指标到RecordSet中的某一条记k. ■AbsolutePage属性:设定当前记的位置是位干哪一负 ■AhsoluteP飞sition属性:月前指标在RecordSe中的位置. ■PageCount属性:显示Recordset对象包括多少“页”的数据。 ■PeS7理属性:显示Recordset对象每一页显示的记录数。 ■RecordCount属性:显示Recordset对象记录的总数, 下面就与分页相关的属性进行说明。 (I)AbsolutePage属性 AhlP四属性设定当前记录的位置是位于郑一页的页数编号:使用PageSine属性
4 response.write " 最后一页 " end if %> 页次:/ 4.留言板程序功能 留言板的程序有两个,一个是liuyanban.asp,该文件主要用于显示留言记录和输入 留言。当提交留言时,程序转向chuliliuyan.asp,由该文件将输入的留言记录写入数据 库中,然后返回liuyanban.asp,显示留言,并准备输入下一条留言。 留言板程序功能的实现如图7-4所示。 图7-4 5.分页功能参数说明 ASP中的分页功能就是将数据库的查询结果分页显示。实现步骤:首先将数据库中所 有符合查询条件的记录一次性(或分批)读入 recordset 中,存放在内存中,然后通过 ADO Recordset 对象所提供的几个专门支持分页处理的属性: PageSize( 页大小 )、 PageCount( 页数目 ) 以及 AbsolutePage( 绝对页 ) 来管理分页处理。 进行 ADO 存取数据库时的分页显示,其实就是对 Recordset 的记录进行操作。 Reordset 对象的属性和方法如下: ◼ BOF 属性:目前指标指到 RecordSet 的第一笔。 ◼ EOF 属性:目前指标指到 RecordSet 的最后一笔。 ◼ Move 方法:移动指标到 RecordSet 中的某一条记录。 ◼ AbsolutePage 属性:设定当前记录的位置是位于哪一页 ◼ AbsolutePosition 属性:目前指标在 RecordSet 中的位置。 ◼ PageCount 属性:显示 Recordset 对象包括多少“页”的数据。 ◼ PageSize 属性:显示 Recordset 对象每一页显示的记录数。 ◼ RecordCount 属性:显示 Recordset 对象记录的总数。 下面就与分页相关的属性进行说明。 (1)AbsolutePage 属性 AbsolutePage 属性设定当前记录的位置是位于哪一页的页数编号;使用 PageSize 属性

将Recordset对象分割为逻辑上的页数,每一页的记录数为PageSize(除了最后一页可能会有 少于PageSiz心的记录数),这且必须注意并不是所有的数据提供者都支持此项属性,因此使 用时要小心。与AbsolutePosition属性相同,AbsolutePage属性是以l为起始的,若当前记录 为Recordset的第行记录,AbsolutePage为l.可以设定AbsolutePage属性,以移动到一 个指定页的第一行记录位置。 (2)AbsolutePosition属性 AbsolutePosition属性用于确定指针所指记求的疏切位置,AbsolutePosition属性的数值为 当前指针相对于记求集顶部的位置,由1算起,即第一条记的AbsolutePositi为l.注意, 在存取RecordSet时,无法保证RecordSet每次都以同样的顺序出现。若要启用 AbsolutePosition,必须先设定为使用用户增cursor(指针),asp码如下:rs2.CursorLocation=3 (3)PageCount属性 PageCount属性确定Recordset对象包括多少“页”的致据。这旦的“页”是数据记录的 集合,大小等于PageSiz四属性的设定,即使最后一页的记录数比PageSize的值少,最后一 页也算是PageCount的一页。 (4)PageSire属性 P:gSi四属性是决定AD)存取数据库时如何分页显示的关键,使用它就可以决定多少 记录组成一个遂我上的“一页”。设定并建立一个页的大小,从而允许使用AbsolutePage属 性移到其它逻斜负的第一条记求。P坚S属性能随时被设定 (S)RecordCount属性 RecordCount属性可以找出·个Recordset对象包括多少条记录。如: 7.2讨论板的设计与实现 7.2.1讨论板程序流程图 讨论组一胶用于各个小组在网上上就共同的主题进行讨论。有时也可称它为BS,它是网 上最早流行的栏目,为大家提供了发布信息、白由抒发情感、讨论问题的空间。本讨论组在 设计时,是由管理员发讨论主圈,然后在每个讨论主避里可以就主道进行讨论。其程序流程 图如图7-4所示: 脊是 发主颗 同好卡题 品示讨论信息 图7-4公告板程序流程图
5 将Recordset 对象分割为逻辑上的页数,每一页的记录数为 PageSize(除了最后一页可能会有 少于 PageSize 的记录数)。这里必须注意并不是所有的数据提供者都支持此项属性,因此使 用时要小心。与AbsolutePosition 属性相同,AbsolutePage 属性是以1为起始的,若当前记录 为 Recordset 的第一行记录,AbsolutePage 为1。可以设定 AbsolutePage 属性,以移动到一 个指定页的第一行记录位置。 (2)AbsolutePosition 属性 AbsolutePosition 属性用于确定指针所指记录的确切位置,AbsolutePosition属性的数值为 当前指针相对于记录集顶部的位置,由1算起,即第一条记录的 AbsolutePosition为1。注意 , 在存取 RecordSet 时 , 无 法 保证 RecordSet 每 次 都 以同 样 的 顺 序出 现 。 若 要启 用 AbsolutePosition,必须先设定为使用用户端cursor(指针),asp码如下:rs2.CursorLocation = 3 (3)PageCount 属性 PageCount 属性确定Recordset 对象包括多少“页”的数据。这里的“页”是数据记录的 集合,大小等于 PageSize 属性的设定,即使最后一页的记录数比 PageSize 的值少,最后一 页也算是 PageCount 的一页。 (4)PageSize 属性 PageSize 属性是决定 ADO 存取数据库时如何分页显示的关键,使用它就可以决定多少 记录组成一个逻辑上的“一页”。设定并建立一个页的大小,从而允许使用 AbsolutePage 属 性移到其它逻辑页的第一条记录。PageSize 属性能随时被设定。 (5)RecordCount 属性 RecordCount 属性可以找出一个 Recordset 对象包括多少条记录。如: 7.2 讨论板的设计与实现 讨论组一般用于各个小组在网上上就共同的主题进行讨论。有时也可称它为BBS,它是网 上最早流行的栏目,为大家提供了发布信息、自由抒发情感、讨论问题的空间。本讨论组在 设计时,是由管理员发讨论主题,然后在每个讨论主题里可以就主题进行讨论。其程序流程 图如图7-4所示: 图 7-4 公告板程序流程图 登录 发主题 回复主题 显示讨论信息

7.22公告板数据咋的设计 BBS中沙及两个数据表,一个是主题数据表,另一个是与主圈相关的讨论帖数据表。主题数 据表和相关讨论帖数据表如图7-5和图7-6所示。这两张表以T1D为关键字进行关联。关 联图如图77所示 ttL:表 ▣☒ R驾陵 CiM.D a41 文本 宜本 Td由 Cr8t0t期 口用/时间 家 羊院厦味 常织看闭 率大小 长整数 增 有无量加】 公位标记 图7-5 titles数据表 他4场t1原:失 工 u项 零段区1中 图7-6 details数据表
6 BBS 中涉及两个数据表,一个是主题数据表,另一个是与主题相关的讨论帖数据表。主题数 据表和相关讨论帖数据表如图 7-5 和图 7-6 所示。这两张表以 TitleID 为关键字进行关联。关 联图如图 7-7 所示。 图 7-5 titles 数据表 图 7-6details 数据表

日关系 6▣区 A titles details Titlem TitleID A Enail Detailn Ho 2i1 5h)e1 Jeu Yords Subjuet 图7-7 titles和etails关联图 7.2.3讨论板功能的实现 村论主要由输入主题、提交主题、显示主题和可复主题四个部分组成。网页文件主受有4 个,其中xxi用于显示讨论板首页,包括时论土题和提交主题功能,ew甲用于将 新主题写入数据库,detail.as即用于显示某个主恩下的时论内容,detnew.as印用于将付论内容写 入数据库。讨论板程序调用的实现,如图7-8所示。 Xuexi.asp Titlenew asp Detail.asp LunGn.IN. Detnew.asp 图7-8 7.2.4程序设计要点 在Xux.p中,最示的日期是主送创建日期到最后一条讨论内容的史新日期,是一个时 问段,与s数据表所一定的字段不一致.如图79所示。 到1合及 aae字以number米经bee1米2 其打 ■工作林然感数士城■ 【时按击南银地中用结,定 4/0t/n0工工作h 0本腰星的可滑瓶e纹。 C0/i00ava0甲tYtm 口格丰像保女辅保 L4ww》e平及 e41tg“产双 图7-9
7 图 7-7 titles 和 details 关联图 讨论主要由输入主题、提交主题、显示主题和回复主题四个部分组成。网页文件主要有 4 个。其中 xuexi.asp 用于显示讨论板首页,包括讨论主题和提交主题功能,titlenew.asp 用于将 新主题写入数据库,detail.asp 用于显示某个主题下的讨论内容,detnew.asp 用于将讨论内容写 入数据库。讨论板程序调用的实现,如图 7-8 所示。 图 7-8 7.2.4 程序设计要点 在 Xuexi.asp 中,显示的日期是主题创建日期到最后一条讨论内容的更新日期,是一个时 间段,与 titles 数据表所一定的字段不一致。如图 7-9 所示。 图 7-9

相应的程序如下: 《tdwr园p>工作站小组名称 /tr> 第 if not rsData.EOF Then rsLuta lovefirst While Not rsdata.OF Duyl-right (00"ADuy (rsDAta ("CreateDate")).2) Vonthl-right ("00"Anonth (rsData(CreateDate")).2) Day2-ight ("00"&Day(rsdata ("LastnewsDate")).2) Month2-right (00"&Month (raDaca ("Las1NensDate")),2) DuteRaage-kmth1最/"&Duyl表"-&nth2"/&Day2 (=DuteRanges> >=rDuta("subject) Jax/iD 《/tr> rsdata.MoveNext Wend D /a) detne.sp文件用于保存讨论内容.当进入某一个讨论主题,并发表意见之后,detnew..asp 除了要将讨论内容保存于deti1s数据表之外,还盂要同时更新titles数据表的以下两个字 段:
8 相应的程序如下: 日期 工作站小组名称 则数 主题 "> 在显示记录的“主题”(subject)字段时,为主题设置了一个超级链接,以便进入detail.asp 页面。超级链接的建立方法如下: "> detnew.asp文件用于保存讨论内容。当进入某一个讨论主题,并发表意见之后,detnew.asp 除了要将讨论内容保存于details数据表之外,还需要同时更新titles数据表的以下两个字 段:

LastNewsDate字段:最后被讨论的时问,史新后的内容为系统时问(取ngwO函数). Mber字段:参与讨论的则数,更新后,在原数的基础上加一一 上面两个字段的更新代码如下: set cmd=server.Create(bject ("AlXOB.command") set cnd.activeConnection"rsData.ActiveConnection sql="update titles set lastNewsDate=nox(),[nunber]=[number]+l where titleld=&titleld cnd.ComnandText=sql cnd.execute 实验留言板与讨论板程序设计实例 本章实验主要针对留言板和讨论板进行设计,根据本章提供的数据库及源程序,设计出 有特点的留言板和讨论板。下面的界面及源程序仅供多考。 一、留言板程序设计 1、界面设计 留言板首页比较简单,如图72所示。上部是留言显示部分,下面是留言添加表单,留言 填写完毕后,单击“送出留言”按讯后传送到chuliliuyan..asp去处理,处理完后再引导回首 页。如图7-10所示。 ,攻迎在这里留言Velcome 雪前页 菌由看 主要4学 时满5物1n 百者1 工漫别 时-儿灯■ 声# 密看网小可 里是可可 时国8十51得1 室直看 是侧 时5液家 百话从E 生是g 时国-52AE 面看4c面 生是thce plfcife 直看4ce 生是we 时属-5韩拉行制ce fiplfe 可T者 e laadlic 密看cda 生ew 明国指1拉客c国 Nplfe 百4e 生是计相 Hiplie 2¥万gT-海台后-有页次:1及 图7-10 2.Liuyanban,aspf代码 (
9 LastNewsDate字段:最后被讨论的时间,更新后的内容为系统时间(取now()函数)。 Number字段:参与讨论的则数,更新后,在原数的基础上加一。 上面两个字段的更新代码如下: set cmd=server.CreateObject("ADODB.command") set cmd.activeConnection=rsData.ActiveConnection sql="update titles set lastNewsDate=now(),[number]=[number]+1 where titleId="&titleId cmd.CommandText=sql cmd.execute 实验 留言板与讨论板程序设计实例 本章实验主要针对留言板和讨论板进行设计,根据本章提供的数据库及源程序,设计出 有特点的留言板和讨论板。下面的界面及源程序仅供参考。 一、留言板程序设计 1、界面设计 留言板首页比较简单,如图7-2所示。上部是留言显示部分,下面是留言添加表单,留言 填写完毕后,单击“送出留言”按钮后传送到chuliliuyan.asp去处理,处理完后再引导回首 页。如图7-10所示。 图7-10 2.Liuyanban.asp代码 <%

Dim strConn Dim objConnection set objConnection=Server.CreateObject ("ADODB.Connection") strConn="Provider=Microsoft.Jet.OLEDB.4.0:Data Source="&Server.MapPath ("liuyanban.ndb") ch.jComnec:tion.open sLrConn Din rs set rs"server.CreateObject ("ADOOB.Recordset") rs.open 'select fron liuyanbanku order by desc",objConnection,3,3 粉 (htnl> head》 Ch2 align=center>(font color="#FFCOFF">Ka href="../../index.asp">/a>/font> /h2) (生 page=CIng (request ("page")) if pagers.pageCount then page=rs.pagecount showonePage rs,page 》 (蛋 sub ShowOnePage(rs,page) rs.AhsolutePage=page for ipnge=1 to rs.pageSize rsTobook rs rs.novenext if rs.EOF Then Exit For next end sub suh rsTohook(rs) cmo-replace(rs(“留言",vbCrLf,“) if len(rs(图标))” else 10
10 Dim strConn Dim objConnection set objConnection=Server.CreateObject("ADODB.Connection") strConn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("liuyanban.mdb") objConnection.open strConn Dim rs set rs=server.CreateObject("ADODB.Recordset") rs.open "select * from liuyanbanku order by 时间 desc",objConnection,3,3 %> rs.pageCount then page=rs.pagecount showonePage rs,page %> ") if len(rs("图标"))<>0 then picHtml="" else