關於線上調查大家一定不會陌生吧,給一個問題和數個答案,讓使用者填寫,然後把結果儲存到資料庫,自動進行統計,最後給一個統計的圖。這期的跟我學做就來做一個線上調查系統。
一、功能設計
這麼簡單的系統也要做功能設計?有的人也許會覺得奇怪,不過話說回來不管怎麼樣的系統,先做功能設計總是能對系統有個比較清析的了解。讓我們來看看線上調查的功能。基本的功能上面已經說了,就是要給一個問題和數個答案,然後統計,最後給圖。在這個基礎上,我們可以考慮為調查加上一個時間段(有效期),在這個時間段裡調查是有效的,過了這段時間就自動結束這個調查。另外,我們可以指定一個使用者一次只能提交一次答案。如果你要限制得更多,可以指定一個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 ''如果有答案,就輸出
為 i=1 至 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=''查看'' onclick=''jump(<%=id%>)''>");
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 表示修改一個調查及答案