您的位置:首页网页设计ASP实例 → 用ASP学做一个在线调查

用ASP学做一个在线调查

时间:2004/11/7 3:03:00来源:本站整理作者:蓝点我要评论(2)

  关于在线调查大家一定不会陌生吧,给出一个问题和数个答案,让用户填写,然后把结果保存到数据库,自动进行统计,最后给出个统计的图。这期的跟我学做就来做一个在线调查系统。


  一、功能设计


  这么简单的系统也要做功能设计?有的人也许会觉得奇怪,不过话说回来不管怎么样的系统,先做功能设计总是能对系统有个比较清析的了解。让我们来看看在线调查的功能吧。基本的功能上面已经说了,就是要给出一个问题和数个答案,然后统计,最后给出图。在这个基础上,我们可以考虑给一个调查加上一个时间段(有效期),在这个时间段里调查是有效的,过了这段时间就自动结束这个调查。另外,我们可以指定一个用户一次只能提交一次答案。如果你要限制得更多,可以指定一个IP只能提交一次答案,不过,这样可能一个网吧里的人只能有一个提交了。对于调查里的问题,有些可能是单选题,而有些可能是多选 题。最后来说说统计的图,在统计图里要给出答案、每个答案的投票人数,并要显示出每个答案投票数所占的比例。一般用横的图就可以了,也比较容易实现,当然,如果你要改成竖的,也可以。


  现在根据上面总结出在线调查的功能如下:


  1、数据保存在ACCESS 2000 数据库中;


  2、每个用户一次访问可以投票一次


  3、给出每个调查的统计情况,用统计图来显示


  4、每个调查都有个有效期,过期后自动结束。结束了的调查只能查看结果。


  5、管理员可以增加调查,修改调查的答案(增加、修改、删除,修改类型)。


  6、对于已经结束的调查,管理员只能删除调查,而不能修改答案。


  7、只有一个管理员(单用户)


  二、数据库设计


  现在来设计数据库,根据功能要求,至少要有三个表,一是管理员表,二是调查表,三是调查结果表。数据库文件名为survey.mdb 可以改为.asp 如果改的话,请在ASP程序中作相应的修改。


表一、 管理员表 表名: manage
-----------------------------------------------------------------
字段 类型 长度 说明
-----------------------------------------------------------------
manage_id 自动编号 - 在这里没用到,日后扩展用
manage_username 文本 15 管理员用户名
manage_password 文本 15 管理员密码
-----------------------------------------------------------------


  建立manage表后加入一条新记录,填入你的管理员用户名和密码,在这里填入的是xmxoxo


表二、 调查表 表名: survey
-----------------------------------------------------------------
字段 类型 长度 说明
-----------------------------------------------------------------
survey_id 自动编号 - 递增、主键、有索引无重复
survey_question 文本 255 调查问题
survey_type 是否 - 类型,否:单选 是:多选
survey_stime 日期 - 长日期,开始时间
survey_etime 日期 - 长日期,结束时间
-----------------------------------------------------------------


  表三、调查结束表 表名:survey_vote


-----------------------------------------------------------------
字段 类型 长度 说明
-----------------------------------------------------------------
vote_no 自动编号 - 递增、主键、有索引无重复
vote_id 长整型 - 有索引有重复,小数位0
vote_answer 文本 100 调查答案
vote_count 长整型 - 投票数
-----------------------------------------------------------------


  其中,survey_vote表和survey表的id字段有多对一的关系。并不一定要建立这个关系,但是建立关系会使思路更明确。


  三、包含文件


  这里所要用到的函数并不多,主要是对数据库进行操作的,如果要防止输入时的HTML等代码,直接用server.htmlencode进行处理就可以了,所以不需要一个专门的函数来处理。我们可以沿用上一篇《跟我学》系列《跟我学做树型菜单》里的包含文件。


  共用函数文件,文件名:inc.asp


<%
''*******************************************************************
''通用数据库ASP函数
''*******************************************************************
''数据库常数
databasename="survey.mdb" ''数据库名,如果改名的话,在这里修改就行了
''*******************************************************************
''打开数据库
sub opendb(connect)
set connect=server.CreateObject("ADODB.connection")
connect.ConnectionString="DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" &_
server.MapPath(databasename)
connect.Open strconn
end sub
''*******************************************************************
''关闭数据库
sub closedb(connect)
connect.close
set connect=nothing
end sub
''*******************************************************************
''打开单个表读
sub opentable(connect,tbname,myrs)
set myrs=server.createobject("ADODB.recordset")
rssql="select * from " & tbname
myrs.open rssql,connect,1,1
end sub
''*******************************************************************
''关闭临时表
sub closetable(rs)
rs.close
set rs=nothing
end sub
''*******************************************************************
''查询数据库
sub searchtable(connect,sql,rs)
set rs=server.createobject("ADODB.recordset")
rs.open sql,connect,1,1
end sub


''*******************************************************************
''查询并更改数据库
sub changetable(connect,sql,rs)
set rs=server.createobject("ADODB.recordset")
rs.open sql,connect,1,3
end sub


''*******************************************************************
''显示信息 用于调试
Sub w(msg)
response.write msg
end sub


''*******************************************************************
''程序中断 用于调试
sub userstop()
response.end
end sub
%> 


  四、文件设计


  按照传统的思路,我们总是把在线调查设计成三个部份,一、是显示调查表;二、是显示调查统计结果;三是后台管理。而在实际应用中,我们会发现,显示调查表往往是在某个网页中的,显示结果一般也是弹出一个窗口来。后台管理则是通过另一个链接或者登录表单转向到的。为了更方便地使用在线调查,我们把显示调查表部分写成一个JS脚本,让需要显示调查表的网页通过引用脚本的方式来自由地调用它。好,看看文件设计


  1、inc.asp 包含文件。主要的函数库


  2、surveycode.asp 显示调查表程序。在主网页中使用脚本来调用它。


  3、survey.asp 调查表列表程序。列出所有调查的状态。


  4、survey_vote.asp 显示调查统计结果程序。带上参数表示调查的问题。


  5、survey_manage.asp 管理程序。


  在这里,我们略过了页面设计,因为风格设计不是我们所要说的内容,所以关于网页的风格,布局,CSS 等等,请大家自己设计。


  五、文件流程


  先写出程序的主要流程,可以比较方便于日后修改和扩展、移植。在这里比较重要的是要在程序中写哪些子程序,如何安排这些子程序。


  1、surveycode.asp 显示调查表单


<%
''获取querystring参数,id 表示调查编号
''判断参数正确性
''判断调查是否在有效期中。
''读取调查问题、类型
''输出调查答案,并生成调查表单
''关闭数据库及表
%>


  2、survey.asp 显示所有调查状态


<%
''读取数据库
%>

''显示所有调查状态,并加入链接
 


  3、survey_vote.asp 显示统计结果。


  这里有两个功能,一是没有提交的显示,二是提交了答案后进行统计,然后显示结果。如果不带参数,就是第一种方式。也可以分为两个文件来完成。


<%
''获取参数。id 表示调查编号 所有数据来自form
''判断是否有参数,有则先进行统计
''没有则直接显示
''统计子程序
%>

''显示子程序


  4、survey_manage.asp 管理程序。


  管理部份比较复杂,要实现较多的功能。先来列一下管理的功能:


  1)管理员登录。只有登录后才能进行管理


  2)退出登录。完成管理后安全退出。


  对调查的管理有:


  3)增加一个调查。同时要增加调查答案


  4)修改一个调查。修改内容,时间,类型,调查答案的内容、增加、删除


  5)删除一个调查。不能删除正在进行的调查。


  针对这些功能,来设计它的流程


<%
''获取参数。action表示动作,分别对应上面的功能。
''根据动作来转向相应的子程序
''登录子程序
''退出登录子程序
''执行增加调查问题子程序
''执行增加调查答案子程序
''执行修改调查子程序 问题和答案一起修改
''执行删除调查问题子程序
''执行删除调查答案子程序

<%
''判断是否登录,没有则显示登录表单
''根据动作显示相应表单
''显示所有调查子程序
''显示单个调查子程序。问题和答案一起显示
''显示增加调查子程序。
''显示登录表单
%>
 


  六、代码编写


  做好了流程设计后,写代码就比较有条理了。让我们从简单的开始。在编写代码
之前,我们要先在数据库里输入一些记录,以便做测试。先加入一条调查问题,和几个
调查答案,并手工输入一些统计信息。


 我们先来写显示调查表单的surveycode.asp 这个文件要在其它页面中被调用,所以我们写成JS和VBS混用的方式。调用的时候可以把它放在某个表格中,用下面的语句:



  按照上面的流程,在显示表单前,先要判断一下调查是否存在,是否在进行中。另外,在表单中要提交一个隐藏的参数,来表示调查的问题编号(id),答案提交的时候,提交的是答案的编号vote_no


  文件名 surveycode.asp



<%
id=request.querystring("id")
if id<>"" then ''如果有参数
opendb my ''联接数据库
sql="select * from survey where survey_id="& id ''查询语句
searchtable my,sql,rs ''查询数据库
if not rs.eof then ''如果有这个调查记录
question=rs("survey_question") ''读出问题
surveytype=rs("survey_type") ''读出答案类型
stime=rs("survey_stime") ''读出开始时间
etime=rs("survey_etime") ''读出结束时间
closetable rs ''关闭表
if stimenow() then ''如果调查正在进行中
''下面输出调查表单
''先输出表单和问题,表单提交到survey_vote.asp
%>
document.write("

");
document.write("document.write(" bordercolordark=''#ffffff'' width=''100%'' align=''center''>");
document.write("");
<%
sql="select vote_no,vote_answer from survey_vote where vote_id="&id ''查询答案的SQL
searchtable my,sql,rs ''执行查询
if not rs.eof then ''如果有答案,就输出
for i=1 to rs.recordcount
%>
document.write("");
<%
rs.movenext
next
''下面几句输出一个隐藏的参数,传递问题编号(id)
''并用一个JS函数来定义点击查看后的链接
%>
document.write("
<%=server.htmlencode(question)%>
<%
if surveytype then ''判断类型,显示单选或者多选
%>
document.write("checkbox");
<%else%>
document.write("radio");
<%end if ''下面这句输出答案的文字和提交的值(vote_no)%>
document.write("'' value=<%=rs("vote_no")%>>
<%=rs("vote_answer")%>
''>");
document.write(" ");
document.write(")''>");
document.write("
");
function jump(id){
window.open("survey_vote.asp?id="+id,"survey")
}
<%
end if
end if
end if
closetable rs
closedb my
end if
%>


  在surveycode.asp完成后,我们实现上已经确定了以下几点:


  1、在survey_vote.asp中,如果querystring参数id有值,则是查看结果;


  2、在survey_vote.asp中,如果form参数id有值,则要先进行统计;


  3、在survey_vote.asp中,提交来的form参数res是答案的编号vote_no;


  七、统计结果


  首先我们来完成与surveycode.asp最密切相关的显示统计结果survey_vote.asp文件。在上一篇的结尾,我们已经说明了在surveycode.asp中确定的一些参数。


  统计结果 survey_vote.asp





调查统计结果



<%
''上一句先加入包含文件,引用函数。
id=request.querystring("id") ''获取querystring参数id
opendb my ''连接数据库
if id="" then ''如果没有,则不是直接看结果
id=request.form("id") ''获取form参数id
if id<>"" then ''如果有值,则是要先统计
surveycount() ''调用统计子程序
end if
end if
if id<>"" then
disp_survey() ''不管是哪种,最后都显示结果
end if
closedb my ''关闭数据库


''-----统计子程序-----
sub surveycount()
if session("survey_ok")="" then ''如果还没投票
no=request.form("res") ''得到答案的编号
if no<>"" then
''定义SQL语句,让提交的答案数量+1
sql="update survey_vote set vote_count=vote_count+1 where vote_no= in (" & no &")"
my.execute sql
end if
session("survey_ok")="ok"
end if
end sub
''------------------


''---显示结果子程序---
sub disp_survey()


''定义SQL语句,得到调查的问题
sql="select survey_question from survey where survey_id=" & id
searchtable my,sql,rs ''执行查询
question=rs("survey_question") ''把问题存到question中
closetable rs ''关闭表
''定义SQL语句,得到答案的数量总和
sql="select sum(vote_count) as total from survey_vote where vote_id="& id
searchtable my,sql,rs
total=rs("total")
closetable rs ''关闭表


''定义SQL语句,得到所有的答案文本部份及投票数
sql="select vote_answer,vote_count from survey_vote where vote_id=" & id
searchtable my,sql,rs ''执行查询
''下面用表格来输出统计表
%>

bordercolorligh="#000000" bordercolordark="#ffffff">












<%do while not rs.eof
if total=0 then
percent=0 ''如果没人投票,则百分比为0
else
percent=int(rs("vote_count")/total*10000)/100 ''计算百分比
end if
%>






<%
rs.movenext
loop
%>



调查统计结果
调查问题:<%=question%>
答案投票率比例票数
<%=rs("vote_answer")%>





<%=percent%>%<%=rs("vote_count")%>
至 <%=now()%> 止,共有 <%=total%> 张投票
关闭窗口

<%
closetable rs ''关闭表
end sub
''------------------
%>

 


  在显示投票过程中,我们用session变量survey_ok来表示是否已经投过票。另外,这显示统计中,引用CSS文件来控制表格的样式,你们可以根据自己的要求自己加入。


  八、列出所有调查的状态


  现在我们来完成survey.asp,它的主要任务是列出所有的调查状态,包括:


  1、调查的问题,链接到投票表单页面(直接写在本页中);


  2、调查的起启时间;


  3、调查的结束时间;


  4、调查的进行状态:未开始、进行中、已结束;


  5、调查的投票数;


  6、调查的类型,单选还是多选;


  7、另外给出一个链接查看投票结果;


  根据这些要求,查询相应的表就可以了,有些语句,比如得到投票总数,SQL语句其实在上面的survey_vote.asp中已经写过了。


  列出所有调查的状态 survey.asp






在线调查列表



<%
id=request.querystring("id") ''获取参数
if id<>"" then ''如果有参数,则显示这个调查表单
response.write ""
else ''否则调用子程序显示状态
disstat()
end if


''-----显示状态子程序----
sub disstat()
opendb my ''连接数据库
opentable my,"survey",rs ''直接打开表
''下面用表格显示每个记录
''先显示表头
%>

align="center" bordercolorligh="#000000" bordercolordark="#ffffff">













<%
''下面输出每个记录
do while not rs.eof
''先读出每个字段
id=rs("survey_id")
question=rs("survey_question")
''读出类型
if rs("survey_type") then
stype="多选"
else
stype="单选"
end if
stime=rs("survey_stime")
etime=rs("survey_etime")
''判断状态
if now()stat="未开始"
else
if nowstat="进行中"
else
stat="已结束"
end if
end if


''定义SQL语句,得到答案的数量总和
sql="select sum(vote_count) as total from survey_vote where vote_id="& id
searchtable my,sql,tmprs ''查询
total=tmprs("total")
closetable tmprs ''关闭表
''下面输出一条记录
%>











<%
rs.movenext ''移动到下一条,循环
loop
%>
在线调查列表
编号调查问题类型起启时间结束时间状态已投票数查看
<%=id%>
<%=question%>
<%=stype%><%=stime%><%=etime%><%=stat%><%=total%>
查看

<%
closetable rs ''关闭表
closedb my ''关闭数据库
end sub
''----------------------
%>


 


  九、后台管理


  在后台管理页面survey_manage.asp中,前面我们已经列出来它所要实现的管理功能。管理的流程是先显示出所有调查,对于还没有开始的调查,可以进行修改、删除;对于已经结束的调查,可以删除,不能修改;对于正在进行的调查,只能修改它的结束时间。用一个参数action来表示动作,含义如下:


  1、无参数。表示第一次进入,显示登录表单


  2、login 表示执行登录


  3、logout 表示执行退出登录


  4、showaddquestion 表示显示增加一个调查


  5、showsurvey 表示显示一个调查


  6、doaddsurvey 表示执行增加一个调查


  7、doaddanswer 表示执行增加一个答案


  8、dodelsurvey 表示删除一个调查


  9、dodelanswer 表示删除一个答案


  10、domodify 表示修改一个调查及答案


相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么

文章评论
发表评论

热门文章 没有查询到任何记录。

最新文章 迅雷新手完全入门手册 asp下面javascript上传图片限制格式大小方法告诉大家网页弹出窗口应用总结ASP常见错误类型大全asp常见错误分析和解决办法

人气排行 总是弹出visual studio 实时调试器 三种解决SQLSERVER存储过程及调用详解Asp获取真实IP地址ASP中连接Mssql的几种方法一个简单好用的UBB编辑器(含代码)如何用Split将字符串转换为数组并获取数组下ASP防止表单重复提交的办法告诉你免费的简单聊天室源代码