首页 数据库 mysql教程 如何用DW设计论坛

如何用DW设计论坛

Jun 07, 2016 pm 03:17 PM
前言 现在 论坛 设计

前言:现在网上的论坛到处都有,但不知您是否碰到过这样的情况:在杂乱无章的讨论信息中来寻找自己想要的内容,是一件很费费时费力的事情,到后来,您就都不想去看什么论坛了。那么我们能不能对自己网站论坛的内容增加审核功能呢?即任何网友发到论坛的文章


  前言:现在网上的论坛到处都有,但不知您是否碰到过这样的情况:在杂乱无章的讨论信息中来寻找自己想要的内容,是一件很费费时费力的事情,到后来,您就都不想去看什么论坛了。那么我们能不能对自己网站论坛的内容增加审核功能呢?即任何网友发到论坛的文章,并不立即被显示出来,必须经过站长或版主审阅之后,认为有价值,有必要推荐给其他网友的,就发表出来。否则就删掉了,免得浪费空间,搞得有点像精华区的意味,这样您的论坛比起一般的论坛来,能够提供给为明确有益的内容。放到您的网站上,应该能够吸引更多的网友来访问。这个设想当然能够实现,下面我就简单介绍如何制作。

  注:由于本文适用于对ACCESS数据库、HTML、ASP有一定了解的读者。

  一、论坛结构分析

  通过上面的功能需求分析,我们能够将论坛的制作分为四大部分:

  (1) 网友注册和管理模块:因为引入了站长或版主,在论坛中就必须能够对其进行身份验证。这个模块的功能,就是管理注册的网友,并能够提供相关的查询。比如,查询指定作者的任何发表的文章,查询当前发表文章最多的十个网友,等等。假如您的论坛不是很大,这个模块能够省略为只带有版主身份验证的功能,而去掉那些关于注册,查询的部分。

  (2) 文章显示模块:显示任何版主审核过的,觉得值得推荐的文章。

  (3) 发表文章模块:为注册网友提供发表见地的地方,发表后等待版主审阅。

  (4) 文章审阅模块:版主对任何网又发表但未经审阅的文章进行处理,已决定是发表还是删除。

  了解了具体的功能需求后,就能够按模块的开始论坛的设计了。当然,这些模块的只是在功能上对论坛结构的划分,实际上并不能够完全的把他们单独出来进行设计。对于这种较小的应用,也没有必要进行完全的模块化设计,在良好的规划下直接写程式代码或许来的更为简单一些。

  对于论坛实现起来有一般两种方法:用文档或数据库。相对而言,用数据库要简单高效一些,能够对论坛进行更好的控制,也能够对资料提供一些验证和保护。这儿我使用的是ACCESS数据库,对于一般的中小型的应用,ACCESS应该是能够胜任的。

  从上面的分析能够知道应该有四个表,下面我给出每个表的结构。

  (1)作者表(用来存放作者讯息):

  ID:

  文本类型,必填。是网友代号。

  密码:

  文本类型,必填。

  昵称:

  文本类型,必填。

  EMAIL: 文本类型,必填。

  职务:

  数字类型,必填。-1代表普通网友,0代表站长。大于0的数字代表版主。

  文章数:数字类型,必填。网友发表的文章总数。

  姓名:

  文本类型,可选。

  性别:

  文本类型,可选。

  电话:

  文本类型,可选。

  (2)内容表(用来存放具体文章内容和相关讯息):

  ID:自动编号,并为其配置索引,以加快搜寻的速度。

  看板ID:数字类型,来自看板列表,表示文章所属看板。

  主题ID:数字类型,来自主题表,表示文章所属主题。

  作者ID:文本类型,来自作者表,表示文章的作者。

  日期:日期/时间类型,预置初值为函数NOW(),自动取系统当前时间为其值。

  标题:文本类型。文章的标题。

  发表:是/否类型,为"真"时表示文章已通过审阅,能够发表;为"否"表示文章尚待审阅。

  推荐度:数字类型,文章的推荐程度。

  内容:备注类型,文章的具体内容。

  点击次数:数字类型,文章的点击次数。

  (3)看板列表(用来存放有关看板的讯息):

  ID:自动编号,同样的,也为其配置了索引。

  名称:文本类型,看板的名称。

  板主:文本类型,看板版主的ID。

  主题数:数字类型,看板中包含的主题数。

  (4)主题表(用来存放有关主题的讯息):

  ID:自动编号,并为其配置索引。

  标题:文本类型,表示主题名。

  看板:数字类型,来自看板列表,表示主题所属的看板。

  文章数:数字类型,主题中包含的文章数。

  任何的表是设计完了,但是数据库的设计并没有完,所以我们还需要建立表间关系,这样就能够让数据库执行一些相关性检查,避免资料出错。建立表间关系的另外的一个好处,就是通过他能够很容易的建立出复杂的JOIN查询。

  通常我们在ASP中操作数据库的时候,都是使用的执行时生成的查询,然后由传递给数据库解释执行。而在这儿我们要用的是存贮查询。和执行时查询比较而言,预存程式具备更多的长处。

  他保存在数据库中,单独于ASP程式代码,使得他更容易建立和修改,并且查询的效率更高,速度更快,能够调试好了以后再放在ASP页面中使用,能避免很多问题。而且使用存贮查询的ASP程式代码更加容易阅读和修改。可能大家都对在ASP中使用SQL查询感到很烦,特别是那些逗号啊,分号啊什么的,一不小心就会出错。使用存贮查询后,就能够不用顾虑这些问题了。当然,预存程式再使用上也有一些要注意的地方,在后面我会周详的讲解他的使用方法。在ACCESS中建立预存程式是一件很容易的事,这儿我就不再多说了。在这儿我只给出各个查询的SQL语句程式代码。

  我把任何要使用到的查询都作为预存程式保存在了数据库中,主要的有以下的一些:

  (1)按ID查询文章:

  SELECT 主题表.标题 AS 主题名, 看板列表.名称 AS 看板名, 内容表.*

  FROM 主题表 INNER JOIN (内容表 INNER JOIN 看板列表 ON 内容表.看板ID = 看板列表.ID) ON 主题表.ID = 内容表.主题ID

  WHERE (((内容表.ID)=[articleid]));

  (2)版主密码查询:

  SELECT 看板列表.板主, 作者表.密码

  FROM 作者表 INNER JOIN 看板列表 ON 作者表.ID = 看板列表.板主

  WHERE (((看板列表.ID)=[id];

  (3)查询作者:

  SELECT 作者表.*

  FROM 作者表

  WHERE (((作者表.ID)=[id]));

  (4)发表文章列表:

  SELECT [内容表].[ID], [内容表].[标题], [内容表].[作者ID] AS 作者, [内容表].[日期], [内容表].[推荐度], [内容表].[点击次数] AS 点击数。

  FROM 内容表

  WHERE ((([内容表].[主题ID])=[TopicIndex]) And (([内容表].[发表])=True));

  未发表文章列表:

  SELECT 内容表.ID AS 文章id, 主题表.ID AS 主题id, 主题表.标题 AS 主题, 内容表.标题 AS 标题, 内容表.作者ID AS 作者, 内容表.日期 AS 日期

  FROM 主题表 INNER JOIN 内容表 ON 主题表.ID = 内容表.主题ID

  WHERE (((内容表.发表)=False) AND ((内容表.看板ID)=[boardid]));

  (5)主题列表:

  SELECT 主题表.*, 看板列表.名称 AS 看板名

  FROM 看板列表 INNER JOIN 主题表 ON 看板列表.ID = 主题表.看板

  WHERE (((主题表.看板)=[boardIndex]));

  更有一些查询,因为大多类同,我就不一一列出了。

  在上面的查询语句中,能够看到一些由"["和"]"包围起来的东西,那就是查询参数了。需要在执行时给出参数值,然后把参数值带入到查询语句中才能够执行。更有一点要注意的是:在建立那些INNER JOIN查询时,是需要把表间关系添加到设计视图中的,否则是不能够自动生成INNER JOIN查询语句的。到这儿,数据库的设计就算完了,以后的工作就是ASP的事了。

  二、构建

  1、构建主窗体

  先要给出一个窗体,能够让网友输入注册讯息,这些是HTML的内容,且放在一边,我们来仔细看看具体实现注册的ASP脚本。

  (1)将资料中的单引号改成两个单引号,并且在前后加上单引号

  Function SqlStr( data )

  SqlStr = "''" & Replace( data,"''", "''''" ) & "''"

  End Function

  注:这是个自定义的函数,用来把用户输入中的单引号('')转换成两个单引号('''')。在ASP中,用双引号围着的是字符串,因而上面的"''"代表的就是只有一个单引号的字符串。之所以要把一个单引号换成两个单引号,这是因为在SQL语句中,用单引号围起来是用来代表变量的。为了不至于混淆,就要把字符串中的单引号用两个单引号来表示。而任何的用户输入都要作为变量嵌入到SQL语句中的,所以这个函数是必不可少的。

  (2)存贮准备

  id=Request("id")

  password=Request("password")

  nickname=Request("nickname")

  email=Request("email")

  sex=request("sex")

  注:把来自用户输入窗体中的内容保存在变量中,这不是必须的,但写了更容易读写。

  if Request("name")=""then name=" " else name=request("name")

  if Request("phone")=""then phone=" " else phone=request("phone")

  因为这些内容不是必须填的,为了防止用户没有输入任何内容,而造成数据库操作上的错误,就必须把没有填入字段用空格来代替。

  (3)建立连接

  Set conn = Server.CreateObject("ADODB.Connection")

  conn.Open "driver={Microsoft AccessDriver (*.mdb)};dbq=" & Server.MapPath("bbssystem.mdb")

  注:这一段是建立数据库连接,数据库的名称为bbssystem.mdb,这一段中唯一要注意的是Server.MapPath函数的应用。一般来说,凡是涉及到具体的目录的地方,都不要直接使用目录名,而用Server.MapPath函数来代替。善用好Server.MapPath和Request.ServerVariables()等函数,能够让您的WEB应用具备更好的可移植性。

  Set cmd = Server.CreateObject("ADODB.Command")

  (4)查询作者是否已存在

  Set cmd.ActiveConnection = conn

  cmd.CommandText = "查询作者"

  ReDim param(0) '' 声明参数数组

  param(0) = CStr(id) '' Cint 不可忽略

  Set rs = cmd.Execute( ,param )

  注:这一段就是用来执行预存程式的。在ADO中执行查询的方法有很多种,但是对于预存程式就只能使用Command对象了。首先,建立了一个叫做cmd的Command对象,然后把conn连接对象设定给cmd对象的ActiveConnection属性,把要执行的查询名称"查询作者"设定给CommandText属性,然后为查询参数赋值。我们声明了一个参数数组param(0),因为在"查询作者"这个查询中只有一个参数,所以数组就只有一个分量了。一般的,在查询中有几个参数,就要申明有相应分量个数的参数数组。并且参数出现的顺序是个数组中分量的顺序是对应的。在使用参数查询的过程中,尤其要注意的是,参数的类型要严格匹配,否这就会出错,所以上面的CStr()类型转换函数是不可缺少的。

  

  if not (rs.eof or rs.bof) then

  response.write "错误,您输入的ID号已被占用,请换一个再试试!"

  else

  sql = "Insert Into 作者表 (id, 昵称,Email, 密码,姓名,学校,系别,性别,电话) Values("

  sql = sql & SqlStr(id) & ","

  sql = sql & SqlStr(nickname) & ","

  sql = sql & SqlStr(email) & ","

  sql = sql & SqlStr(password) & ","

  sql = sql & SqlStr(name) & ",&", "

  sql = sql & SqlStr(sex) & ","

  sql = sql & SqlStr(phone) & ")"

  conn.Execute sql

  使用一个SQL的Insert语句把资料插入到数据库中。其实这一查询也能够做成预存程式放在数据库中,我偷了点懒:-)但是对比之下也能够看到预存程式的好处,执行时查询写起来实在是太麻烦了。

  2、构建文章显示模块

  前面说过,一片具体的文章是分属在看板和主体之下的。因此显示文章也要经过看板列表和主体列表这两页面后,才能得到特定主题下文章的列表。

  (1)板列表的显示页面:

  < html>

  < head>

  < title>看板列表< /title>

  < meta http-equiv="Content-Type"content="text/html; charset=GB2312">

  < /head>

  (2)打开连接,显示看板列表

  < %Set conn = Server.CreateObject("ADODB.Connection")

  conn.Open "driver={Microsoft AccessDriver (*.mdb)};dbq=" & Server.MapPath("bbssystem.mdb")

  sql = "select * from 看板列表"

  set rs=conn.execute(sql)

  %>

  注:简单的SQL查询,把任何的看板有关讯息传回到纪录集RS中。下面的任务就是显示纪录记得内容,并在相应的看板名称上建立显示看板主题的连接。

  < body bgcolor="#FFFFFF">

  < h2 align="center">看板列表</h2>

  < table width="60%" border="0"cellspacing="0" cellpadding="0"align="center">

  < tr bgcolor="#FFFFCC">

  < td height="35" width="25%">看板名称</td>

  < td height="35" width="21%">板主</td>

  < td height="35" width="23%">主题数</td>

  < td height="35" width="31%">板主登陆</td>

  < /tr>

  注:这儿一部分是显示出表格中每一列的标题,这儿我没有用一个统一的函数来显示RS纪录记的内容,因为这样能够对表格的外观和风格做更多的控制,使用起来虽然有点麻烦,但是却更为灵活。

  < %

  do

  boardid=rs("id")

  boardname=rs("名称")

  boardmanager=rs("板主")

  response.write "< tr>< td><a href=qBoard.asp?boardid="& boardid& "&boardname=" & boardname& ">" & boardname &"< /a>< /td>"

  注:这一行是重点,当点击了各个板的名称后,能够连接到显示看板主题的页面。程式代码看起来有点麻烦,我分解了给您讲,您就会明白了。在点击之后,浏览器请求使用的是qBoard.asp页面,并带有一个参数boardid,代表要显示看板的ID号,在请求页面和参数之间用问号(?)分隔。Boardid是前面设定了的变量,其中包含的就是对应看板的ID号。这个连接中还带有另外一个参数boardname,用来把看板名称传递给qBoard.asp页面。在多个参数间使用"&"来分隔。这个参数不是必须的,传递过去是为了免得在qBorad.asp中再次用boardid来查询看板名称。一般来说,能够少用数据库操作就应当尽量的少用,这样能够提高ASP页面的性能。因为Response.Write语句使用字符串作为参数的,所以上面的字符串和变量之间使用的是"&"联结符。最后ASP页面解释的结果应该是像这样的

  

  <td>< a href=qBoard.asp?boardid=1&boardname=系统板>系统板 < /a>< td>。

  response.write "< td>< a href=qAuthor.asp?author="&boardmanager & ">" &boardmanager & "< /a></td>"

  response.write "< td>" &rs("主题数") & "< /td>"

  response.write "< td>< a href=managerlogin.asp?boardid="&boardid & ">板务处理< /a></td>< /tr>"

  注:在这个表中,除了能够由连接来显示看板主题的内容,更有一个斑竹查询部分和板务处理部分,版主查询能够是通过qAuthor.asp来实现的,他只是简单的从数据库中取出作者讯息,并显示出来,这儿就不多说了。而板务处理是由managerlogin.asp页面来处理的。这属于文章审阅模块,我在后面再详说。

  rs.movenext

  loop until rs.eof

  %>

  注:通过一个do … loop循环,把纪录集中任何的讯息都显示了出来。

  < /table>

  < div align="center"><br>

  点击看板名称能够得到主题列表,点击板主名称能够察看板主讯息

  < /div>

  < /body>

  < /html>

  < %

  set rs=nothing

  conn.close

  set conn=nothing

  %>

  (3)打造qBaord.asp页面:

  < %

  boardid=request("boardid") ''取出由上个页面传递过来的看板ID号

  Set conn = Server.CreateObject("ADODB.Connection")

  conn.Open "driver={Microsoft AccessDriver (*.mdb)};dbq=" & Server.MapPath("bbssystem.mdb")

  Set cmd = Server.CreateObject("ADODB.Command")

  Set cmd.ActiveConnection = conn

  cmd.CommandText = "主题列表"

  ReDim param(0) //注:声明参数数组

  param(0) = CLng(boardid)//注:CLng 不可忽略

  Set rs = cmd.Execute( ,param )

  %>

  < html>

  < head>

  < title>主题列表< /title>

  < meta http-equiv="Content-Type"content="text/html; charset=GB2312">

  < /head>

  < body bgcolor="#FFFFFF">

  < h1 align="center"><%=rs("看板名")%>板主题列表 </h1>

  < table width="80%" border="0"cellspacing="0" cellpadding="0"align="center">

  < tr bgcolor="#FFFFCC">

  < td width="89%" height="21">主题</td>

  < td width="11%" height="21">文章数</td>

  < /tr>

  < %

  do

  topicid=rs("id")

  topicname=rs("标题")

  sum=rs("文章数")

  response.write "< tr>< td><a href=qtopic.asp?topicid=" & topicid& "&boardname=" & boardname& ">" & topicname &"< /a>< /td>"

  response.write "< td>" &sum & "< /td>< /tr>"

  rs.movenext

  loop until rs.eof

  %>

  < /table>

  < /body>

  < /html>

  

  注:qBoard.asp列出了某个版面下的任何的主题,在点击了主题名称后就会进入相应的主题文章列表。这个列表的是由qTopic.asp这个ASP脚本来实现的。Qtopic.asp的程式代码在本质上几乎和qBoard.asp没有区别,只是在各自的细节上有所区别,这儿也不打算再多讲了。

  (4)在点击了文章列表中的文章标题后,会进入文章内容浏览页article.asp:

  < %

  articleid=request("articleid")

  Set conn = Server.CreateObject("ADODB.Connection")

  conn.Open "driver={Microsoft AccessDriver(*.mdb)};dbq=" & Server.MapPath("bbssystem.mdb")

  Set cmd = Server.CreateObject("ADODB.Command")

  Set cmd.ActiveConnection = conn

  cmd.CommandText = "按id查询文章"

  ReDim param(0) '' 声明

  param(0) = CLng(articleid) '' Cint 不可忽略

  Set rs = cmd.Execute( ,param )

  author=rs("作者id")

  title=rs("标题")

  data=rs("日期")

  rate=rs("推荐度")

  boardid=rs("看板id")

  topicid=rs("主题id")

  boardname=rs("看板名")

  topicname=rs("主题名")

  content=rs("内容")

  content=replace(content,vbCrlf,"</p>< p>")

  content="< p>" & content& "< /p>"

  注:这是个要注意的地方,在内容字段中包含的是备忘类型的文本,其中能够包含换行字符。在HTML的显示中,必须要把换行字符(也就是vbCrlf常数)换成HTML的段落符号。这样在段落和段落的衔接处,就不会打乱原来输入时的格式。假如要设计的更好些,能够通过CSS来复位义< P>标签,设定其test-indent属性,就能够实现每段开头空格了。

  (5)把点击次数加一

  sql="Update 内容表 Set 点击次数=点击次数 1Where ID=" & articleid

  conn.execute sql

  注:这儿有一个SQL语句,没当页面被显示的时候,会把相应的表中点击次数字段加一,这样就能够对文章浏览的次数做出统计,并可按顺序排名。在执行条语句的时候,我发现:本来在SQL语句中,嵌入的变量名应该加上单引号以和区别,但在这儿的articleid变量上我并没有加单引号,居然也能够通过,而我以前这样写从来都是会引发错误的,不知是不是由于新版本的ADO的缘故。

  set cmd=nothing

  %>

  < html>

  < head>

  < title>Untitled Document< /title>

  < meta http-equiv="Content-Type"content="text/html; charset=GB2312">

  < /head>

  < body bgcolor="#E9E9E4">

  < table width="89%" border="0"cellspacing="0" cellpadding="0"align="center">

  < tr bgcolor="#CCCCCC">

  < td>作者:< font color="#FF3366"><a href="qauthor.asp?author=< %=author%>">< %=author%> < /a>< /font>发表日期:< font color="#FF3333"><%=data%>< /font>

  看板:< font color="#FF3333"><a href="qboard.asp?boardid=< %=boardid%>">< %=boardname%>< /a>< /font>板主推荐:< font color="#FF3333">#rate#</font>< /td>

  < /tr>

  < tr bgcolor="#CCCCCC">

  < td>标题:< font color="#FF3333"><%=title%>

  主题:< a href="qtopic.asp?topicid=<%=topicid%>"> < %=topicname%>< /a> < /font>< /td>

  < /tr>

  < tr valign="top">

  < td>

  < hr>

  < font color="#FF3366">文章内容:< /font>< br>

  < br>

  < font color=blue>< %response.writecontent%>< /font>

  < br>

  < br>

  < /td>

  < /tr>

  < tr valign="top">

  < td height="18">

  < table width="50%" border="0"cellspacing="0" cellpadding="0"align="right" bgcolor="#CCCCCC">

  < tr>

  < td width="0%"> < /td>

  <td width="65%">关于此话题<a href="submit.asp?topicid=< %=topicid%>&boardid=<%=boardid%>">发表评论< /a></td>

  这个连接允许网友对此评论的话题发表自己的见解,这是下一个模块要讲的内容了,这儿且按下不表。

  < /tr>

  < /table>

  < /td>

  < /tr>

  < /table>

  < /body>

  < /html>

  < %

  set rs=nothing

  conn.close

  set conn=nothing

  %>

  到此,文章显示部分也完成了。下面再来看看文章发表部分是如何实现的。

  3、构建文章发表部分

  文章发表模块只有两个页面,一个是前面提到的用来提供输入窗体的submit.asp,更有一个是用来处理窗体输入的subresult.asp。前面的那个页面很简单,基本上就是个HTML窗体,没有什么好讲的,下面来看看subresult.asp的内容:

  < html>

  < head>

  < title>发表文章< /title>

  < meta http-equiv="Content-Type"content="text/html; charset=GB2312">

  < /head>

  < body bgcolor="#FFFFFF">

  < %

  author=request("author")

  password=request("password")

  topicid=request("topicid")

  boardid=request("boardid")

  content=request("content")

  title=request("title")

  注:这一段取出在submit.asp中提交的表但内容,放在相应的变量中。

  < html>

  < head>

  < title>发表文章< /title>

  < meta http-equiv="Content-Type"content="text/html; charset=GB2312">

  < /head>

  < body bgcolor="#FFFFFF">

  < %

  author=request("author")

  password=request("password")

  topicid=request("topicid")

  boardid=request("boardid")

  content=request("content")

  title=request("title")

  (1)查询作者是否已存在

  cmd.CommandText = "select * from 作者表where id=''" & author &"''"

  Set rs = cmd.Execute()

  (2)检查权限

  cmd.CommandText = "select * from 作者表where id=''" & author &"''"

  Set rs = cmd.Execute()

  注:这一段是对作者权限进行检查,对于帐号不存在或密码错误做出相应的错误处理。在这儿能够看到response.end的用法,他是用来结束当前ASP脚本。结合if语句,能够对程式中的预期错误进行处理。在一个好的WEB应用中,错误处理是必不可少的。

  (3)将资料中的单引号改成两个单引号,并且在前后加上单引号

  Function SqlStr( data )

  SqlStr = "''" & Replace( data,"''", "''''" ) & "''"

  End Function

  ''写入数据库

  sql = "Insert Into 内容表 (看板id,主题id,作者id,标题,内容)Values( "

  sql = sql & SqlStr(topicid) & ","

  sql = sql & SqlStr(boardid) & ","

  sql = sql & SqlStr(author) & ","

  sql = sql & SqlStr(title) & ","

  sql = sql & SqlStr(content) & ")"

  conn.Execute sql

  %>

  < h2>文章已被发送到数据库,当板主审阅后就能够看到了<h2>

  < /body>

  < /html>

  到这儿,文章已被保存在数据库中了。但是,他并不能够立即被显示出来,还需要版主的认可才行。下面,就来看看论坛的管理部分的内容。

  4、论坛的管理部分

  这儿是我们这个论坛的核心之所在,但他实现起来也没有什么特别的地方。还是那些老东西:窗体处理,数据库查询,在用ASP把他们有机的结合起来。当进入了文章审阅模式(前面提到的板务处理)之后,最为首要的内容,应该是对版主的身份进行验证了。下面来看看版主登陆页面:

  < %

  boardid=request("boardid")(注:boardid是由进入这个页面的连接所传递过来的,是要进行板务处理的看板的ID。通过他才能知道处理的是那个板的板务。)

  

  Set conn = erver.CreateObject("ADODB.Connection")

  conn.Open "driver={Microsoft AccessDriver (*.mdb)};dbq=" & Server.MapPath("bbssystem.mdb")

  Set cmd = Server.CreateObject("ADODB.Command")

  Set cmd.ActiveConnection = conn

  cmd.CommandText = "板主密码查询"

  ReDim param(0)

  param(0) = CLng(boardid) //注:CLng 不可忽略

  Set rs = cmd.Execute( ,param )

  boardmanager=rs("板主")

  set cmd=nothing

  %>

  < html>

  < head>

  < title>Untitled Document< /title>

  < meta http-equiv="Content-Type"content="text/html; charset=GB2312">

  < /head>

  < body bgcolor="#FFFFFF">

  < p>只有板主< %=boardmanager%>才能够进入这个地方</p>

  < p>请输入验证密码, 并且为了保持身份验证,请打开浏览器的Cookies。</p>

  < form method="post" action="managerloginrest.asp">

  < input type="password" name="password">

  < input type="hidden" name="boardid"value=< %=boardid%>>

  < input type="submit" name="Submit"value="确定">

  < /form>

  

  注:这个页面仅仅是用来登陆用的,他得到斑竹输入的密码后,并不能进行验证,而是将验证的工作放到下一个页面中进行。实际上,密码输入和验证的工作是能够放在一个页面中完成的,只但是程式代码的结构安排上有点麻烦。

  < /body>

  < /html>

  < %

  set rs=nothing

  conn.close

  set conn=nothing

  %>

  现在得到了版主ID和输入的密码,下面就是进行验证的工作managerloginrest.asp了,他接受上面那个文档中窗体的内容,并进行相关处理:

  < %

  response.buffer=true

  注:把缓冲区配置为允许使用。这一条一般来说,是应该加在每个ASP页面的首部的,这样能够提高ASP页面的性能。在打开了缓冲区后,ASP中更有一些相应的特别用法,在后面会提及。

  boardid=request("boardid")

  password=request("password")

  Set conn = Server.CreateObject("ADODB.Connection")

  conn.Open "driver={Microsoft AccessDriver (*.mdb)};dbq=" & Server.MapPath("bbssystem.mdb")

  Set cmd = Server.CreateObject("ADODB.Command")

  Set cmd.ActiveConnection = conn

  cmd.CommandText = "板主密码查询"

  ReDim param(0) '' 声明

  param(0) = CLng(boardid)//注:CLng不可忽略

  Set rs = cmd.Execute( ,param )

  boardmanager=rs("板主")

  if password< > rs("密码")then %>

  < html>

  < head>

  < title>身份验证< /title>

  < meta http-equiv="Content-Type"content="text/html; charset=GB2312">

  < /head>

  < body bgcolor="#FFFFFF">

  密码错误

  < /body>

  < /html>

  < %

  else

  session("beenthere")=boarded

  注:使用Session来保持对版主的身份验证,这必须需要客户端浏览器的cookie被打开了。因为Session是通过cookie来实现的。在这儿,把看板ID赋给Session变量beenthere,表明版主主已通过了身份验证。在后面的每个版务处理的页面中,都要检查beenthere是否和相应的看版ID相符。

  url="boardmanager.asp?boardid="& boardid

  response.redirect url

  补充:初学ASP的时候总是为response.redirect这个方法感到困惑,屡用不爽,现在我来告诉您一些技巧。使用他之前,必须通过response.buffer=true来让ASP页面使用缓冲区。这时,在ASP被解释成HTML程式代码之前,他是放在缓冲区中的,而不直接被发送的客户端浏览器。更有一个必须要知道的是:在使用response.redirect之前,是不能有任何实际的HTML程式代码被发送到客户端浏览器的,否则就会出错。当然也有变通的方法,假如在response.redirect之前已有HTML程式代码被解释出来,能够用response.clear方法来清除缓冲区,然后就能够使用他来进行复位向了。

  end if

  %>

  注:下面就是在上面身份验证通过后复位向的目标:boardmanager.asp。他将列出了任何别有被处理的文章。

  < %

  boardid=request("boardid")

  if session("beenthere")< >boardidthen response.redirect "forums.asp"

  注:这就是检验版主身份的地方,因为前面已通过cookie在斑竹的浏览器中作了标记,现在我们就能够通过seesion来辨认版主的身份了。假如标示不符,就会通过response.redirect返回到最开始的登陆页面。假如版主浏览器的cookie没有打开,那么seesion("beenthere")的值会为空,同样也无法进入这个页面。

  Set conn = Server.CreateObject("ADODB.Connection")

  conn.Open "driver={Microsoft AccessDriver (*.mdb)};dbq=" & Server.MapPath("bbssystem.mdb")

  Set cmd = Server.CreateObject("ADODB.Command")

  Set cmd.ActiveConnection = conn

  sql="select 名称 from 看板列表 whereid=" & boardid

  set rs=conn.execute(sql)

  boardname=rs("名称")

  cmd.commandtext="未发表文章列表"

  ReDim param(0)

  param(0) = CLng(boardid)//注:Clng 不可忽略

  Set rs = cmd.Execute( ,param )

  set cmd=nothing

  %>

  < html>

  < head>

  < title>版务处理< /title>

  < meta http-equiv="Content-Type"content="text/html; charset=GB2312">

  < /head>

  < body bgcolor="#FFFFFF">

  < h1 align="center"><%=boardname%>版务管理< /h1>

  < hr>

  < %

  if rs.eof or rs.bof then response.write "<H2>现在没有文章要处理< /h2>"

  response.end

  %>

  注:假如没有新文章被网友发布,这给出相应的提示,并用response.end来结束此页的显示。

  < table width="90%" border="0"cellspacing="0" cellpadding="0"align="center" >

  < tr bgcolor="#FFFFCC">

  < td width="40%" height="20">主题</td>

  < td width="40%" height="20">文章标题</td>

  < td width="8%" height="20">作者</td>

  < td width="12%" height="20">日期</td>

  < /tr>

  < %

  do

  topicid=rs("主题id")

  articleid=rs("文章id")

  data=rs("日期")

  datastr=cstr(year(data)) & "-"& cstr(month(data)) &"-"& cstr(day(data))

  author=rs("作者")

  articlename=rs("标题")

  topicname=rs("主题")

  response.write "< tr>< td><a href=qtopic.asp?topicid="& topicid& ">" & topicname &"< /A>< /td>"

  response.write "< td>< a href=managearticle.asp?articleid="&articleid & "&boardid="& boardid &">" &articlename & "< /A>< /td>"

  response.write "< td>< a href=qauthor.asp?author="&author & ">" & author& "< /a>< /td>"

  response.write "< td>" &datastr & "< /td>< /tr>"

  rs.movenext

  loop until rs.eof

  %>

  < /table>

  < /html>

  < %

  set rs=nothing

  conn.close

  set conn=nothing

  %>

  < /body>

  当点击了相应文章的联结后,就进入此文章的处理页面managearticle.asp:

  < %

  articleid=request("articleid")

  boardid=request("boardid")

  if session("beenthere")< >boardidthen response.redirect "forums.asp"

  Set conn = Server.CreateObject("ADODB.Connection")

  conn.Open "driver={Microsoft AccessDriver (*.mdb)};dbq=" & Server.MapPath("bbssystem.mdb")

  Set cmd = Server.CreateObject("ADODB.Command")

  Set cmd.ActiveConnection = conn

  cmd.CommandText = "按id查询文章"

  ReDim param(0)

  param(0) = CLng(articleid)//注:Clng 不可忽略

  Set rs = cmd.Execute( ,param )

  author=rs("作者id")

  title=rs("标题")

  data=rs("日期")

  rate=rs("推荐度")

  boardid=rs("看板id")

  topicid=rs("主题id")

  boardname=rs("看板名")

  topicname=rs("主题名")

  content=rs("内容")

  content=replace(content,vbCrlf,"</p>< p>")

  content="< p>" & content& "< /p>"

  set cmd=nothing

  %>

  < html>

  < head>

  < title>Untitled Document< /title>

  < meta http-equiv="Content-Type"content="text/html; charset=GB2312">

  < /head>

  < body bgcolor="#E9E9E4">

  < table width="89%" border="0"cellspacing="0" cellpadding="0"align="center">

  < tr bgcolor="#CCCCCC">

  < td>作者:< font color="#FF3366"><a href="qauthor.asp?author=< %=author%>">< %=author%> < /a>< /font>发表日期:< font color="#FF3333"><%=data%>< /font>

  看板:< font color="#FF3333"><a href="qboard.asp?boardid=< %=boardid%>">< %=boardname%>< /a>< /font>板主推荐:< font color="#FF3333">#rate#</font>< /td>

  < /tr>

  < tr bgcolor="#CCCCCC">

  < td>标题:< font color="#FF3333"><%=title%>

  主题:< a href="qtopic.asp?topicid=<%=topicid%>"> < %=topicname%>< /a> < /font>< /td>

  < /tr>

  < tr valign="top">

  < td>

  < hr>

  < font color="#FF3366">文章内容:< /font>< br>

  < br>

  < font color=blue>< %response.writecontent%>< /font>

  < br>

  < hr>

  < /td>

  < /tr>

  < tr valign="top">

  < form method="post" action="manageresult.asp">

  < td height="18">

  < table width="100%" border="1"cellspacing="1" cellpadding="1">

  < tr>

  < td width="29%">

  < div align="right">

  < input type="hidden" name="boardid"value="< %=boardid%>">

  < input type="hidden" name="topicid"value="< %=topicid%>">

  < input type="hidden" name="articleid"value="< %=articleid%>">

  文章处理:< /div>

  < /td>

  < td width="12%" bordercolor="#006666">删除:

  < input type="radio" name="manage"value=1>

  < /td>

  < td width="30%" bordercolor="#006666">发表:

  < input type="radio" name="manage"value=2>

  推荐等级

  < select name="select">

  < option value="1">1</option>

  < option value="2">2</option>

  < option value="3" selected>3</option>

  < option value="4">4</option>

  < option value="5">5</option>

  < /select>

  < /td>

  < td width="20%" bordercolor="#006666">以后再处理:

  < input type="radio" name="manage"value=3>

  < /td>

  < td width="9%">

  < input type="submit" name="Submit"value="确定">

  < /td>

  < /tr>

  < /table>

  < /td>

  < /form>

  < /tr>

  < /table>

  < /body>

  < /html>

  < %

  set rs=nothing

  conn.close

  set conn=nothing

  %>

  

  注:这一页和文章显示模块中的article.asp基本上是相同的,仅仅是多加入了版主处理的窗体,在这儿就不多讲了。

  下面,要根据版主的处理过程,修该数据库相应部分

  < %response.buffer=true%>

  < html>

  < head>

  < title>文章处理< /title>

  < meta http-equiv="Content-Type"content="text/html; charset=GB2312">

  < /head>

  < body bgcolor="#E9E9E4">

  < %

  articleid=request("articleid")

  boardid=request("boardid")

  topicid=request("topicid")

  manage=request("manage")

  ''接受窗体内容

  response.write manage ''显示斑竹ID

  if session("beenthere")< >boardidthen response.redirect "forums.asp"

  Set conn = Server.CreateObject("ADODB.Connection")

  conn.Open "driver={Microsoft AccessDriver (*.mdb)};dbq=" & Server.MapPath("bbssystem.mdb")

  根据上页中版主的操作,下面进行相应的处理。

  if CLng(request("manage"))=1 then

  sql="delete from 内容表 where id="& articleid

  conn.execute sql

  response.write "< h1>文章已被删除</h1>"

  response.write "< a href=>back</a>"

  elseif CLng(request("manage"))=2then

  sql="update 内容表 set 发表=true whereid=" & articleid

  conn.execute sql

  sql="update 主题表 set 文章数=文章数 1where id=" & topicid

  conn.execute sql

  response.write "< h1>文章已发表</h1>"

  response.write "< a href=>back</a>"

  else

  response.clear

  response.redirect "boardmanager.asp?boardid="& boarded

  end if

  %>

  < /body>

  < /html>

  < %

  conn.close

  set conn=nothing

  %>

  经过上面几步,任何的部分就算是基本完成了,当然,这时还不能拿来用,摆不上台面的。假如想要能够拿得出来的话,还要在版面设计,客户端资料验证等方面多下一些功夫。但是那都是HTML的内容了,和ASP没多大的关系,这儿我就不多讲了。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

首发899元 中兴5G随身Wi-Fi U50S开售:最高网速500Mbps 首发899元 中兴5G随身Wi-Fi U50S开售:最高网速500Mbps Apr 26, 2024 pm 03:46 PM

4月26日消息,中兴5G随身Wi-FiU50S目前已经正式开售,首发899元。外观设计上,中兴U50S随身Wi-Fi简约时尚,易于手持和包装。其尺寸为159/73/18mm,携带方便,让您随时随地畅享5G高速网络,实现畅行无阻的移动办公与娱乐体验。中兴5G随身Wi-FiU50S该设备支持先进的Wi-Fi6协议,峰值速率高达1800Mbps,依托骁龙X55高性能5G平台,为用户提供极速的网络体验。不仅支持5G双模SA+NSA网络环境和Sub-6GHz频段,实测网速更可达惊人的500Mbps,轻松满

首发649元 酷比魔方小酷平板2 Lite来了:11寸护眼大屏+8000mAh大电量 首发649元 酷比魔方小酷平板2 Lite来了:11寸护眼大屏+8000mAh大电量 Mar 05, 2024 pm 05:34 PM

3月4日消息,酷比魔方将于3月5日推出“小酷平板2Lite”平板电脑,首发价649元。据悉,新款平板搭载紫光展锐T606处理器,采用12nm工艺,由两颗1.6GHz的ArmCortex-A75CPU和六颗ArmCortex-A55处理器组成。屏幕采用的是10.95英寸IPS护眼屏,分辨率为1280x800,亮度高至350尼特。影像方面,小酷平板2Lite后置1300万像素主摄,前置500万像素自拍镜头,另支持4G上网/通话、蓝牙5.0、Wi-Fi5。此外,官方宣称,这款平板电脑&l

复古潮流!HMD与喜力联合推出翻盖手机:透明外壳设计 复古潮流!HMD与喜力联合推出翻盖手机:透明外壳设计 Apr 17, 2024 pm 06:50 PM

4月17日消息,HMD携手知名啤酒品牌喜力以及创意公司Bodega,联袂推出了一款别具一格的翻盖手机——无聊手机(TheBoringPhone)。这款手机不仅在设计上充满新意,更在功能上返璞归真,旨在引领人们回归真实的人际交往,享受与朋友畅饮的纯粹时光。无聊手机采用了独特的透明翻盖设计,展现出一种简约而不失优雅的美感。其内部配备了2.8英寸QVGA显示屏,外部则是一块1.77英寸的显示屏,为用户提供了基本的视觉交互体验。在摄影方面,虽然仅搭载了30万像素的摄像头,但足以应对日常的简

荣耀Magic V3首发AI离焦护眼技术:有效缓解近视发展 荣耀Magic V3首发AI离焦护眼技术:有效缓解近视发展 Jul 18, 2024 am 09:27 AM

7月12日消息,荣耀MagicV3系列今日正式发布,搭载全新荣耀视力舒缓绿洲护眼屏,在屏幕本身具备高规格和高素质的同时,还开创性的引入AI主动式护眼技术。据悉,传统的缓解近视的方式是“近视镜”,近视眼镜度数均匀分布,保证了视线中心区域成像在视网膜之上,但周边区域成像在视网膜后,视网膜感应到成像在后,促进眼轴向后生长,从而使度数加深。目前主要的缓解近视发展的方式之一是“离焦镜”,其中心区域度数正常,周边区域通过光学设计分区调整,从而使周边区域成像落在视网膜前,

台电M50 Mini小平板来了:8.7寸IPS屏、5000mAh电池 台电M50 Mini小平板来了:8.7寸IPS屏、5000mAh电池 Apr 04, 2024 am 08:31 AM

4月3日消息,台电即将推出的M50Mini平板电脑是一款功能丰富、性能强大的设备。这款8英寸小平板新品搭载了8.7英寸的IPS屏幕,为用户提供了出色的视觉体验。其金属机身设计不仅美观,还增强了设备的耐用性。在性能方面,M50Mini搭载了紫光展锐T606八核处理器,拥有两个A75核心和六个A55核心,确保了流畅且高效的运行体验。同时,该平板还配备了6GB+128GB的存储方案,并支持8GB内存扩展,满足了用户对于存储和多任务处理的需求。在续航上,M50Mini配备了5000mAh的电池,支持Ty

ppt结束页如何设计才足够吸引人 ppt结束页如何设计才足够吸引人 Mar 20, 2024 pm 12:30 PM

在工作中,ppt是职场人士常常使用的办公软件。一个完整的ppt必须有一个好的结束页。不同的职业要求赋予不同的ppt制作特点。关于结束页的制作,如何才能设计的比较吸引人呢?下边我们一起看一看,如何设计ppt结束页吧!ppt结束页的设计可以在文字和动画方面进行一些调整,根据需要选择简洁或炫目的风格。接下来,我们将重点关注如何通过创新的表达方式来打造出符合要求的ppt结束页。那我们开始今天的教程吧。1、对于结束页的制作上,使用图片中的任何文字都可以,结束页重要的是表示我的演示结束了。2、除了这些文字,

Discuz论坛权限管理:阅读权限设置指南 Discuz论坛权限管理:阅读权限设置指南 Mar 10, 2024 pm 05:33 PM

Discuz论坛权限管理:阅读权限设置指南在Discuz论坛管理中,权限设置是至关重要的一环。其中,阅读权限的设置尤为重要,它决定了不同用户在论坛中能够看到的内容范围。本文将详细介绍Discuz论坛的阅读权限设置,以及如何针对不同的需求进行灵活的配置。一、阅读权限基础概念在Discuz论坛中,阅读权限主要有以下几个概念需要了解:默认阅读权限:新用户注册后默认

vivo信号最强手机!vivo X100s搭载寰宇信号放大系统:21天线、360°环绕设计 vivo信号最强手机!vivo X100s搭载寰宇信号放大系统:21天线、360°环绕设计 Jun 03, 2024 pm 08:41 PM

5月13日消息,vivoX100s今晚正式发布,除了出色的影像,新机在信号方面表现也十分强悍。据vivo官方介绍,vivoX100s采用了创新的寰宇信号放大系统,该系统配备了高达21根天线。这一设计基于直屏进行了重新优化,以平衡5G、4G、Wi-Fi、GPS以及NFC等众多信号需求。这使得vivoX100s成为了vivo有史以来信号接收能力最强的手机。新款手机还采用了独特的360°环绕设计,天线分布在机身周围。这一设计不仅增强了信号的强度,还针对日常各种握持姿势进行了优化,避免了因握持方式不当导

See all articles