ASP建站十大常用程序代码公布(第一至十节)完整篇
[color=red]第一节:注册系统 [/color]
     注册几乎是每个网站都要使用的,去论坛要注册,聊天要注册,几乎无处不注册,所以注册是所有ASP应用程序中最常见的。
                     
                      
[color=red]第二节:留言薄[/color]
     互联网最大的特点是互动性,让网友在留言薄上留下自己的意见能使网站的人气值上升不少。
                     
                      
[color=red]第三节:调查系统[/color]
    
     利用网络进行一些调查是非常常见的,轻轻一点投下自己一票,因此有一个调查系统能为网站增色不少。
                      
[color=red]第四节:购物车[/color]
 
     购物车这个名字取自超级市场的购物推车,不过这个小小的推车却是每个购物网站必备的。
                      
                      
[color=red]第五节:计数器[/color]
     在浏览网页的时侯,常常可以看见一些“当前网站上的人数是xxxx人”的在线人数统计。
                      
[color=red]第六节:论坛系统[/color]
     论坛可以说是网站中最受网友欢迎的地方,网友可以在这里自由的发表自己的意见,网站人气的高低很大程度上由论坛决定,因此为我们的网站增加一个论坛是必须的。
             
                      
[color=red]第七节:聊天室[/color]
     当你独自在Internet上浏览时,你并不是一个孤单的“旅人”,因为每时每刻总有成千上万的人同时在网上浏览,你可以同他们聊聊天,交谈几句,让自己体验一下 “网”内存知己、天涯若比邻的感觉
 
                      
[color=red]第八节:EMail[/color]
     当你独自在Internet上浏览时,你并不是一个孤单的“旅人”,因为每时每刻总有成千上万的人同时在网上浏览,你可以同他们聊聊天,交谈几句,让自己体验一下 “网”内存知己、天涯若比邻的感觉。
                      
[color=red]第九节:搜索系统[/color]
     一个大型网站内容众多,来访者往往很难找到自己所需要的东西,这时候就需要一个站内搜索来帮助来访者更快的找到索要的资料,所以搜索系统是一个大型网站必备系统。
           
                      
[color=red]第十节:分页程序[/color]
     从程序上说分页只是一种小技巧,但确实却是一个非常重要的小技巧,好,少说废话,我们开始吧。
[color=red][b][size=6]好了以上是我要给大家分别讲解的教程.欢迎大家及时收藏和支持[/size][/b][/color]
sun029 发表于 2007-2-27 23:41

[color=#0000ff][font=黑体]这里先给大家讲解 [/font][/color]      
   [color=red]第一节:注册系统[/color]
(一),设定注册页面的外观:
在这个例子中涉及了五个页面,其中有三幅是一般的htm文件,另外的两幅是asp文件,在这里制作利用的工具是frontpage98,但是大部分的asp代码还是要自己输入的:
  1,设定原来已经注册的用户进入的外观:在这里设置了两个文本框,一个超级链接和两个按钮。两个文本框分别用来输入帐号(txtNum)和密码(txtPasswd),超级链接(New)链接到新用户进行注册的页面,两个按钮是用来提交和清除的,用来清除的按钮(cmdReset)直接选择为Reset类型,不过用来提交的按钮(cmdTijiao)并不要选择为Submit类型,而选择的是Normal类型,这是为了在这个按钮的onClick事件中添加代码,并且判断用户的输入是否合法!
  2,设定新用户登陆的页面外观:一般都是要新用户输入帐号,密码,姓名,及相关的一些信息,在这里我们有五个文本框,一个下拉式列表框和两个按钮,五个文本框就分别是让用户输入姓名,email,帐号,密码,确定密码。但是其中只有用来输入帐号,密码和确定密码的文本框有名字,分别为txtNum,txtPasswd和txtConfirm。提交按钮的名字为cmdTijiao
  3,这一步当然是设定注册成功后用户所进的页面了,这就由大家决定吧:)
  (二),添加程序代码:
  1,首先添加原来已经注册用户页面的代码,它主要是处理cmdTijiao_onClick事件,并且判断用户的输入是否合法,在这个例子中要求帐号必须是数字,密码不能为空,代码如下,其中frmRes是这个页面中窗口的名字,窗口的Action指向[url=http://your/ResJudge.asp]http://your/ResJudge.asp[/url]
sub cmdTijiao_onClick()
 if frmRes.txtNum.value=”” or frmRes.txtPasswd.value=”” or (Not IsNumeric(frmRes.txtNum.value)) then
  Alert”请在帐号和密码中输入相应的内容,帐号必须为数字!”
 else frmRes.submit
 end if
end sub
2,添加新用户登陆的页面代码,这些代码是用来处理cmdTijiao_onClick事件的,要求用户输入的帐号必须是数字,密码和确定密码必须相同,这个页面的窗口的Action指向[url=http://your/NewRes.asp]http://your/NewRes.asp[/url],代码如下
sub cmdTijiao_onClick()
if Not Numeric(frmNew.txtNum.value) or frmNew.txtPasswd.value<>frmNew.txtConfirm.value then
 Alert”输入不正确,请重新输入!”
else frmNew.submit
end if
end sub
3,创建ResJudge.asp文件,这个asp文件的主要功能就是打开存储注册信息的数据库,查找是否有与前面页面提交的帐号和密码相匹配的纪录,如果有,就是注册成功,同时也可以在数据库中查找出这个用户的相关信息来,应允许这个用户进入他所希望进去的页面,如果没有则注册失败,整个代码如下
<html><head>
<meta http-equiv=”Content-Type” content=”text/html;charset=gb2312″>
<meta name=”GENERATOR” content=”Microsoft Fronpage 3.0″>
<titile>注册判断</title></head>
<body><%
Num=Request.form(“txtNum”) “把前面窗口传送来的内容赋给Num和Passwd两个字符串。
Passwd=Request.form(“txtPasswd”)
dbname=”Driver={Microsoft Access Driver(*.mdb)};DBQ=”&Server.MapPath(“”)”&”ResDbRes.mdb;” “dbname是打开数据库要用的
set Cres=Server.CreateObject(“ADODB.Connection”) “以下是利用Connection对像和Recordset对象联结数据库并查找的代码。
set res=Server.CreateObject(“ADODB.Recordset”)
Cres.open dbname
res.ActiveConnection=Cres
res.source=”Select*from res where 帐号=”&Num&” and 密码=”&Passwd&”;”
res.open
if res.BOF then “如果查找结果为空,那么就说明注册不正确,所以在页面中显示下面的文本/
%><p>注册不正确, 请返回注册页面重新注册!</p>
<%
else “否则就说明注册成功,可以进入浏览页面!
%>
<!–#Include virtual=”/success.htm”–> “这里采用了Server Side Include的方法,把允许浏览的页面包含在这个文件里面!
<% res.Close “ 关闭刚才打开的数据库。
end if %>
</body></html>
4,创建 NewRes.asp文件,这个文件的主要功能是把新用户的登陆信息存入数据库,代码如下
<html>
<head>
 <meta http-equiv=”Content-Type” content=”text/html;charset=gb2312″>
 <meta name=”GENERATOR” content=”Microsoft frontpage 3.0″>
 <title>输入数据库</title>
</head>
<body>
<!–#Include virtual=”/adovbs.inc”>
 “这个被包含进来的文件adovbs.inc是定义数据库对象ADO常量的文件。
<%
 Num=Request.form(“txtNum”) “把前面主页传送过来的内容赋给Num和Passwd两个变量。
 Passwd=Request.form(“txtPasswd”)
 Set res=Server.CreateObject(“ADODB.Recordset”) “打开数据库。
 dbname=”Driver={Microsoft Access  Driver(*.mdb)};DBQ=”&ServerMapPath(“”)&”ResDbRes.mdb;”
 sql=”select*from res”
 res.open sql,dbName,adOpenKeyset,adLockOptimistic
 res.AddNew “添加新纪录
 res(1)=Num “res(1)代表数据库中的第二个字段,存储的是用户的帐号。
 res(2)=Passwd “res(2)代表数据库中的第三个字段,存储的是用户的密码。
 res.Update “更新数据库/
 res.Close %>
 <p><b><font face=楷体_gb2312 size=5>您的帐号和密码已经注册成功,您现在可以<a href=”[url]http://your/index.htm[/url]“>进入</a>了!</font></p>
</body></html>
好了简单的代码就先讲解到这里,那里不对忘指教,下一节继续讲解用ASP设计一个留言薄,请各位及时收藏
sun029 发表于 2007-2-27 23:41

第二节:留言薄

 

  
今天呢我们继续学习ASP建站十大常用程序 第二节,这一节代码比较多请大家耐心的学习.

本节我们要讲两个方面的知识: 前者是一个输入界面,后者是一个显示界面,用于显示留言信息.

 
用ASP设计一个留言薄(上)

 

  首先,我们在做留言薄之前,先做出一个输入屏的界面效果,也就是生成留言部输入屏幕的htmL页,然后在这些htmL源代码中加入ASP脚本,我这里得到的htmL代码如下。
*文件名:book.htm 
<html>
<head>
 <title>留言薄</title>

</head>

<body bgcolor=”#BED9FC” background=”images/bg.gif”>
<p align=”center”><img src=”images/gbook.gif” alt=”GBook.gif (12142 bytes)” WIDTH=”374″
HEIGHT=”83″> </p>

<p align=”center”>[<a href=”disp.asp”>我要看留言板</a>]  [<a href=”../index.asp”>返回首页</a>]</p>

<form method=”POST” action=”book.asp”>
<input type=”hidden” name=”task” value=”insert”><div align=”left”><table>
<tr>
<td align=”right”>姓名</td>
<td><img src=”images/bottom-b.gif” alt=”BUTTOM-B.GIF (179 bytes)” WIDTH=”16″ HEIGHT=”16″></td>
<td><input name=”name” size=”46″></td>
</tr>
<tr>
<td align=”right”>性别</td>
<td><img src=”images/bottom-g.gif” alt=”BUTTOM-G.GIF (179 bytes)” WIDTH=”16″ HEIGHT=”16″></td>
<td><input name=”sex” size=”46″></td>
</tr>
<tr>
<td align=”right”>来自</td>
<td><img src=”images/bottom-b.gif” alt=”BUTTOM-B.GIF (179 bytes)” WIDTH=”16″ HEIGHT=”16″></td>
<td><input name=”from” size=”46″></td>
</tr>
<tr>
<td align=”right”>主页URL</td>
<td><img src=”images/homepage.gif” alt=”HomePage.gif (1232 bytes)” WIDTH=”30″ HEIGHT=”30″></td>
<td><input name=”url” size=”46″></td>
</tr>
<tr>
<td align=”right”>   
     
   
E-mail</td>
<td><img src=”images/email.gif” alt=”Email.gif (1197 bytes)” WIDTH=”30″ HEIGHT=”30″></td>
<td><input name=”email” size=”46″></td>
</tr>
<tr>
<td align=”right”>留言</td>
<td colspan=”2″><textarea wrap=”off” name=”comments” cols=”49″ rows=”9″></textarea></td>
</tr>
<tr>
<td>    </td>
<td colspan=”2″><dl>
<dd align=”center”>    <input type=”submit” value=”我写好了”>
    <input type=”reset” value=”重新再写”></dd>
</dl>
</td>
</tr>
</table>
</div>
</form>

<p align=”center”> </p>
</body>
</html>
您可以按这里看一下这个界面的效果(需要强调一点,这些htmL代码还是完全没有功能的)你可以把它保存为book.htm,然后用FRONTPAGE98来打开它,打开后,可以查看网页中的那个输入FORM的属性,在这个留言薄中。我们使用两个文件来处理,一个是book.asp,另一个是disp.asp,前者是一个输入界面,后者是一个显示界面,用于显示留言信息。

 

用ASP设计一个留言薄(下)

 

现在说说book.htm,让大家了解一下其中的那个输入FORM的作用,它的action对象是本身,book.asp(等一会儿需要把book.htm改名为book.asp)这个文件,也就是说。表单提交后,由本身来作处理。在这个FORM中,有几个文本输入框,它们分别是name,sex,from,url,email,以及多行文本输入框comments。

  现在把book.htm改名为book.asp,往文件中添加ASP代码。如下:(单引号表示ASP的注析,编译器是不处理的。

  *book.asp
<% @language=”vbscript” %>
<%
‘'判断请求方式,当客户端请求文件时,比如直接输入网址:[url]http://active.silversand.net/index.htm[/url]这样,就会产生一个GET的请求信息。而提交表单时(表单的方式设为POST),就会产生POST的请求方式,现在判断book.asp这个文件是用户用浏览器打开页面,还是用户提交数据这个动作,以便进行程序处理。
if Request.ServerVariables(“REQUEST_METHOD”)=”POST” then
‘这里判断出是由用户提交表单而调入入的页面,因此进行登记留言处理。
‘创建一个文件组件的服务器实例

set fsFilesys=CreateObject(“Scripting.FileSystemObject”)
‘打开文本文件server.mappath(“/”)是返回服务器发行目录的真实路径,也就是比如说:c:Inetpubwwwroot这个路径,然后”/realchat/book/book.txt”就是相对于这个路径基础上的路径。

set myText=fsFilesys.OpenTextFile(Server.MapPath(“/”)&”/realchat/book/book.txt”)
‘把文本文件的所有内容读出,保存在Temp这个变量中。

Temp=myText.Readall
myText.Close
‘是否需要添加内容

if Request(“task”)=”insert” Then
‘取得表单的各项的值

Tname=request.form(“name”)
Tsex=request.form(“sex”)
Temail=request.form(“email”)
turl=request.form(“url”)
Tfrom=request.form(“from”)
Tcomments=request.form(“comments”)
Ttime=”#&@”&time
if Len(Tcomments)<2 Then
%>
<font size=”4″ color=”red”>

<p align=”center”>对不起!你还未留言。<a href=”book.asp”>返回</a></font> <%
else
if Lcase(Left(Turl,7))<>”http://” Then
Turl=”http://”&Turl
End if
Turl=Lcase(Turl)
‘重新创建数据文件,把原来的覆盖掉。

set myText=fsFilesys.CreateTextFile(Server.MapPath(“/”)&”/realchat/book/book.txt”)
myText.WriteLine(Tname)
myText.WriteLine(Tsex)
myText.WriteLine(Temail)
myText.WriteLine(Turl)
myText.WriteLine(Tfrom)
myText.WriteLine(Tcomments)
myText.writeLine(Ttime)
myText.WriteLine(date)
myText.writeLine(Temp)
myText.Close
%>
<script Language=”JavaScript”>
document.write(“<h1>恭喜!您的留言已顺利提交,请按<a href='disp.asp'>这里</a>查看”)
</script>
<%

end if
‘至此,留言已保存入文件book.txt中

End if

else
‘第一次进入输入屏幕,因此显示htmL文件内容。
%>
<html>

<head>
<title>留言薄</title>
<% colorbg=”#BED9FC” %>
</head>

<body bgcolor=”<% =colorbg %>” background=”images/bg.gif”>
<p align=”center”><img src=”images/gbook.gif” alt=”GBook.gif (12142 bytes)” WIDTH=”374″
HEIGHT=”83″> </p>

<p align=”center”>[<a href=”disp.asp”>我要看留言板</a>]  [<a href=”../index.asp”>返回首页</a>]</p>

<form method=”POST” action=”book.asp”>
<input type=”hidden” name=”task” value=”insert”><div align=”left”><table>
<tr>
<td align=”right”>姓名</td>
<td><img src=”images/bottom-b.gif” alt=”BUTTOM-B.GIF (179 bytes)” WIDTH=”16″ HEIGHT=”16″></td>
<td><input name=”name” size=”46″></td>
</tr>
<tr>
<td align=”right”>性别</td>
<td><img src=”images/bottom-g.gif” alt=”BUTTOM-G.GIF (179 bytes)” WIDTH=”16″ HEIGHT=”16″></td>
<td><input name=”sex” size=”46″></td>
</tr>
<tr>
<td align=”right”>来自</td>
<td><img src=”images/bottom-b.gif” alt=”BUTTOM-B.GIF (179 bytes)” WIDTH=”16″ HEIGHT=”16″></td>
<td><input name=”from” size=”46″></td>
</tr>
<tr>
<td align=”right”>主页URL</td>
<td><img src=”images/homepage.gif” alt=”HomePage.gif (1232 bytes)” WIDTH=”30″ HEIGHT=”30″></td>
<td><input name=”url” size=”46″></td>
</tr>
<tr>
<td align=”right”>   
     
   
E-mail</td>
<td><img src=”images/email.gif” alt=”Email.gif (1197 bytes)” WIDTH=”30″ HEIGHT=”30″></td>
<td><input name=”email” size=”46″></td>
</tr>
<tr>
<td align=”right”>留言</td>
<td colspan=”2″><textarea wrap=”off” name=”comments” cols=”49″ rows=”9″></textarea></td>
</tr>
<tr>
<td>    </td>
<td colspan=”2″><dl>
<dd align=”center”>    <input type=”submit” value=”我写好了”>
    <input type=”reset” value=”重新再写”></dd>
</dl>
</td>
</tr>
</table>
</div>
</form>

<p align=”center”> </p>
</body>
</html>
<%
end if
%>
现在到disp.asp这个文件,这个文件主要完成从book.txt中提取文件内容,然后重新生成htmL代码以显示出留言内容。

  代码如下:

<% @language=”vbscript” %>

<html>

<head>
<title>留言薄</title>
</head>

<body background=”images/back.gif”>

<p align=”center”><img src=”images/gbook.gif” alt=”gbook.gif (12142 bytes)” WIDTH=”374″ HEIGHT=”83″><%
‘打开数据文件

set fsFilesys=CreateObject(“Scripting.FileSystemObject”)
set myText=fsFilesys.OpenTextFile(Server.MapPath(“/”)&”/realchat/book/book.txt”)
Tname=myText.ReadLine
%> </p>

<p align=”center”>[<font color=”#00FFFF” size=”4″><a href=”book.asp”>我要写留言</a></font>][<font color=”#00FFFF”><a href=”../index.asp”>返回首页</a></font>]</p>

<table width=”600″>
<%
do while Tname<>”Line1″
‘逐行读出内容(Line1)是文件结束标志

Tsex=myText.ReadLine
Temail=myText.ReadLine
Turl=myText.ReadLine
Tfrom=myText.ReadLine
%>
<tr>
<td><hr>
</td>
</tr>
<tr>
‘<%=表达式%>是向客户端输出结果

<th colspan=”2″ align=”left”>姓  名:<% =Tname %><br>
性  别:<% =Tsex %><br>
E—mail:<a href=”mailto:<% =Temail %>”><% =Temail %></a><br>
主页URL:<a href=”<% =Turl %>” target=”_blank”><% =turl %></a><br>
来  自:<% =Tfrom %></th>
</tr>
<tr>
<th align=”left” bgcolor=”<% =colorbg %>”><font color=”red”>留  言:</font></th>
<th align=”left” bgcolor=”<% =colorbg %>”><%
Tcomments=myText.ReadLine
do while InStr(Tcomments,”#&@”)=0
%>
<% =Tcomments %>
<br>
<%
Tcomments=myText.ReadLine
loop
Ttime=Mid(Tcomments,4)
Tdate=myText.ReadLine
%> </th>
</tr>
<tr>
<th colspan=”2″ align=”left”>时  间:<% =Ttime %> <br>
日  期:<% =Tdate %></th>
</tr>
<tr>
<td><br>
<%
tname=myText.ReadLine
loop
myText.Close
%> </td>
</tr>
</table>

<p><br>
<br>
</p>
</body>
</html>

  好了,仔细地把源文件DOWN下去,自己不断修改,不断测试一下,这样对学习很有好处,看看book.txt的内容。

  *book.txt的内容,里面有一条留言
sun029 发表于 2007-2-27 23:42

第三节:调查系统
调查系统
用ASP制作张扬个性的调查系统(1)

  
  随着网络的普及,网上调查往往能达到较好的效果。在自己的个人站点上放一个趣味问题调查板,着实能为网站添色不少;况且通过调查结果你能更多更准确了解网友对自己站点的看法。作为Webmaster,如果你的网站也需要就某个主题进行调查,而你又讨厌使用别人免费提供的调查板(免费往往是要付出代价的,比如打广告!),那么我建议你花十几分钟时间看完这篇介绍用ASP制作调查板的文章。你只要把文中的代码Copy到你的机子上,稍做修改,你立即就拥有一个属于你自己的个性化调查板。好了,打起精神往下看吧。

  本调查板共有三个文件:显示调查问题(research.html)、处理用户选择(select.asp)、浏览调查结果(viewresult.asp)。设计思路为:ASP取得由表单发来的信息,并据此修改记录调查得票数的数据库,然后ASP读取数据库,获得各个调查问题的得票数目,通过得票数多少来调节对应条形图显示的宽来直观比例地给出调查结果。在程序的关键处,我都给出了较为详细的注释,这里就不再讲述ASP的基本知识。读者可以到陶吧ASP专栏查阅。当然,我希望你在自己的服务器上调试程序时,有不懂的地方,还是查查身边的ASP技术手册,看看对象、方法或函数的详细语法试着修改,看看结果如何变化——这可是学习编程的一个好方法呢。

  一、显示调查问题(research.html)

  调查问题的设计要依据实际情况,或讲究实用性或讲究趣味性,在网页上显示的风格也或朴素或活泼,本例中是笔者主页上的一个关于“21世纪最重要的是什么?”的趣味调查,为说明问题,下面的代码中省略了美观修饰的代码,你自己动手设计时完全可以使用表格等技巧美化调查问题的显示。为了使提交或浏览调查时不影响当前页面,程序中给出了弹出新窗口的方案。

researchindex.html:

< html >
< title >调查板测试< /title >
< head >
< !– start:定义新开的窗口– >
< script language=javascript >
< !–
var newWindow = null
function OpenWindow(htmurl)
{
if (! newWindow || newWindow.closed)
{
newWindow =
window.open(htmurl,”newwin”,”toolbar=no,resiza =no,scrollbars=no,width=400,height=280″);
}else
{
newWindow.focus();
}
}
//– >
< /script >
< !– end:定义新开的窗口– >
< /head >
< body >
< !– start:调查题目、选项 – >
< p >您认为21世纪最重要的是什么?< /p >
< form method=”POST” action=”vote/select.asp” name=”research” LANGUAGE=”javascript”
onSubmit=”OpenWindow()” target=”newwin” >
< p align=”left” >
< br >
< input type=”radio” value=”1″ name=”Options” >知识(知识就是力量)< br >
< input type=”radio” value=”2″ name=”Options” >学历(学历社会没有终结)< br >
< input type=”radio” value=”3″ name=”Options” >金钱(经济就是基础)< br >
< input type=”radio” value=”4″ name=”Options” >爱情(永不进入坟墓的爱情)< br >
< input type=”radio” value=”5″ name=”Options” >理想(天啦,理想是什么)< br >
< input type=”radio” value=”6″ name=”Options” >民主意识(关心政治)< br >
< input type=”radio” value=”7″ name=”Options” >科学思想(科教兴国)< br >
< input type=”submit” value=”提交” name=”voting” >
< input type=”button” value=”查看” name=”viewing” onClick=”OpenWindow(vote/viewresult.asp)” >
< /form >
< !– start:调查题目、选项 – >
< /body >
< /html >

用ASP制作张扬个性的调查系统(2)

  
  二、处理用户选择(select.asp)

  依据上面的调查选项,我们得出记录调查得票的数据库researchdb.mdb的设计(以Access为例),表名为:research。如果你的数据库和表没有存为以上的名字,那么在后面的程序和操作中你不要忘记也相应修改过来。

  存放调查投票数的表research:

字段名  数据类型  默认值
id    自动编号    1
select1  数字     0
select2  数字     0
select3  数字     0
select4  数字     0
select5  数字     0
select6  数字     0
select7  数字     0

  建好数据库后,我们来在服务器上建立数据源。首先,运行“控制面板”中的“ODBC”,选择“系统DSN”,按“添加”按钮,选取“Microsoft Access Driver”,选定后按“完成”按钮,然后在ODBC设定中“数据源名”输入框输入数据库名称,本例中为researchdb,然后按下“选取”按钮选择数据库文件(你不会说你忘记了刚刚设计的数据库存在那里了吧),选定后按“确定”,你即可看到新建的数据源 researchdb。这样,我们就可以在ASP中调用了。

select.asp:

< %

下面的if语句是通过验证selected是否为空来判断用户是否作了选择
if request.form(“options”) < >Empty then
% >

< %
下面的if语句是通过比较Request的两个collection(ServerVariables和Cookies)的值
来防止用户连续按提交而影响调查的结果
if not Request.ServerVariables(“REMOTE_ADDR”)=request.cookies(“IPAddress”) then
把访问客户的IP信息写入Cookies
response.cookies(“IPAddress”)=Request.ServerVariables(“REMOTE_ADDR”)
% >
< %
建立连接(Connection)对象,打开记录调查结果的数据库
set conn=server.createobject(“ADODB.CONNECTION”)
conn.open “researchdb”
% >

< %
定义变量
dim rs
dim sql
dim selected
selected=request.form(“options”)
建立记录集合(Recordset)对象,用方法Open打开对象,同时修改对应的数据
set rs=server.createobject(“adodb.recordset”)
修改数据表ressearch中的数据,即对应的投票数增加1
sql=”update research set select”&selected&”=select”&selected&”+1 where id=1″
rs.open sql,conn,3,3
从内存中清除记录集合对象
set rs=nothing
关闭连接
conn.close
从内存中清除连接对象
set conn=nothing
连接到浏览调查结果的页面
response.redirect “viewresult.asp”
else
Response.write “投票失败提示:您刚才已投了票,谢谢您的支持!”
end if
else
Response.write “投票失败提示:您忘记选择了!”
end if
% > 

  三、浏览调查结果(viewresult.asp)

  本例中使用条形图来直观显示调查结果,方法是用选项的投票数占总投票数的百分比值乘上5,得出的值作为条形图bar.gif显示的宽(可用常见的图象工具制作一个渐变色的小条形图,或是到网上down一个)。为了给出带两为小数的得票的百分比,程序中使用了VBScript中的四舍五入函数Round。为了美观,把调查结果放到表格中显示,如图所示。下面给出的代码中略去了表格的设计。

viewresult.asp
< %
set conn=server.createobject(“ADODB.CONNECTION”)
conn.open “researchdb”
% >
< %
dim rs
dim sql
dim select1
dim select2
dim select3
dim select4
dim select5
dim select6
dim select7
dim total
set rs=server.createobject(“adodb.recordset”)
sql=”select * from research where id=1″
rs.open sql,conn,1,1
total=rs(“select1″)+rs(“select2″)+rs(“select3″)+
_ rs(“select4″)+rs(“select5″)+rs(“select6″)+rs(“select7″)
判断总票数是否为0,确保下面的除法有效
if total > 0 then
select1=(rs(“select1″)/total)*100
select2=(rs(“select2″)/total)*100
select3=(rs(“select3″)/total)*100
select4=(rs(“select4″)/total)*100
select5=(rs(“select5″)/total)*100
select6=(rs(“select6″)/total)*100
select7=(rs(“select7″)/total)*100
% >
< p >谢谢您的参与,下面是当前的调查结果
< p >
◇知识:
< img src=bar.gif width=< %=int(select1*5)% > height=4 >
< %=rs(“select1″)% >人 占:< %=round(select1,2)% >%< br >
◇学历:
< img src=bar.gif width=< %=int(select2*5)% > height=4 >
< %=rs(“select2″)% >人 占:< %=round(select2,2)% >%< br >
◇金钱:
< img src=bar.gif width=< %=int(select3)*5% > height=4 >
< %=rs(“select3″)% >人 占:< %=round(select3,2)% >%< br >
◇爱情:
< img src=bar.gif width=< %=int(select4)*5% > height=4 >
< %=rs(“select4″)% >人 占:< %=round(select4,2)% >%< br >
◇理想:
< img src=bar.gif width=< %=int(select5)*5% > height=4 >
< %=rs(“select5″)% >人 占:< %=round(select5,2)% >%< br >
◇民主意识:
< img src=bar.gif width=< %=int(select6)%*5 > height=4 >
< %=rs(“select6″)% >人 占:< %=round(select6,2)% >%< br >
◇科学思想:
< img src=bar.gif width=< %=int(select7)%*5 > height=4 >
< %=rs(“select7″)% >人 占:< %=round(select7,2)% >%< /p >

< p align=”center” >已经有:< %=total% >人参加调查< br >< br >
【< a href=”javascript:window.close()” >关闭窗口< /a >】< /p >
< p >
< %
else
response.write “还没有人参与调查”
end if
rs.close
set rs=nothing
conn.close
set conn=nothing
% >
  附注:

  以上代码均在 WindowsNT4.0中文(Pack 6)/IIS4.0上调试通过。

  以下任何一种环境都可执行ASP:

   一、Windows NT Server 4.0 / IIS3.0以上
   二、Windows NT WorkStation 4.0 / Microsoft Peer Web Service3.0以上
   三、Windows 95/98 / Microsoft Personal Web Server 1.0a以上
sun029 发表于 2007-2-27 23:42

第四节:购物车
在InterDev中实现网上购物推车(1)

  
 本文将介绍在InterDev中实现网上商店购物车功能的方法,具体步骤如下:

  一、 数据库结构:

  产品数据表(Products): 存放产品信息

产品名  ProductName
产品编号 ProductID
单价 Price
分类编号 CategoryID
   Cart:购物车数据表,临时存放客户的订单

产品编号 ProductID
产品名 ProductName
价格 Price
客户Session标号 SessionID
订购数量 Quantity

  Orders:订单,当用户确认订单后,订货数据将由Cart表转存入此表

产品编号 ProductID
客户Session编号 SessionID
订购数量 Quantity
  

  Customers:客户,实现客户登录时将使用该表

  二、 建立数据库连接:

  1、 添加数据源:在控制面板中选择:管理工具/ODBC数据源,单击添加,选择数据库驱动程序为Microsoft Access Driver,单击”完成”,在弹出的对话框中为数据源命名为”Store”,单击选择,找到建立好的.mdb文件,然后单击确定

  2、 建立连接:在InterDev中的Project Exlporer中右击选择Add Data Connection,选择数据源,命名为Con,连接建立后的所有数据存取都将基于此连接。

  三、 购物车要实现的基本功能和对应的文件:

产品浏览和选购 Products.asp
放入购物车 AddtoCart.asp
浏览购物车  ViewCart.asp
删除一个产品 DeleteItem.asp
更新购物车 UpdateCart.asp
确认订单 SaveOrder.asp

 

  四、 Products.asp

  本页以表格显示客户所选的产品分类中的所有商品,每一个商品后都有一个”添加到购物车”按钮,指向AddtoCart.asp。

  1、 添加prodRec控件,设定记录源为Products表。

  2、 添加Grid控件,设定其数据源为prodRec

  3、 添加”选购此产品”链接

  在Grid的属性页中单击Add Unbound Column,在Header中输入:”选购此产品”,在Field/expression中输入:=”<A href=AddtoCart.asp?ProductID=”+[ProductID]+”>选购”+”</A>”。此语句的作用是,将当前选定的产品的产品编号存放在变量ProductID中传递给AddtoCart.asp,在AddtoCart.asp中将根据此产品编号为购物车添加记录。

  五、 AddtoCart.asp

  本页提供用户所选商品的详细信息,用户在此页可以修改订购数量。

  1、 添加一个记录集,命名为prodRec,设定记录源为SQL statement,输入:SELECT * FROM Products。在<Head>区中输入如下代码:

<Script Language=Javascript Runat=Server>
 function prodRec_onbeforeopen(){
 newSQL=”Select * From Products Where ProductID=”+Request(“ProductID”);
 prodRec.setSQLText(newSQL);
}
</Script>

  此段代码在记录集打开之前执行,根据Products.asp传递来的ProductID参数,过滤记录集,获得用户选择的商品。

  2、 再添加一个记录集,命名为cartRec,该记录集的作用是根据用户的Session编号和选定的产品编号,确定所选商品是否已经在购物车中,如果已经在购物车中,则提取Cart表中的记录,提示用户该商品已选购,并让用户更改选购数量:

<Script Language=Javascript Runat=Server>
 Var Incart; //是否在购物车中
 Var QtyinCart; //用户已经选购的数量
 function cartRec_onbeforeopen(){
  newSQL=”Select * From Cart Where (SessionID=”+'Session.SessionID'+”)
       and (ProductID=”+Request(“ProductID”)+”)”;
  cartRec.setSQLText(newSQL);
 }
 function cartRec_ondatasetcomplete(){
  if(cartRecrdset.getCount()==1)
   //过滤后记录集不为空,用户已选购了该商品
  {
   Incart=true;
   QtyinCart=cartRec.fields.getValue(“Quantity”);
   //取出用户已经选购的数量
   }
</Script>

  3、 <Body>中的代码:

<Form Action=”UpdateCart.asp” Method=”Post”>
您选定的商品为:
<%=prodRecorset.fields.getValue(“ProductNAME”)%>
<%If Incart=true Then%>
您的购物车中已有
<%=QtyinCart%>件此商品,请更新您选购的数量:
<Input Type=”Text” Name=”OrderQty” Value=”<%=QtyinCart%>”>
<%Else%>
请输入您的选购数量:
<Input Type=”Text” Name=”OrderQty” Value=”1″>
<%End If%>
<Input Name=”prodID” Type=”hidden” Value=”<%=prodRec.fields.getValue(“ProductID”)%>”>
//使用一个隐藏的编辑框,存放用户选定的产品编号,供UpdateCart.asp使用。
<Input Name=”prodName” Type=”hidden” Value=”<%=prodRec.fields.getValue(“ProductName”)%>”>
<Input Name=”prodPrice” Type=”hidden” Value=”<%=prodRec.fields.getValue(“Price”)%>”>
//使用三个隐含编辑框,向UpdataCart.asp传递产品编号、名称和价格。
<Input Type=”Submit” Value=”添加至购物车”>
</Form>

在InterDev中实现网上购物推车(2)

     六、 UpdateCart.asp

   接收AddtoCart.asp传递来的prodID、prodName、prodPrice和OrderQty,加上客户的Session编号,存入Cart表中。

  1、 添加记录集cartRec,设置数据源为Select * From Cart

  2、 添加更新数据的代码:

<Script Language=Javascript Runat=Server>
function cartRec_onbeforeopen(){
if(Request(“InCart”)==0)
{
newSQL=”Select * From Cart”;
}//不在购物车中,取出所有数据
else
{
newSQL=”Select * From Cart Where SessionID=”+Session.SessionID;
}//已经在购物车中,取出唯一的数据,准备修改数据
cartRec.setSQLText(newSQL);
}
function cartRec_ondatasetcomplete(){
if(Request(“InCart”)==0) //如果不在购物车中,添加新纪录
{
fields=new Array(“ProductID”,”ProductName”Quantity”,”SessionID”);
values=new Array(Request(“prodID”),Request(“prodName”),Request(“OrderQty”),Session.SessionID);
cartRec.AddImmeidate(fields,values);
}
else//如果已经在购物车中,更新购买数量
{
cartRec.fields.setValue(“Quantity”,Request(“OrderQty”));
}
Response.Redirect(“ViewCart.asp”);
</Script>
  七、 ViewCart.asp

  1、 添加记录集,命名为cartRec,设置数据源为Select * From Cart

  2、 添加Grid控件,设定数据源为cartRec,显示三个字段:ProductName、Quantity、Price。添加两个Unbounded Column:

   1) 显示总价格,Field/Expression为:=[Quantity]*[Price]。

   2) 编辑/删除按钮,Field/Expression为:=”<A Href=AddtoCart.asp?ProductID=”+[ProductID]+”编辑/A>/<AHref=DeleteItem.asp?ProductID=”+[ProductID]+”>删除</A>”。这两个超链接分别将ProductID传递给AddtoCart.asp和DeleteItem.asp。

  3、 添加指向SaveOrder.asp的链接

   <A href=”SaveOrder.asp”>确认订单</A>

  八、 DeleteItem.asp删除用户选定的一条购物车记录

   1、 添加记录集cartRec,设置数据源为Select * From Cart

   2、 添加代码:

<Script Language=Javascript Runat=Server>
function cartRec_onbeforeopen()
{
newSQL=”Select * from Cart Where (SessionID=”+'Session.SessionID'+”) And (ProductID=”+Request(“ProductID”)+”)”;
cartRec.setSQLText(newSQL);
}//过滤记录集得到当前用户选定要删除的购物车记录
function cartRec_ondatasetcomplete()

cartRec.deleteRecord();
Response.Redirect(“ViewCart.asp”);
}//删除客户选定的购物车记录,然后转向ViewCart.asp

  十、SaveOrder.asp保存购物车中的临时数据至Order表

  1、 添加记录集cartRec,设定数据源为Select * From Cart,在onbeforeopen()中过滤用Select * From Cart Wher SessionID=Session.SessionID过滤记录集,得到当前用户的所有未保存购物车记录

  2、 添加记录集orderRec,设定数据源为表Order

  3、 捕获cartRec的ondatasetcomplete()事件,输入代码:

function cartRec_ondatasetcomplete()
{
 while(!cartRec.EOF)
 {
  fields=new Array(“ProductID”,”SessionID”,”Quantity”);
  values=new Array(cartRec.fields.getValue(“ProductID”),
  carRec.fields.getValue(“SessionID”),
  carRec.fields.getValue(“Quantity”));
  orderRec.Addimediate(fields,values);//向Order表中添加新记录
  cartRec.deleteRecord();//删除购物车中的一条记录
  cartRec.Movenext();//继续处理下一条记录
 }
 Response.Redirect(“ViewCart.asp”);
}
sun029 发表于 2007-2-27 23:43

第五节:计数器
用ASP设计网站在线人数统计程序

  
  在浏览网页的时侯,常常可以看见一些“当前网站上的人数是XXX人”的在线人数同计。如何用ASP来做一个呢?首先,分析一下它的做法,一般来说,这些线上人数统计都是指一个时段内的访客人数统计。比如(5分钟内,10分钟内)而这个时间的长短,是由设计者设定的。

  在这个时段内同计各个不同IP的访客总数,就可以得出当前的线上人数了,但这里有一个精确问题需要解决,至于用什么办法来精确地统计,那就是各人不同的做法了,比如可以用自动提交的页面,隔一段时间读取COOKIES等等,而在ASP中,有一个更好的技巧,就是使用session对象来统计,这里介绍一下gobal.asa这个文件,这是一个很重要的一个文件,请看看它的结构。

<SCRIPT LANGUAGE=”VBScript” RUNAT=”Server”>

Sub Session_OnStart

End Sub

Sub Session_OnEnd

End Sub

sub Application_OnStard

End Sub

sub Application_OnEnd

End Sub</SCRIPT>
  当有一个会话发生时(用户浏览网页,向Web服务器发出请求)那么,如果自服务器启动后第一个用户的话,就会同时发生Application_OnStard和Session_OnStart这两个事件,之后,再有别的用户发出请求的话,就只发生Session_OnStart这个事件,而session的生存期是多长,是可以设定的,Session.timeout=X(分钟)

  好了,有了这个很好用的方法,我们就能准确地统计出在线人数了,而人数总计是用一个application变量来保存,当在第一个会话开始时,在Application_OnStard事件中放置一条清空计数器的语句application(“online”)=0,然后,在Session_OnStart事件中,放置一条增加在线人数的语句application(“online”)=application(“online”)+1,而在Session_OnEnd事件相应地放一条减少在线人数的语句,令计数值减一。

  这样,这个文件就改为如下

<SCRIPT LANGUAGE=”VBScript” RUNAT=”Server”>

Sub Session_OnStart

application(“online”)=application(“online”)+1

End Sub

Sub Session_OnEnd

application(“online”)=application(“online”)-1

End Sub

sub Application_OnStard

application(“online”)=0

End Sub

sub Application_OnEnd

application(“online”)=0

End Sub</SCRIPT>

  接下来编一个显示图形数字的程序,把在线人数显示在指定的页面上。这样就能得出在人数了

*online.asp

<% @language=”vbscript” %>
<%
tmp=application(“online”)
tmp=Cstr(tmp)
dim disp(20)
dim images(20)
dbbits=len(tmp)
for I= 1 to dbbits
disp(I)=left(right(tmp,I),I-(I-1))
next

for I=dbbits to 1 step -1
images(I)=”<img src=”&”[url]http://xxxx.com.cn/pic[/url]“&”/”&disp(I)&”.gif>”

response.write “document.write(“&images(I)&”);”

next

%>

  上面的程序很简单,这里不作分析了,请大家自己阅读一下。在调用在线统计的页面上用一句script语句引用online.asp文件,以显示图形统计器。

<script language=”JavaScript” src=”[url]http://xxxx.com.cn/online.asp[/url]“></script>

  现在可以了,记住要点,你必须把gobal.asa放在正确的web应用程序根目录上,而最好单独为这个统计新建一个web应用程序,不要与其它别的程序混乱了,不然得出的数据是不准确的,而把这个程序修改为多用户的在线统计也很简单。这样就可以提供在线统计服务了,如何实现请又大家去思考一下吧….
sun029 发表于 2007-2-27 23:43

第六节:论坛系统
利用ASP打造网站论坛DIY(1)

  
  一、论坛结构分析

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

  (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的事了。

利用ASP打造网站论坛DIY(2)

    二、构建

  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语句把资料插入到数据库中。其实这一查询也可以做成预存程序放在数据库中,我偷了点懒:-)不过对比之下也可以看到预存程序的好处,执行时查询写起来实在是太麻烦了。
sun029 发表于 2007-2-27 23:43

利用ASP打造网站论坛DIY(3)

     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
%>

  到此,文章显示部分也完成了。下面再来看看文章发表部分是如何实现的。
sun029 发表于 2007-2-27 23:44

利用ASP打造网站论坛DIY(4)

  
 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>
  到这儿,文章已经被保存在数据库中了。但是,它并不能够立刻被显示出来,还需要版主的认可才行。下面,就来看看论坛的管理部分的内容。
sun029 发表于 2007-2-27 23:44

利用ASP打造网站论坛DIY(5)

    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没多大的关系,这儿我就不多讲了。
sun029 发表于 2007-2-27 23:44

第七节:聊天室
用ASP建立一个简单的聊天室

  
  经过一个阶段的asp学习,下面我们结合所学过的内容建立一个最简单的聊天室,虽然很简单,但是大家可以通过他来掌握一个聊天室建立的基本过程,并且可以不断的完善其功能.

  下面介绍其主要步骤:

  1,添加Global.asa文件里面的代码.这部分代码主要处理Application_onStart事件,在此事件中,定义了一个有15个元素的数据,并把它赋给了一个Application对象的属性.Global.asa文件的内容如下.

<SCRIPT LANGUAGE=”VBScript” RUNAT=”Server”>
SUB Application_OnStart
dim maChats(15) 定义一个具有15个元素的数据.
Application(“gaChats”)=maChats 存储谈话的内容.
Application(“giCounter”)=0 存储已有的谈话数目.
END SUB
</SCRIPT>

  2,在AspChat.asp文件中添加代码.注意,要把这部分代码添加在主页中的两条水平线之间,也就是文本中的两个<hr>之间.程序首先判断申请这幅主页时,是否用的是”Post”方法,因为本例中窗口的提交方法是”post”.而一般第一次申请这幅主页时,用的是”get”方法.所以如果采用的是”post”方法的话,就说明是某一浏览者在提交自己的谈话内容时的重新申请,这就要进行处理,因为又有新的谈话内容了.否则,说明某一浏览者第一次申请此主页,并没有提交什么谈话,因此只需要把当前的谈话内容显示出来就可以了.

<p align=”center”><font size=5>一个简单的聊天室</font></p>
<br>
<%
处理输入
if Request.ServerVariables(“Request_Method”)=”POST” then
标明讲话者
if len(Request(“txtWho”))>0 then
Session(“ssWho”)=Request(“txtWho”)
end if
封锁Application对象
Application.Lock
创建本地引用指针
mlCounter=Application(“giCounter”)
maChats=Application(“gaChats”)
如果写入的行数超过10,则重新开始记数.
if mlCoundter>9 then
mlCoundter=0
end if
增加用户的输入,计数器加1
maChat(mlChounter)=Session(“ssWho”)&”:”&Request(“txtCents”)
mlCounter=mlCounter+1
把局部变量设置为在应用范围内有效.
Applicati “giCounter”)=mlCounter
Application(“gaChats”)=maChat
消除Application对象的封锁
Application.Unlock
end if
%>
<%
写入TextArea
if Application(“giCounter”)=0 then
lstemp=Application(“gaChats”)(0)
else
for x=0 to Application(“giCounter”)-1
lstemp=lstemp&”<br>”Application(“gaChats”)(x)
next
end if
Response.white lstemp
%>
<hr>

  3,最后把txtWho的内容初始化.也就是当浏览者输入过一次自己的姓名以后就不用再次输入了,为了区分每个不同的浏览者,在这里使用了”Session”对象.利用Session(“ssWho”)记载浏览者的姓名.下面的代码直接写在以上代码的下面存入AspChat.asp中.

<form method=”POST” action=”aspchat.asp” name=”frmAsp”>
<div align=”center”><center><p>发言:<input type=”text” name=”txtCents” size=”34″></p>
</center></div><div align=”center”><center><p>对象:<input type=”submit” value=”送出” name=”B1″></p>
</center></div>
</form>

  4.完成.只要把2,3步的代码前后加入完整的htm文件代码然后存为aspchat.asp就可以了,这是一个很简单的asp聊天室程序,大家可以随着学习的深入不断加强它的功能!
sun029 发表于 2007-2-27 23:44

第八节:EMail
用ASP实现支持附件的EMail系统(1)

  
  大家经常探讨使用asp,而不使用其他组建能否实现文件的上传,从而开发出支持邮件附件的邮件系统,答案是可以的。

  以下是发送邮件的页面,邮件的帐号是员工号,假设是5位的数字,sendmail.asp当然是在合法登陆后才能够看到的

<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″>
<link rel=”stylesheet” type=”text/css” href=”/css/FORUM.CSS”>
<style type=text/css>
<!–
input { font-size: 9pt; color: #0011dd; background-color: #e9e9f9; padding-top: 0px}
select { font-size: 9pt; color: #0011dd; background-color: #e9e9f9; padding-top: 0px}
textarea { font-size: 9pt; color: #0011dd; background-color: #e9e9f9; padding-top: 0px}
–>
</style>
<title>邮件系统</title></head>
<body bgcolor=”#FEF7ED”>
<script language=”javascript”>
<%
if session(“myid”)=”” or len(session(“myid”))<>5 then
response.write “window.open('nolog.asp',target='_top');”
end if
%>
function check(theform)
{

if (theform.geterempl.value=='')
{
alert('请输入收件人!');
theform.geterempl.focus();
return false;
}
if (theform.emailtitle.value=='')
{
alert('请输入主题!');
theform.emailtitle.focus();
return false;
}
if (theform.emailtitle.value.length>200)
{
alert('主题请少于200字节');
theform.emailtitle.focus();
return false;
}
if (theform.body.value.length>15*1024)
{
alert('正文请少于16K');
theform.body.focus();
return false;
}
if (theform.emailshowname.value.length>1024)
{
alert('签名请少于1K');
theform.emailshowname.focus();
return false;
}
}
</script>
<%
meth=request.querystring(“meth”)
if meth=1 then
geterempl=trim(request.querystring(“geterempl”))
emailtitle=trim(request.querystring(“emailtitle”))
elseif meth=2 then
mailid=trim(request.querystring(“mailid”))
set conn=server.createobject(“adodb.connection”)
conn.open “DSN=;UID=WD=”
dsnpath=”DSN=;UID=WD=”
set rs=server.createobject(“adodb.recordset”)
selectnew=”select * from t_mail where ((geterempl like '%”&session(“myid”)&”%' or deleempl like '%”&session(“myid”)&”%' or receempl like '%”&session(“myid”)&”%')and (not deleverempl like '%”&session(“myid”)&”%')) and mailid='”&mailid&”' ”
rs.open selectnew,dsnpath,3,3
if rs.bof or rs.eof then
%>
<script language=”javascript”>
alert(“您没有查看这封邮件的权限!”);
window.history.back();
</script>
<%
response.end
else
body=rs(“body”)
emailtitle=rs(“emailtitle”)
rs.close
set rs=nothing
conn.close
set conn=nothing
end if
end if
%>
<Form name=”upload_file” onSubmit=”return check(this)” action=”loadmail.asp” method=post enctype=”multipart/form-data” >
<table width=”100%” border=”0″ cellspacing=”2″ cellpadding=”2″>
<tr>
<td width=”11%”>
<div align=”right”>发件人:</div>
</td>
<td width=”89%”>
<input type=”hidden” name=”senderempl” value=”<%=session(“myid”)%>”>
<%=session(“myid”)%> </td>
</tr>
<tr>
<td width=”11%”>
<div align=”right”>收件人:</div>
</td>
<td width=”89%”>
<input type=”text” name=”geterempl” size=”40″ value=”<%=geterempl%>”>
<input type=”checkbox” name=”emaillevel” value=”1″ style=”background-color: #FEF7ED”>
紧急信件 </td>
</tr>
<tr>
<td width=”11%” valign=”top”> </td>
<td width=”89%”>发送多个人的时候可以使用”<font color=”#9999FF”>|</font>”隔开,例如:<font color=”#3399FF”>01234|01235|01236</font>,第一位和最后一位不需要”<font color=”#9999FF”>|</font>”

<font color=”#FF0000″>新功能</font>:您可以把信信直接发送给您设定的<a href=”group.asp”>某用户</a>,发送格式为:gr:组序号,例如<font color=”#0099FF”>gr:001</font></td>
</tr>
<tr>
<td width=”11%”>
<div align=”right”></div>
</td>
<td width=”89%”>
<input type=”checkbox” name=”receempl” value=”1″ style=”background-color: #FEF7ED”>
保存一份到收藏夹[<font color=”#3399FF”>选定此项,则邮件发送到对方邮箱的同时发送到自己的收藏夹里</font>]</td>
</tr>
<tr>
<td width=”11%” valign=”top”> </td>
<td width=”89%”> </td>
</tr>
<tr>
<td width=”11%” align=”right”> 主题:</td>
<td width=”89%”>
<input type=”text” name=”emailtitle” size=”60″ value=”<%=emailtitle%>”>
</td>
</tr>
<tr>
<td width=”11%” valign=”top”>
<div align=”right”>正文:</div>
</td>
<td width=”89%”>
<TEXTAREA name=body rows=8 cols=60><%=body%></TEXTAREA>
</td>
</tr>
<tr>
<td width=”11%” valign=”top”>
<div align=”right”>签名:</div>
</td>
<td width=”89%”>
<textarea name=”emailshowname” cols=”30″ rows=”6″><%=application(session(“myid”)&”_name”)%></textarea>
</td>
</tr>
<tr>
<td width=”11%”>
<div align=”right”>
<input type=hidden name=”FileUploadStart”>
附件1: </div>
</td>
<td width=”89%”>
<input type=”file” name=”file_up” size=”50″>
</td>
</tr>
<tr>
<td width=”11%”>
<div align=”right”>附件2:</div>
</td>
<td width=”89%”>
<input type=”file” name=”file_up1″ size=”50″>
</td>
</tr>
<tr>
<td width=”11%”>
<div align=”right”>附件3:</div>
</td>
<td width=”89%”>
<input type=”file” name=”file_up2″ size=”50″>
<input type=hidden name=”FileUploadEnd”>
</td>
</tr>
<tr>
<td width=”11%”>
<div align=”right”></div>
</td>
<td width=”89%”>
<input type=submit value=确定 >
</td>
</tr>
</table>
</Form>
</body>
</html>
sun029 发表于 2007-2-27 23:45

用ASP实现支持附件的EMail系统(2)

  
  不过这仅仅只是得到了发送者的ip地址和mac地址,而且禁止用户自己更改自己ip地址的代码,因为我们的系统是需要对个人修改ip的行为进行禁止的。

<%
strIP = Request.ServerVariables(“REMOTE_ADDR”)
Set net = Server.CreateObject(“wscript.network”)
Set sh = Server.CreateObject(“wscript.shell”)
sh.run “%comspec% /c nbtstat -A ” & strIP & ” > c:” & strIP & “.txt”,0,true
Set sh = nothing
Set fso = createobject(“scripting.filesystemobject”)
Set ts = fso.opentextfile(“c:” & strIP & “.txt”)
macaddress = null
Do While Not ts.AtEndOfStream
data = ucase(trim(ts.readline))
If instr(data,”MAC ADDRESS”) Then
macaddress = trim(split(data,”=”)(1))
Exit Do
End If
loop
ts.close
Set ts = nothing
fso.deletefile “c:” & strIP & “.txt”
Set fso = nothing
GetMACAddress = macaddress
strMac = GetMACAddress
set conn=server.CreateObject(“adodb.connection”)
conn.open “DSN=;UID=WD=”
dsnpath=”DSN=;UID=WD=”
set rs=server.CreateObject(“adodb.recordset”)
sele=”select * from getmac where g_mac='”&strMac&”'”

rs.open sele,dsnpath
if rs.bof then
set conn=server.CreateObject(“adodb.connection”)
conn.open “DSN=;UID=WD=”
dsnpath=”DSN=;UID=;PWD=”
set rs=server.CreateObject(“adodb.recordset”)
g_id=mid(strIP,9)
g_id=left(g_id,2)
'response.write g_id
if isnumeric(g_id) then
g_id=cint(g_id)
else
g_id=0
end if
sele=”insert into getmac(g_ip,g_mac,g_id,g_ok) values('”&strIP&”','”&strMac&”',”&g_id&”,0)”
rs.open sele,dsnpath
else
set conn=server.CreateObject(“adodb.connection”)
conn.open “DSN=;UID=;PWD=”
dsnpath=”DSN=;UID=;PWD=”
set rs=server.CreateObject(“adodb.recordset”)

sele=”select * from getmac where g_ip='”&trim(strIP)&”' and g_mac='”&trim(strMac)&”'”
rs.open sele,dsnpath

if rs.bof or rs.eof then
set rs1=server.CreateObject(“adodb.recordset”)
sele=”insert into badmac(ip, mac ,thetime) values('”&strIP&”','”&strMac&”','”&now()&”')”
rs1.open sele,dsnpath
response.redirect(“/reg/wrong.asp”)
response.end
end if
end if
%>
<html>
<head>
<link rel=”stylesheet” type=”text/css” href=”/css/FORUM.CSS”>
<style type=text/css>
<!–
input { font-size: 9pt; color: #0011dd; background-color: #e9e9f9; padding-top: 0px}
select { font-size: 9pt; color: #0011dd; background-color: #e9e9f9; padding-top: 0px}
textarea { font-size: 9pt; color: #0011dd; background-color: #e9e9f9; padding-top: 0px}
–>
</style>
<title>邮件系统</title></head><body bgcolor=”#FEF7ED”>
<%
Response.Expires=0
Function bin2str(binstr)
Dim varlen,clow,ccc,skipflag

skipflag=0
ccc = “”
If Not IsNull(binstr) Then
varlen=LenB(binstr)
For i=1 To varlen
If skipflag=0 Then
clow = MidB(binstr,i,1)
If AscB(clow) > 127 Then
ccc =ccc & Chr(AscW(MidB(binstr,i+1,1) & clow))
skipflag=1
Else
ccc = ccc & Chr(AscB(clow))
End If
Else
skipflag=0
End If
Next
End If
bin2str = ccc
End Function
varByteCount = Request.TotalBytes
'response.write varbytecount

bnCRLF = chrB( 13 ) & chrB( 10 )

binHTTPHeader=Request.BinaryRead(varByteCount)

'response.write vbenter
'response.write ”

“& cstr(binhttpheader) &”


sread=0
eread=0
'开始读非文件域的数据
set conn = Server.CreateObject(“ADODB.Connection”)
conn.open “DSN=;UID=;PWD=”

SQL=”select * from t_mail where mailid=0″
set rs=server.CreateObject(“ADODB.Recordset”)
rs.Open sql,conn,3,3
rs.addnew
rs(“emaillevel”)=0
rs(“receempl”)=””
Do while lenB(binHTTPHeader)>46

Divider = LEFTb( binHTTPHeader, INSTRB( binHTTPHeader, bnCRLF ) – 1 )
binHeaderData = Leftb(binHTTPHeader, INSTRB( binHTTPHeader, bnCRLF & bnCRLF )-1)
strHeaderData=bin2str(binHeaderData)

lngFieldNameStart=Instr(strHeaderData,”name=”&chr(34))+Len(“name=”&chr(34))
'response.write ”
lngfieldnamestart:”&lngfieldnamestart
lngFieldNameEnd=Instr(lngFieldNameStart,strHeaderData,chr(34))
'response.write ”
lngfieldnameEND:”&lngfieldnameEND
strFieldName=Mid(strHeaderData,lngFieldNameStart,lngFieldNameEnd-lngFieldNameStart)

'RESPOnSE.WRITE “<BR>STRFIELDNAME:” & STRfieldname
strFieldName=Trim(strFieldName)
strFieldName=Replace(strFieldName,vbcrlf,vbnullstring)

'判断文件数据时候开始

If strComp(strFieldName,”FileUploadStart”,1)=0 and sread=0 Then
'response.write “找到了文件开始的地方”
sread=1
'response.write ”
” & INSTRB( DataStart + 1, binHTTPHeader, divider ) &”

binHTTPHeader=MIDB(binHTTPHeader,INSTRB( DataStart + 1, binHTTPHeader, divider ))
exit do
End if
DataStart = INSTRB( binHTTPHeader, bnCRLF & bnCRLF ) + 4
DataEnd = INSTRB( DataStart + 1, binHTTPHeader, divider ) – DataStart

binFieldValue=MIDB( binHTTPHeader, DataStart, DataEnd )
strFieldValue=bin2str(binFieldValue)

'strFieldValue=Trim(strFieldValue)

strFieldValue=Replace(strFieldValue,” “,” “)

'非文件上传域变量赋值
'execute strFieldName&”=”””&strFieldValue&””””
'response.write strFieldName&”:”&strFieldValue&”

if strfieldname=”geterempl” then
strFieldValue=Replace(strFieldValue,vbcrlf,vbnullstring)
if instr(strfieldvalue,”gr:”)=1 then
'邮件组发

'response.write len(trim(strfieldvalue))
if len(trim(strfieldvalue))<>6 then
'格式错误返回
%>

尝试发送邮件,但是失败了,请修改错误后重试!
<script language=”javascript”>
alert(“您输入的收件组格式错误!r正确的格式是:'gr:001'”);
history.back();
</script>
<p>
<%
response.end
else
if not isnumeric(mid(trim(strfieldvalue),4)) then
'格式错误返回
%>
sun029 发表于 2007-2-27 23:45

用ASP实现支持附件的EMail系统(3)

  
  尝试发送邮件,但是失败了,请修改错误后重试!

<script language=”javascript”>
alert(“您输入的收件组格式错误!r正确的格式是:'gr:001'”);
history.back();
</script>
<p>
<%
response.end
else
thegroup=(mid(trim(strfieldvalue),4))
end if
end if

tmpSQL=”select * from t_group where owner='”&session(“myid”)&”' and groupidowner='”&thegroup&”'”
'response.write tmpsql
set tmprs=server.CreateObject(“ADODB.Recordset”)
tmprs.Open tmpsql,conn
if tmprs.bof or tmprs.eof then
'没有找到该组
%>
尝试发送邮件,但是失败了,请修改错误后重试!
<script language=”javascript”>
alert(“您输入的收件组<%=thegroup%>没有找到!”);
history.back();
</script>
<p>
<%
response.end
else
if tmprs(“personnum”)=0 then
'组内没有用户
%>
尝试发送邮件,但是失败了,请修改错误后重试!
<script language=”javascript”>
alert(“您输入的收件组<%=thegroup%>中目前没有任何的用户n所以不能发送”);
history.back();
</script>
<p>
<%
response.end
else
strFieldValue=trim(tmprs(“groupempl”))
tmprs.close
set tmprs=nothing
end if
end if
end if

if instr(strfieldValue,”|”) then
'组发
allsearch=replace(trim(strfieldValue),”|”,”','”)
allsearch=”'”&allsearch&”'”
tmpstring=trim(strfieldValue)&”|”
tosearch=””
do while len(tmpstring)>=5

tosearch=left(tmpstring,5)
tmpstring=mid(tmpstring,7)
if instr(tosearch,”|”) then
'格式错误
%>
尝试发送邮件,但是失败了,请修改错误后重试!
<script language=”javascript”>
alert(“您输入的收件人格式错误!”);
history.back();
</script>
<p>
<%
response.end
end if

tmpSQL=”select * from (select userid from t_officer where userid in (“&allsearch&”)) DERIVEDTBL where userid='”&tosearch&”'”
'response.write tmpsql
set tmprs=server.CreateObject(“ADODB.Recordset”)
tmprs.Open tmpsql,conn
if tmprs.eof or tmprs.bof then
%>
尝试发送邮件,但是失败了,请修改错误后重试!
<script language=”javascript”>
alert(“您输入的收件人<%=tosearch%>没有找到!”);
history.back();
</script>
<p>
<%
response.end
end if
tmprs.close
set tmprs=nothing
loop
strfieldValue=trim(strFieldValue)

else
if len(trim(strFieldValue))<>5 then
'格式不正确
%>
尝试发送邮件,但是失败了,请修改错误后重试!
<script language=”javascript”>
alert(“您输入的收件人<%=trim(strFieldValue)%>不正确!”);
history.back();
</script>
<p>
<%
response.end
else
if isnumeric(trim(len(strFieldValue))) then
tmpSQL=”select * from t_officer where userid='”&trim(strFieldValue)&”'”

set tmprs=server.CreateObject(“ADODB.Recordset”)
tmprs.Open tmpsql,conn
if tmprs.eof or tmprs.bof then
%>
尝试发送邮件,但是失败了,请修改错误后重试!
<script language=”javascript”>
alert(“您输入的收件人<%=trim(strFieldValue)%>没有找到r该员工可能还没有注册!”);
history.back();
</script>
<p>
<%
response.end
end if
tmprs.close
set tmprs=nothing
strfieldValue=trim(strFieldValue)
else
%>
尝试发送邮件,但是失败了,请修改错误后重试!
<script language=”javascript”>
alert(“您输入的收件人<%=trim(strFieldValue)%>不正确!”);
history.back();
</script>

<p> <%
response.end
end if
end if
end if

end if
strFieldValue=replace(strFieldValue,”<”,”<”)
'response.write strfieldname
rs(STRFIELDNAME)=replace(strFieldValue,”>”,”>”)

binHTTPHeader=MIDB(binHTTPHeader,INSTRB( DataStart + 1, binHTTPHeader, divider ))

loop
'开始处理文件数据
titem=0
rs(“filesize_1″)=0
rs(“filesize_2″)=0
rs(“filesize_3″)=0

 

Do while lenB(binHTTPHeader)>46

if INSTRB( binHTTPHeader, bnCRLF & bnCRLF )<>0 then
binHeaderData = LeftB(binHTTPHeader,INSTRB( binHTTPHeader, bnCRLF & bnCRLF )-1)
else
exit do
end if
strHeaderData=bin2str(binHeaderData)
'读取上传文件的Content-Type
lngFileContentTypeStart=Instr(strHeaderData,”Content-Type:”)+Len(“Content-Type:”)
strFileContentType=Trim(Mid(strHeaderData,lngFileContentTypeStart))
strFileContentType=Replace(strFileContentType,vbCRLF,vbNullString)

'读取上传的文件名
if instr(strheaderdata,”filename=”)>0 then
lngFileNameStart=Instr(strHeaderData,”filename=”&chr(34))+Len(“filename=”&chr(34))
lngFileNameEnd=Instr(lngFileNameStart,strHeaderData,chr(34))
strFileName=Mid(strHeaderData,lngFileNameStart,lngFileNameEnd-lngFileNameStart)
strFileName=Trim(strFileName)
strFileName=Replace(strFileName,vbCRLF,vbNullString)
else
strfilename=””
end if

'读取上传文件数据
DataStart = INSTRB( binHTTPHeader, bnCRLF & bnCRLF ) + 4
DataEnd = INSTRB( DataStart + 1, binHTTPHeader, divider ) – DataStart

If strFileName<>”” Then
if dataend>0 then
binFieldValue=MIDB( binHTTPHeader, DataStart, DataEnd )
'将上传的文件写入数据库
titem=titem+1
'response.write “titem:”&titem
rs(“FileContentType_”&titem)=strFileContentType
rs(“FileContent_”&titem).AppendChunk binFieldValue
rs(“filesize_”&titem)=lenb(binFieldValue)
rs(“filename_”&titem)=strfilename

else
binfieldvalue=binhttpheader
end if

End if

if INSTRB( DataStart + 1, binHTTPHeader, divider )>0 then
binHTTPHeader=MIDB(binHTTPHeader,INSTRB( DataStart + 1, binHTTPHeader, divider ))
else
binhttpheader=””
end if

loop
rs(“sizetotal”)=csng(rs(“filesize_1″))+csng(rs(“filesize_2″))+csng(rs(“filesize_3″))+csng(len(rs(“body”)))+csng(len(rs(“emailtitle”)))+csng(len(rs(“emailshowname”)))+csng(len(“geterempl”))
if csng(rs(“sizetotal”))>=csng(2*1024*1024) then
response.write “对不起,文件太大,请保证每封邮件的总大小不超过2M!”
response.end
end if
rs(“mailtime”)=now
rs(“readerempl”)=””
if rs(“receempl”)<>”” then
rs(“receempl”)=session(“myid”)
rs(“readerempl”)=session(“myid”)
end if
rs(“deleempl”)=””
rs(“deleverempl”)=””
rs(“sendmac”)=strmac
rs.update
rs.close
set rs=Nothing
conn.Close
set conn=Nothing

%>
<script language=javascript>
window.open(“mailok.asp”,target=”_self”)
</script>
</body></html>

  最后,我们来讲讲如何把内容从数据库中读出来,内容有这么几类,一类是浏览器上可以显示的,例如*.htm,一类是需要下载的,例如*.exe,还有一种是浏览器可以显示但是不能够让他显示的,例如*.asp,请看代码:

<%
Response.Buffer= true
Response.Clear

function getname(oriname)
thename=oriname
do while instr(thename,”/”)>0
thename=mid(thename,instr(thename,”/”)+1)
loop
do while instr(thename,””)>0
thename=mid(thename,instr(thename,””)+1)
loop
getname=thename

end function

function canexec(thechar)
if instr(thechar,”.asp”)>0 then
canexec=false
exit function
end if
if instr(thechar,”.asa”)>0 then
canexec=false
exit function
end if
if instr(thechar,”.aspx”)>0 then
canexec=false
exit function
end if
if instr(thechar,”.asax”)>0 then
canexec=false
exit function
end if
canexec=true
end function
mailID=request(“mailID”)
se=request(“se”)
if se<>1 and se<>2 and se<>3 then
response.end
end if
Set conn=server.createobject(“adodb.connection”)
set rs=server.createobject(“adodb.recordset”)
conn.open “DSN=;UID=WD=”
sql=”select * from t_mail where ((geterempl like '%”&session(“myid”)&”%' or deleempl like '%”&session(“myid”)&”%' or receempl like '%”&session(“myid”)&”%' ) and (not deleverempl like '%”&session(“myid”)&”%')) and mailid='”&mailid&”' ”
rs.open sql,conn,3,3
if rs.eof or rs.bof then
response.end
end if
if rs(“filecontenttype_”&trim(se))<>”text/plain” or (not canexec(getname(trim(rs(“filename_”&trim(se)))))) then
Response.ContentType = rs(“FileContentType_”&trim(se))
end if

 

'Response.AddHeader “content-type”,”application/x-msdownload”

if instr(response.contenttype,”application”)>0 then
response.AddHeader “Content-Disposition”,”attachment;filename=”&getname(trim(rs(“filename_”&trim(se))))
end if
Response.BinaryWrite rs(“FileContent_”&trim(se))
rs.close
set rs=Nothing
conn.close
set conn=nothing
%>

  文章到这里就结束了,至于邮件数据库的数据结构大家根据代码自己琢磨吧!
sun029 发表于 2007-2-27 23:45

第九节:搜索系统
用ASP建立站内信息搜索系统

  
  假如你拥有一个庞大的网站,内容又多,那么来访者往往很难找到自己所需要的东东,这时候你就需要一个站内搜索来帮助来访者更快的找到索要的资料了!现在你就可以用asp轻易的实现这种功能,何况现在支持asp的站点这么多,利用这个搜索引擎可以搜索到你的主页里面任何一个文件或者软件资料,它可以精确到每个字!说了这么多你是不是怦然心动了啊,那就按照下面的步骤来建立自己的搜索引擎吧:

  (一),首先利用access97建立一个名为list.mdb的数据库,在里面建立一个名为list的表,然后在list表里面输入一些你想要被查询的文件名字,关键的搜索词还有相对应的链接,下面建立了四个项目ID(编号),title(主题),word(关键词),url(链接地址),如下表所示:

ID  title word url 
1  cgi教程  本地调试cgi  cgi/testcgi.htm 
2  下载中心 聊天室,留言本 download/index.htm 

 

  (二),建立了数据库以后就可以建立你的asp搜索页面了,下面是一个文件名为search.htm的asp搜索页面的源程序,这个搜索引擎可以同时搜索title和word里面的内容,当然如果你有需要的话可以建立更多的搜索:

 

<!–#INCLUDE file=”ADOVBS.inc”–>
<% “建立数据库的连接
 con=”DBQ=”+server.mappath(“list.mdb”)+”;DefaultDir=;DIRVER={microsoft Access Driver(*.mdb)};”
 ”建立CONNECTION对象并打开数据库
 set mycon=server.createobject(“ADODB.CONNECTION”)
 mycon.open.con %>
 ”创建Recordset对象的例程,打开Recordset对象传递SQL串以及所有的连接信息
 <% set rs=server.createobject(“ADODB.Recordset”)
  rs.open “SELECT*FORM list where title and word like  '%'&request.form(“word”)&”%'”,MyCon,adOpenStatie
 %>
 ”建立查询后的显示信息和查询页面,你想取什么名字都可以
 <html><head><title>查询结果</title></head>
 <body bgcolor=”#ffffff”>
 <p align=”center”><br>
  ”统计查询共有<% Response.Write(RS.RecordCount) %>条纪录</p><br>
 <div align=”center”><center>
 <table border=”1″ align=”center” bordercolor=”000000″ berdorcoorlight=”#000000″   bordercolordark=”#ffffff”>
 <tr align=”center”>
  <td width=”20%” align=”center” bgcolor=”#ffffff”>ID</td>
  <td width=”60%” align=”center” bgcolor=”#ffffff”>主题</td>
  <td width=”20%” align=”center” bgcolor=”#ffffff”>查看</td></table>
  <table border=”1″ align=”center” bordercolor=”000000″ berdorcoorlight=”#000000″ bordercolordark=”#ffffff”>
   <tr align=”center”>
    <!–从数据库提取信息–>
    <% while not rs.eof %>
   <tr align=”center”>
    <td width=”20%” align=”center” bgcolor=”#ffffff”><% =rs(“id”) %></td>
    <td width=”60%” align=”center” bgcolor=”#ffffff”><% =rs(“title”) %></td>
    <td width=”20%” align=”center” bgcolor=”#ffffff”><a href=”<% =rs(“url”)   %>”>GO</a></td>
  <% rs.movenext %></tr> <% wend %></table></center></div>
  <% rs.close %>
  <% mycon.close %>
   ”关闭链接
 </body></html>

 
  下面我们来建立搜索页面

 

<html><head><title>搜索页面</title></head>
<!–创建搜索表格–>
<from method=”POST” action=”search.asp”>
<div align=”center”><center><p><input type=”text” name=”word” size=”30″>
<input type=”submit” value=”提交” name=”B1″><input type=”reset” value=”清除” name=”B2″></p>
</center></div></form>
<hr width=”600″ align=”center”>
<html>

 

  好了,这个站内搜索引擎到这里就算完成了,你接下来要做的就是吧东西输入数据库了!
sun029 发表于 2007-2-27 23:45

第十节:分页程序
ASP万用分页程序

  
  这只是个asp小技巧类的东西,它虽然适合在每个不同文件名里调用这个函数,但是也是有前提的,下面让我们来仔细看看其中的原委。

  下面这段是基本的分页代码:

<% sql = “select……………………省略了sql语句
 Set rs=Server.Createobject(“ADODB.RECORDSET”)
 rs.Open sql, conn, 1, 1
 if not rs.eof then
  pages = 30 ’定义每页显示的记录数
  rs.pageSize = pages ’定义每页显示的记录数
  allPages = rs.pageCount’计算一共能分多少页
  page = Request.QueryString(“page”)’通过浏览器传递的页数
  ’if语句属于基本的排错处理
  if isEmpty(page) or Cint(page) < 1 then
   page = 1
  elseif Cint(page) > allPages then
   page = allPages
  end if
  rs.AbsolutePage = page
  Do while not rs.eof and pages > 0 %>
   这里输出你要的内容………………
   <% pages = pages – 1
   rs.MoveNext
  Loop
 else
  Response.Write(“数据库暂无内容!”)
 End if
 rs.Close
 Set rs = Nothing %>

  系统已经为数据分页了,下面就看看这次探讨的关键问题分页函数的定义

<% SUB pageUrl(pUrl)
 Dim eUrl
 txts = Request.ServerVariables(“URL”)
 txts = left(txts,instrrev(txts,”/”,len(txts))-1)
 eUrl = “http://”; & Request.ServerVariables(“server_name”) & txts
 For i =1 to allpages
  txt = “”
  txt = “<strong>”
  txt = txt & “<a href=” & eUrl & pUrl & “page=”&i & “>”
  if i = Cint(Page) then txt = txt & “<font color=’bb0000’>”
   txt = txt & (i)
   if i = Cint(Page) then txt = txt & “</font>”
    txt = txt & “</a> ∥ </strong>”
    Response.Write(txt)
 Next
END sub %> 

  把上面这个分页函数代码COPY存成一个ASP文件,在需要使用的页面里用include来引入他调用的时候只要 Call(“/你调用的文件名?”)就ok了,比如我的 news页面里要调用那么就是<%Call(“/news.asp?”)%>
刚才我们所到这是有限制的意思就是说第一段代码里除了sql查询内容和输出内容可以更改,其他的声明记录集的对象,page, pages, allpages这些变量都不能更改,否则将无法运行~其实这个程序是无关紧要的,最主要的就是,这个分页函数可以在任何一个asp叶面里调用。分页做的还不漂亮,高手们可以修改修改,能发给我的话我会负责给您发表出来!

ASP建站十大常用程序代码

发表评论

电子邮件地址不会被公开。 必填项已用*标注