<p> 2、构建文章显示模块</p><p> 前面说过,一片具体的文章是分属在看板和主体之下的。因此显示文章也要经过看板列表和主体列表这两页面后,才能得到特定主题下文章的列表。</p><p> (1)板列表的显示页面:</p><p> <code>< html><br />< head><br />< title>看板列表< /title><br />< meta http-equiv="Content-Type"content="text/html; charset=GB2312"><br />< /head></code></p><p> (2)打开连接,显示看板列表</p><p> <code>< %Set conn = Server.CreateObject("ADODB.Connection")<br />conn.Open "driver={Microsoft AccessDriver (*.mdb)};dbq=" & Server.MapPath("bbssystem.mdb")<br />sql = "select * from 看板列表"<br />set rs=conn.execute(sql)<br />%></code></p><p> 注:简单的SQL查询,把所有的看板有关讯息传回到纪录集RS中。下面的任务就是显示纪录记得内容,并在相应的看板名称上建立显示看板主题的连接。</p><p> <code>< body bgcolor="#FFFFFF"><br />< h2 align="center">看板列表</h2><br />< table width="60%" border="0"cellspacing="0" cellpadding="0"align="center"><br />< tr bgcolor="#FFFFCC"><br />< td height="35" width="25%">看板名称</td><br />< td height="35" width="21%">板主</td><br />< td height="35" width="23%">主题数</td><br />< td height="35" width="31%">板主登陆</td><br />< /tr></code></p>
<p> </p>
<p> 注:这儿一部分是显示出表格中每一列的标题,这儿我没有用一个统一的函数来显示RS纪录记的内容,因为这样可以对表格的外观和风格做更多的控制,使用起来虽然有点麻烦,但是却更为灵活。</p><p> <code>< %<br />do<br />boardid=rs("id")<br />boardname=rs("名称")<br />boardmanager=rs("板主")<br />response.write "< tr>< td><a href=qBoard.asp?boardid="& boardid& "&boardname=" & boardname& ">" & boardname &"< /a>< /td>" </code></p><p> 注:这一行是重点,当点击了各个板的名称后,可以连接到显示看板主题的页面。程序代码看起来有点麻烦,我分解了给你讲,你就会明白了。在点击之后,浏览器请求使用的是qBoard.asp页面,并带有一个参数boardid,代表要显示看板的ID号,在请求页面和参数之间用问号(?)分隔。Boardid是前面设定了的变量,其中包含的就是对应看板的ID号。这个连接中还带有另外一个参数boardname,用来把看板名称传递给qBoard.asp页面。在多个参数间使用"&"来分隔。这个参数不是必须的,传递过去是为了免得在qBorad.asp中再次用boardid来查询看板名称。一般来说,能够少用数据库操作就应当尽量的少用,这样可以提高ASP页面的性能。因为Response.Write语句使用字符串作为参数的,所以上面的字符串和变量之间使用的是"&"联结符。最后ASP页面解释的结果应该是像这样的</p><p> <code><td>< a href=qBoard.asp?boardid=1&boardname=系统板>系统板 < /a>< td>。<br />response.write "< td>< a href=qAuthor.asp?author="&boardmanager & ">" &boardmanager & "< /a></td>"<br />response.write "< td>" &rs("主题数") & "< /td>"<br />response.write "< td>< a href=managerlogin.asp?boardid="&boardid & ">板务处理< /a></td>< /tr>"</code></p>
<p> </p>
<p> 注:在这个表中,除了可以由连接来显示看板主题的内容,还有一个斑竹查询部分和板务处理部分,版主查询可以是通过qAuthor.asp来实现的,它只是简单的从数据库中取出作者讯息,并显示出来,这儿就不多说了。而板务处理是由managerlogin.asp页面来处理的。这属于文章审阅模块,我在后面再详说。</p><p> <code>rs.movenext<br />loop until rs.eof<br />%></code></p><p> 注:通过一个do … loop循环,把纪录集中所有的讯息都显示了出来。</p><p> <code>< /table><br />< div align="center"><br> </code></p><p> 点击看板名称可以得到主题列表,点击板主名称可以察看板主讯息</p><p> <code>< /div><br />< /body><br />< /html><br />< %<br />set rs=nothing<br />conn.close<br />set conn=nothing<br />%> </code></p><p> (3)打造qBaord.asp页面: </p><p> <code>< %<br />boardid=request("boardid") '取出由上个页面传递过来的看板ID号<br />Set conn = Server.CreateObject("ADODB.Connection")<br />conn.Open "driver={Microsoft AccessDriver (*.mdb)};dbq=" & Server.MapPath("bbssystem.mdb")<br />Set cmd = Server.CreateObject("ADODB.Command")<br />Set cmd.ActiveConnection = conn<br />cmd.CommandText = "主题列表"<br />ReDim param(0) //注:声明参数数组<br />param(0) = CLng(boardid)//注:CLng 不可忽略<br />Set rs = cmd.Execute( ,param )<br />%><br />< html><br />< head><br />< title>主题列表< /title><br />< meta http-equiv="Content-Type"content="text/html; charset=GB2312"><br />< /head><br />< body bgcolor="#FFFFFF"><br />< h1 align="center"><%=rs("看板名")%>板主题列表 </h1><br />< table width="80%" border="0"cellspacing="0" cellpadding="0"align="center"><br />< tr bgcolor="#FFFFCC"><br />< td width="89%" height="21">主题</td><br />< td width="11%" height="21">文章数</td><br />< /tr><br />< %<br />do<br />topicid=rs("id")<br />topicname=rs("标题")<br />sum=rs("文章数")<br />response.write "< tr>< td><a href=qtopic.asp?topicid=" & topicid& "&boardname=" & boardname& ">" & topicname &"< /a>< /td>"<br />response.write "< td>" &sum & "< /td>< /tr>"<br />rs.movenext<br />loop until rs.eof<br />%><br />< /table><br />< /body><br />< /html></code></p>
<p> </p>
<p> 注:qBoard.asp列出了某个版面下的所有的主题,在点击了主题名称后就会进入相应的主题文章列表。这个列表的是由qTopic.asp这个ASP脚本来实现的。Qtopic.asp的程序代码在本质上几乎和qBoard.asp没有区别,只是在各自的细节上有所区别,这儿也不打算再多讲了。</p><p> (4)在点击了文章列表中的文章标题后,会进入文章内容浏览页article.asp:</p><p> <code>< %<br />articleid=request("articleid")<br />Set conn = Server.CreateObject("ADODB.Connection")<br />conn.Open "driver={Microsoft AccessDriver(*.mdb)};dbq=" & Server.MapPath("bbssystem.mdb")<br />Set cmd = Server.CreateObject("ADODB.Command")<br />Set cmd.ActiveConnection = conn<br />cmd.CommandText = "按id查询文章"<br />ReDim param(0) ' 声明<br />param(0) = CLng(articleid) ' Cint 不可忽略<br />Set rs = cmd.Execute( ,param )<br />author=rs("作者id")<br />title=rs("标题")<br />data=rs("日期")<br />rate=rs("推荐度")<br />boardid=rs("看板id")<br />topicid=rs("主题id")<br />boardname=rs("看板名")<br />topicname=rs("主题名")<br />content=rs("内容")<br />content=replace(content,vbCrlf,"</p>< p>")<br />content="< p>" & content& "< /p>" </code></p><p> 注:这是一个要注意的地方,在内容字段中包含的是备忘类型的文本,其中可以包含换行字符。在HTML的显示中,必须要把换行字符(也就是vbCrlf常数)换成HTML的段落符号。这样在段落与段落的衔接处,就不会打乱原来输入时的格式。如果要设计的更好些,可以通过CSS来复位义< P>标签,设定其test-indent属性,就可以实现每段开头空格了。</p>
<p> </p>
<p> (5)把点击次数加一</p><p> <code>sql="Update 内容表 Set 点击次数=点击次数+1Where ID=" & articleid<br />conn.execute sql </code></p><p> 注:这儿有一个SQL语句,没当页面被显示的时候,会把相应的表中点击次数字段加一,这样就能够对文章浏览的次数做出统计,并可按顺序排名。在执行条语句的时候,我发现:本来在SQL语句中,嵌入的变量名应该加上单引号以与区别,但在这儿的articleid变量上我并没有加单引号,居然也能够通过,而我以前这样写从来都是会引发错误的,不知是不是由于新版本的ADO的缘故。</p><p> <code>set cmd=nothing<br />%><br />< html><br />< head><br />< title>Untitled Document< /title><br />< meta http-equiv="Content-Type"content="text/html; charset=GB2312"><br />< /head><br />< body bgcolor="#E9E9E4"><br />< table width="89%" border="0"cellspacing="0" cellpadding="0"align="center"><br />< tr bgcolor="#CCCCCC"><br />< td>作者:< font color="#FF3366"><a href="qauthor.asp?author=< %=author%>">< %=author%> < /a>< /font>发表日期:< font color="#FF3333"><%=data%>< /font><br />看板:< font color="#FF3333"><a href="qboard.asp?boardid=< %=boardid%>">< %=boardname%>< /a>< /font>板主推荐:< font color="#FF3333">#rate#</font>< /td><br />< /tr><br />< tr bgcolor="#CCCCCC"><br />< td>标题:< font color="#FF3333"><%=title%><br />主题:< a href="qtopic.asp?topicid=<%=topicid%>"> < %=topicname%>< /a> < /font>< /td><br />< /tr><br />< tr valign="top"><br />< td><br />< hr><br />< font color="#FF3366">文章内容:< /font>< br><br />< br><br />< font color=blue>< %response.writecontent%>< /font><br />< br><br />< br><br />< /td><br />< /tr><br />< tr valign="top"><br />< td height="18"><br />< table width="50%" border="0"cellspacing="0" cellpadding="0"align="right" bgcolor="#CCCCCC"><br />< tr><br />< td width="0%"> < /td><br /><td width="65%">关于此话题<a href="submit.asp?topicid=< %=topicid%>&boardid=<%=boardid%>">发表评论< /a></td> </code></p>
<p> </p>
<p> 这个连接允许网友对此评论的话题发表自己的见解,这是下一个模块要讲的内容了,这儿且按下不表。</p><p> <code>< /tr><br />< /table><br />< /td><br />< /tr><br />< /table><br />< /body><br />< /html><br />< %<br />set rs=nothing<br />conn.close<br />set conn=nothing<br />%> </code></p><p> 到此,文章显示部分也完成了。下面再来看看文章发表部分是如何实现的。</p><p> 3、构建文章发表部分</p><p> 文章发表模块只有两个页面,一个是前面提到的用来提供输入窗体的submit.asp,还有一个是用来处理窗体输入的subresult.asp。前面的那个页面很简单,基本上就是一个HTML窗体,没有什么好讲的,下面来看看subresult.asp的内容:</p><p> <code>< html><br />< head><br />< title>发表文章< /title><br />< meta http-equiv="Content-Type"content="text/html; charset=GB2312"><br />< /head><br />< body bgcolor="#FFFFFF"><br />< %<br />author=request("author")<br />password=request("password")<br />topicid=request("topicid")<br />boardid=request("boardid")<br />content=request("content")<br />title=request("title") </code></p><p> 注:这一段取出在submit.asp中提交的表但内容,放在相应的变量中。</p><p> <code>< html><br />< head><br />< title>发表文章< /title><br />< meta http-equiv="Content-Type"content="text/html; charset=GB2312"><br />< /head><br />< body bgcolor="#FFFFFF"><br />< %<br />author=request("author")<br />password=request("password")<br />topicid=request("topicid")<br />boardid=request("boardid")<br />content=request("content")<br />title=request("title") </code></p>
<p> </p>
<p> (1)查询作者是否已存在</p><p> <code>cmd.CommandText = "select * from 作者表where id='" & author &"'"<br />Set rs = cmd.Execute() </code></p><p> (2)检查权限</p><p> <code>cmd.CommandText = "select * from 作者表where id='" & author &"'"<br />Set rs = cmd.Execute() </code></p><p> 注:这一段是对作者权限进行检查,对于帐号不存在或者密码错误做出相应的错误处理。在这儿可以看到response.end的用法,它是用来结束当前ASP脚本。结合if语句,可以对程序中的预期错误进行处理。在一个好的WEB应用中,错误处理是必不可少的。</p><p> (3)将资料中的单引号改成两个单引号,并且在前后加上单引号</p><p> <code>Function SqlStr( data )<br />SqlStr = "'" & Replace( data,"'", "''" ) & "'"<br />End Function<br />'写入数据库<br />sql = "Insert Into 内容表 (看板id,主题id,作者id,标题,内容)Values( "<br />sql = sql & SqlStr(topicid) & ","<br />sql = sql & SqlStr(boardid) & ","<br />sql = sql & SqlStr(author) & ","<br />sql = sql & SqlStr(title) & ","<br />sql = sql & SqlStr(content) & ")"<br />conn.Execute sql<br />%><br />< h2>文章已经被发送到数据库,当板主审阅后就可以看到了<h2><br />< /body><br />< /html> </code></p><p> 到这儿,文章已经被保存在数据库中了。但是,它并不能够立刻被显示出来,还需要版主的认可才行。下面,就来看看论坛的管理部分的内容。</p>