데이터 베이스 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 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

ZTE 5G 휴대용 Wi-Fi U50S는 초기 가격 NT$899에 판매됩니다: 최대 네트워크 속도 500Mbps ZTE 5G 휴대용 Wi-Fi U50S는 초기 가격 NT$899에 판매됩니다: 최대 네트워크 속도 500Mbps Apr 26, 2024 pm 03:46 PM

4월 26일 뉴스에 따르면 ZTE의 5G 휴대용 Wi-Fi U50S는 현재 899위안부터 공식 판매되고 있습니다. 외관 디자인 측면에서 ZTE U50S 휴대용 Wi-Fi는 심플하고 스타일리시하며 쥐기 쉽고 포장이 쉽습니다. 크기는 159/73/18mm로 휴대가 간편해 언제 어디서나 5G 고속 네트워크를 즐길 수 있어 방해받지 않는 모바일 오피스와 엔터테인먼트 경험을 선사합니다. ZTE 5G 휴대용 Wi-Fi U50S는 최대 1800Mbps의 속도로 고급 Wi-Fi 6 프로토콜을 지원합니다. Snapdragon X55 고성능 5G 플랫폼을 사용하여 사용자에게 매우 빠른 네트워크 경험을 제공합니다. 5G 듀얼 모드 SA+NSA 네트워크 환경과 Sub-6GHz 주파수 대역을 지원할 뿐만 아니라 측정된 네트워크 속도도 놀라운 500Mbps에 도달해 쉽게 만족할 수 있습니다.

NT$649부터 시작하는 Kubi Cube Xiaoku Tablet 2 Lite 출시: 눈을 보호하는 11인치 대형 화면 + 8000mAh 대형 배터리 NT$649부터 시작하는 Kubi Cube Xiaoku Tablet 2 Lite 출시: 눈을 보호하는 11인치 대형 화면 + 8000mAh 대형 배터리 Mar 05, 2024 pm 05:34 PM

3월 4일 소식에 따르면 Kubi Rubik's Cube는 3월 5일 태블릿 컴퓨터 'Xiaoku Tablet 2Lite'를 출시할 예정이며 초기 가격은 649위안입니다. 새로운 태블릿에는 12nm 공정을 사용하고 1.6GHz ArmCortex-A75 CPU 2개와 ArmCortex-A55 프로세서 6개로 구성된 Unisoc의 T606 프로세서가 탑재된 것으로 알려졌습니다. 화면은 1280x800의 해상도와 최대 350nit의 밝기를 갖춘 10.95인치 IPS 눈 보호 화면을 사용합니다. 이미징 측면에서 Xiaoku Tablet 2Lite는 후면에 1300만 화소 메인 카메라가 있고 전면에 500만 화소 셀카 렌즈가 있으며 4G 인터넷 액세스/통화, Bluetooth 5.0 및 Wi-Fi5도 지원합니다. 게다가 관계자는 이 태블릿이 &l이라고 주장했습니다.

레트로 트렌드! HMD와 하이네켄, 투명 쉘 디자인 플립폰 공동 출시 레트로 트렌드! HMD와 하이네켄, 투명 쉘 디자인 플립폰 공동 출시 Apr 17, 2024 pm 06:50 PM

17일 뉴스에 따르면 HMD는 유명 맥주 브랜드 하이네켄, 크리에이티브 기업 보데가와 손잡고 독특한 폴더폰 '보링폰(The Boring Phone)'을 출시했다. 이 전화기는 디자인 혁신으로 가득 차 있을 뿐만 아니라 기능면에서도 자연으로 돌아가 사람들을 진정한 대인 관계로 돌아가게 하고 친구들과 함께 술을 마시는 순수한 시간을 즐기는 것을 목표로 합니다. Boring 휴대폰은 독특한 투명 플립 디자인을 채택하여 단순하면서도 우아한 미학을 보여줍니다. 내부에는 2.8인치 QVGA 디스플레이, 외부에는 1.77인치 디스플레이가 탑재되어 사용자에게 기본적인 시각적 상호 작용 경험을 제공합니다. 사진의 경우 3000만 화소 카메라만 탑재되어 있지만 간단한 일상 업무를 처리하기에는 충분하다.

Honor Magic V3, AI 디포커스 눈 보호 기술 출시: 근시 발병을 효과적으로 완화 Honor Magic V3, AI 디포커스 눈 보호 기술 출시: 근시 발병을 효과적으로 완화 Jul 18, 2024 am 09:27 AM

7월 12일 뉴스에 따르면, 새로운 Honor Vision Soothing Oasis 눈 보호 화면을 탑재한 Honor Magic V3 시리즈가 오늘 공식 출시되었습니다. 화면 자체는 높은 사양과 품질을 갖추고 있으면서도 AI 능동형 눈 보호 장치 도입을 개척했습니다. 기술. 근시를 완화하는 전통적인 방법은 근시 안경의 도수가 고르게 분포되어 있어 중심 시력 영역은 망막에 맺히지만 주변 영역은 망막 뒤에 맺히는 것으로 알려져 있습니다. 망막은 상이 뒤쳐져 있음을 감지하여 눈의 축방향 성장을 촉진시켜 정도를 심화시킵니다. 현재 근시 발생을 완화시키는 주요 방법 중 하나가 '디포커스 렌즈'다. 중심 영역은 정상적인 도수를 갖고, 주변 영역은 광학 설계 파티션을 통해 조절해 주변 영역의 상이 안으로 들어가게 한다. 망막 앞.

Teclast M50 Mini 태블릿 출시: 8.7인치 IPS 화면, 5000mAh 배터리 Teclast M50 Mini 태블릿 출시: 8.7인치 IPS 화면, 5000mAh 배터리 Apr 04, 2024 am 08:31 AM

4월 3일 뉴스에 따르면 Taipower가 곧 출시할 M50 Mini 태블릿 컴퓨터는 풍부한 기능과 강력한 성능을 갖춘 장치입니다. 이 새로운 8인치 소형 태블릿에는 8.7인치 IPS 화면이 탑재되어 사용자에게 뛰어난 시각적 경험을 제공합니다. 메탈 바디 디자인은 아름다울 뿐만 아니라 기기의 내구성도 높여줍니다. 성능 측면에서 M50Mini에는 A75 코어 2개와 A55 코어 6개를 갖춘 Unisoc T606 8코어 프로세서가 탑재되어 원활하고 효율적인 실행 환경을 보장합니다. 동시에 태블릿에는 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 포럼의 읽기 권한 설정과 다양한 요구에 맞게 유연하게 구성하는 방법을 자세히 소개합니다. 1. 읽기 권한에 대한 기본 개념 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는 생체 역사상 가장 강력한 신호 수신 기능을 갖춘 휴대폰이 되었습니다. 새 휴대폰은 또한 안테나가 본체 주위에 분산된 독특한 360° 서라운드 디자인을 사용합니다. 이 디자인은 신호 강도를 향상시킬 뿐만 아니라 다양한 일상 자세를 최적화하여 부적절한 쥐기 방법으로 인해 발생하는 문제를 방지합니다.

See all articles