<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    用ASP學做一個在線調查

    Posted on 2007-11-08 23:27 yukui 閱讀(172) 評論(0)  編輯  收藏 所屬分類: 技術

       關于在線調查大家一定不會陌生吧,給出一個問題和數個答案,讓用戶填寫,然后把結果保存到數據庫,自動進行統計,最后給出個統計的圖。這期的跟我學做就來做一個在線調查系統。

      一、功能設計

      這么簡單的系統也要做功能設計?有的人也許會覺得奇怪,不過話說回來不管怎么樣的系統,先做功能設計總是能對系統有個比較清析的了解。讓我們來看看在線調查的功能吧?;镜墓δ苌厦嬉呀浾f了,就是要給出一個問題和數個答案,然后統計,最后給出圖。在這個基礎上,我們可以考慮給一個調查加上一個時間段(有效期),在這個時間段里調查是有效的,過了這段時間就自動結束這個調查。另外,我們可以指定一個用戶一次只能提交一次答案。如果你要限制得更多,可以指定一個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.aspid=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='查看' onclick='jump(<%=id%>)'>");
    document.write("</td></tr></tbody></table></form>");
    function jump(id){
    window.open("survey_vote.aspid="+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.aspid="&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.aspid=<%=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.aspid=<%=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 表示修改一個調查及答案 

    posts - 131, comments - 12, trackbacks - 0, articles - 32

    Copyright © yukui

    主站蜘蛛池模板: 91精品免费国产高清在线| 日本免费高清一本视频| 亚洲精品456在线播放| 最近最好的中文字幕2019免费 | 337p日本欧洲亚洲大胆色噜噜| av无码免费一区二区三区| 久久久久亚洲AV无码去区首| 中文字幕亚洲天堂| 永久看日本大片免费35分钟| 国产亚洲视频在线观看| 国产亚洲免费的视频看| 亚洲中文无码永久免费| 亚洲黄片手机免费观看| 亚洲精品国产福利在线观看| 免费又黄又爽的视频| 99热这里只有精品6免费| 亚洲AV无码一区二区三区鸳鸯影院| 亚洲国产a∨无码中文777| 免费观看的a级毛片的网站| 成人自慰女黄网站免费大全| 精品亚洲456在线播放| 精品国产综合成人亚洲区| 岛国av无码免费无禁网站| 中国极品美軳免费观看| 亚洲午夜无码毛片av久久京东热| 亚洲精品无码久久一线| 在线免费观看韩国a视频| 99久久免费看国产精品| 一级毛片a免费播放王色电影| 亚洲H在线播放在线观看H| 亚洲一区精品无码| 日本久久久免费高清| 中文字幕天天躁日日躁狠狠躁免费| 色婷婷综合缴情综免费观看| 亚洲国产成人99精品激情在线| 亚洲精品国精品久久99热一| 精品免费久久久久久成人影院| 久久久久免费看成人影片| 高清永久免费观看| 羞羞视频网站免费入口| 亚洲国产精品无码观看久久|