用ASP學做一個線上調查

來源:互聯網
上載者:User
關於線上調查大家一定不會陌生吧,給出一個問題和數個答案,讓使用者填寫,然後把結果儲存到資料庫,自動進行統計,最後給出個統計的圖。這期的跟我學做就來做一個線上調查系統。

  一、功能設計

  這麼簡單的系統也要做功能設計?有的人也許會覺得奇怪,不過話說回來不管怎麼樣的系統,先做功能設計總是能對系統有個比較清析的瞭解。讓我們來看看線上調查的功能吧。基本的功能上面已經說了,就是要給出一個問題和數個答案,然後統計,最後給出圖。在這個基礎上,我們可以考慮給一個調查加上一個時間段(有效期間),在這個時間段裡調查是有效,過了這段時間就自動結束這個調查。另外,我們可以指定一個使用者一次只能提交一次答案。如果你要限制得更多,可以指定一個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 顯示所有調查狀態

<%
''讀取資料庫
%>
<html>
''顯示所有調查狀態,並加入連結
</html> 

  3、survey_vote.asp 顯示統計結果。

  這裡有兩個功能,一是沒有提交的顯示,二是提交了答案後進行統計,然後顯示結果。如果不帶參數,就是第一種方式。也可以分為兩個檔案來完成。

<%
''擷取參數。id 表示調查編號 所有資料來自form
''判斷是否有參數,有則先進行統計
''沒有則直接顯示
''統計子程式
%>
<html>
''顯示子程式
</html>

  4、survey_manage.asp 管理程式。

  管理部份比較複雜,要實現較多的功能。先來列一下管理的功能:

  1)管理員登入。只有登入後才能進行管理

  2)退出登入。完成管理後安全退出。

  對調查的管理有:

  3)增加一個調查。同時要增加調查答案

  4)修改一個調查。修改內容,時間,類型,調查答案的內容、增加、刪除

  5)刪除一個調查。不能刪除進行中的調查。

  針對這些功能,來設計它的流程

<%
''擷取參數。action表示動作,分別對應上面的功能。
''根據動作來轉向相應的子程式
''登入子程式
''退出登入子程式
''執行增加調查問題子程式
''執行增加調查答案子程式
''執行修改調查子程式 問題和答案一起修改
''執行刪除調查問題子程式
''執行刪除調查答案子程式
<html>
<%
''判斷是否登入,沒有則顯示登入表單
''根據動作顯示相應表單
''顯示所有調查子程式
''顯示單個調查子程式。問題和答案一起顯示
''顯示增加調查子程式。
''顯示登入表單
%>
</html> 

  六、代碼編寫

  做好了流程設計後,寫代碼就比較有條理了。讓我們從簡單的開始。在編寫代碼
之前,我們要先在資料庫裡輸入一些記錄,以便做測試。先加入一條調查問題,和幾個
調查答案,並手工輸入一些統計資訊。

 我們先來寫顯示調查表單的surveycode.asp 這個檔案要在其它頁面中被調用,所以我們寫成JS和VBS混用的方式。調用的時候可以把它放在某個表格中,用下面的語句:

<SCRIPT Language="JavaScript" SRC="surveycode.asp?id=1"></SCRIPT>

  按照上面的流程,在顯示表單前,先要判斷一下調查是否存在,是否在進行中。另外,在表單中要提交一個隱藏的參數,來表示調查的問題編號(id),答案提交的時候,提交的是答案的編號vote_no

  檔案名稱 surveycode.asp

<!--#include file="inc.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 stime<now() and etime>now() then ''如果調查進行中中
''下面輸出調查表單
''先輸出表單和問題,表單提交到survey_vote.asp
%>
document.write("<form action=''survey_vote.asp'' target=''_blank'' method=''post''>");
document.write("<table border=''1'' cellpadding=''2'' cellspacing=0'' bordercolorligh=''#000000''");
document.write(" bordercolordark=''#ffffff'' width=''100%'' align=''center''><tbody>");
document.write("<tr><td colspan=''2'' align=''center''><b><%=server.htmlencode(question)%></b></td></tr>");
<%
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("<tr><td align=''right''><input name=''res'' type=''");
<%
if surveytype then ''判斷類型,顯示單選或者多選
%>
document.write("checkbox");
<%else%>
document.write("radio");
<%end if ''下面這句輸出答案的文字和提交的值(vote_no)%>
document.write("'' value=<%=rs("vote_no")%>></td><td><%=rs("vote_answer")%></td></tr>");
<%
rs.movenext
next
''下面幾句輸出一個隱藏的參數,傳遞問題編號(id)
''並用一個JS函數來定義點擊查看後的連結
%>
document.write("<tr><td colspan=''2'' align=''center''><input type=''hidden'' name=''id'' value=''<%=id%>''>");
document.write("<input type=''submit'' class=button value=''投票''> ");
document.write("<input type=button class=button value=''查看'' >");
document.write("</td></tr></tbody></table></form>");
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

<!--#include file="inc.asp" -->
<html>
<head>
<title>調查統計結果</title>
<link rel="stylesheet" href="main.css" type="text/css">
</head>
<body>
<%
''上一句先加入包含檔案,引用函數。
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 ''執行查詢
''下面用表格來輸出統計表
%>
<table width="500" border="1" align="center" cellpadding="2" cellspacing="0"
bordercolorligh="#000000" bordercolordark="#ffffff">
<tr>
<td colspan="4" align="center"><b>調查統計結果</b></td>
</tr>
<tr>
<td colspan="4"><b>調查問題:<%=question%></b></td>
</tr>
<tr >
<td width="150" align="center" height="20">答案</td>
<td width="150" align="center" height="20">投票率</td>
<td width="100" align="center" height="20">比例</td>
<td width="100" align="center" height="20">票數</td>
</tr>
<%do while not rs.eof
if total=0 then
percent=0 ''如果沒人投票,則百分比為0
else
percent=int(rs("vote_count")/total*10000)/100 ''計算百分比
end if
%>
<tr>
<td width="150" align="center"><%=rs("vote_answer")%></td>
<td width="150" align="left">
<table border="0" width="<%=percent%>" bgcolor="#CCCC00" height="10">
<tr>
<td></td>
</tr>
</table>
</td>
<td width="100" align="center"><%=percent%>%</td>
<td width="100" align="center"><%=rs("vote_count")%></td>
</tr>
<%
rs.movenext
loop
%>
<tr>
<td colspan="4"> 至 <%=now()%> 止,共有 <%=total%> 張投票
<a href="javascript:window.close()">關閉視窗</a>
</td>
</tr>
</table>
<%
closetable rs ''關閉表
end sub
''------------------
%>
</body>
</html> 

  在顯示投票過程中,我們用session變數survey_ok來表示是否已經投過票。另外,這顯示統計中,引用CSS檔案來控製表格的樣式,你們可以根據自己的要求自己加入。

  八、列出所有調查的狀態

  現在我們來完成survey.asp,它的主要任務是列出所有的調查狀態,包括:

  1、調查的問題,連結到投票表單頁面(直接寫在本頁中);

  2、調查的起啟時間;

  3、調查的結束時間;

  4、調查的進行狀態:未開始、進行中、已結束;

  5、調查的投票數;

  6、調查的類型,單選還是多選;

  7、另外給出一個連結查看投票結果;

  根據這些要求,查詢相應的表就可以了,有些語句,比如得到投票總數,SQL語句其實在上面的survey_vote.asp中已經寫過了。

  列出所有調查的狀態 survey.asp


<!--#include file="inc.asp" -->
<html>
<head>
<title>線上調查列表</title>
<link rel="stylesheet" href="main.css" type="text/css">
</head>
<body>
<%
id=request.querystring("id") ''擷取參數
if id<>"" then ''如果有參數,則顯示這個調查表單
response.write "<SCRIPT Language=''JavaScript'' SRC=''surveycode.asp?id="&id&"''></SCRIPT>"
else ''否則調用子程式顯示狀態
disstat()
end if

''-----顯示狀態子程式----
sub disstat()
opendb my ''串連資料庫
opentable my,"survey",rs ''直接開啟表
''下面用表格顯示每個記錄
''先顯示表頭
%>
<table width="760" border="1" cellspacing="0" cellpadding="2"
align="center" bordercolorligh="#000000" bordercolordark="#ffffff">
<tr>
<td colspan="8" align="center"><b>線上調查列表</b></td>
</tr>
<tr >
<td width="50" align="center" height="20">編號</td>
<td width="200" align="center" height="20">調查問題</td>
<td width="50" align="center" height="20">類型</td>
<td width="140" align="center" height="20">起啟時間</td>
<td width="140" align="center" height="20">結束時間</td>
<td width="50" align="center" height="20">狀態</td>
<td width="80" align="center" height="20">已投票數</td>
<td width="50" align="center" height="20">查看</td>
</tr>
<%
''下面輸出每個記錄
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()<stime then
stat="未開始"
else
if now<etime then
stat="進行中"
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 ''關閉表
''下面輸出一條記錄
%>
<tr >
<td align="center" height="20"><%=id%></td>
<td height="20">
<a href="survey.asp?id=<%=id%>"><%=question%></a>
</td>
<td align="center" height="20"><%=stype%></td>
<td align="center" height="20"><%=stime%></td>
<td align="center" height="20"><%=etime%></td>
<td align="center" height="20"><%=stat%></td>
<td align="center" height="20"><%=total%></td>
<td align="center" height="20">
<a href="survey_vote.asp?id=<%=id%>" target="_blank">查看</a>
</td>
</tr>
<%
rs.movenext ''移動到下一條,迴圈
loop
%>
</table>
<%
closetable rs ''關閉表
closedb my ''關閉資料庫
end sub
''----------------------
%>
</body>
</html>
 

  九、後台管理

  在後台管理頁面survey_manage.asp中,前面我們已經列出來它所要實現的管理功能。管理的流程是先顯示出所有調查,對於還沒有開始的調查,可以進行修改、刪除;對於已經結束的調查,可以刪除,不能修改;對於進行中的調查,只能修改它的結束時間。用一個參數action來表示動作,含義如下:

  1、無參數。表示第一次進入,顯示登入表單

  2、login 表示執行登入

  3、logout 表示執行退出登入

  4、showaddquestion 表示顯示增加一個調查

  5、showsurvey 表示顯示一個調查

  6、doaddsurvey 表示執行增加一個調查

  7、doaddanswer 表示執行增加一個答案

  8、dodelsurvey 表示刪除一個調查

  9、dodelanswer 表示刪除一個答案

  10、domodify 表示修改一個調查及答案



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.