web|投票|投票 二、調查項目的建立和維護
作 者 : 仙人掌工作室
本節我們說明調查項目建立和維護功能的實現。
建立與維護調查項目的起始頁面是Startup.html,該頁面負責設定PollMaker.asp和ItemMaker.asp等頁面使用的幀結構(從上到下共分三個幀)。起始頁面所引用的Blank.html只用於指定背景顏色,StartMsg.html提供啟動時顯示在最下面幀的提示資訊。
PollMaker.asp和ItemMaker.asp都包含運行於伺服器的ASP指令碼,同時也包含(和建立)瀏覽器指令碼以支援用戶端操作。運行於伺服器的指令碼由VBScript寫成,而用戶端指令碼則是JavaScript,這使得它既可以運行於Netscape Navigator,也適合於IE。
PollMaker.asp通過尋找Poll資料庫的MSysObjects系統資料表獲得已經定義的調查項目名字。因此,ASP應用必須具有讀取該表的許可權。在Access97中的設定方法是:先選擇菜單“工具/選項”設定系統對象可見,然後在“工具/安全/使用者與組的許可權”下設定。在本文所附代碼中Poll.mdb已經設定了這個許可權。如果要在不同的RDBMS上實現這個調查系統,這部分代碼必須改寫,使它適應目標資料庫上的系統資料表結構。
要將這些已定義的調查項目名字顯示到下拉式清單方塊,首先需要從S_表的表名中除去“S_”首碼,然後將這些字串格式化為< SELECT>元素的< OPTION>字串:
< SELECT NAME="PollName">
< OPTION VALUE="StartPoll" SELECTED>NEW POLL
< %
' 擷取當前已經定義的調查項目名字
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "poll"
Set objRS = _
objConn.Execute("SELECT Name FROM MSysObjects " & _
"WHERE Type=1 AND Name LIKE 'S_%' ORDER BY Name")
Do While Not objRS.EOF
PollName = Mid(objRS("Name"), 3)
Response.Write("< OPTION VALUE=""" & PollName & """>" & PollName)
objRS.MoveNext
Loop
%>
< /SELECT>
ItemMaker將指定調查項目的所有定義資訊下載到瀏覽器端的JavaScript數組中,從而實現問題的快速編輯和建立。所有的問題編輯操作都在瀏覽器內通過修改兩個JavaScript數組完成,只有單擊“儲存” 按鈕才可將修改結果寫入資料庫。
ItemMaker.asp首先將Response.Buffer設定為True,因此在頁面產生完成之前HTML輸出將一直緩衝在伺服器上,這使得產生錯誤或執行非編輯功能時ItemMaker.asp可以不下載那些JavaScript函數而退出。在Sub Main的開始處,程式通過檢查表單變數OpType來決定是建立新的調查項目,還是刪除調查項目或調查結果。這三個操作均在ItemMaker.asp內完成,即所有受密碼保護的功能均在同一指令碼內實現,這使得整個系統中密碼只在一個地方存取。上述三個操作均需動態地產生與執行SQL語句。不論是指令碼執行出現錯誤,還是指定的操作執行成功,都調用Response.Redirect語句重新載入PollMaker.asp,並把一個說明字串傳遞給它:
< %
Dim PollName
Dim Password
Dim objConn
Dim objRS
PollName = Request("PollName")
Password = UCase(Request("Password"))
OpType = Request("OpType") ' 要求ItemMaker.asp執行的操作
SName = "[S_" & PollName & "]"
AName = "[A_" & PollName & "]"
RName = "[R_" & PollName & "]"
Call Main
Sub Main
If Password < > "WEBPOLL" Then ' 如密碼錯誤返回PollMaker.asp並提示
Response.Redirect "PollMaker.asp?Msg=密碼錯誤,請再試一次。"
Exit Sub '從ItemMaker.asp返回
End If
If OpType = "Edit" Then ' 編輯或建立調查調查項目
If PollName = "StartPoll" Then
If Not newPoll() Then '使用者沒有給出調查項目的名字
Response.Redirect "PollMaker.asp?Msg=請輸入調查項目名字"
Exit Sub
End If
SName = "[S_" & PollName & "]"
AName = "[A_" & PollName & "]"
RName = "[R_" & PollName & "]"
End If
ElseIf OpType = "DelResp" Then ' 刪除調查項目的已有結果
If PollName = "StartPoll" Then
Response.Redirect "PollMaker.asp?Msg=請輸入調查項目名字"
Exit Sub
End If
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "poll"
Set objRS = Server.CreateObject("ADODB.Recordset")
objConn.Execute "DELETE FROM " & RName
Response.Redirect "PollMaker.asp?Msg=已經刪除指定調查項目的投票結果"
ElseIf OpType = "DelPoll" Then ' 刪除整個調查項目
If PollName = "StartPoll" Then
Response.Redirect "PollMaker.asp?Msg=不能刪除新調查項目"
Exit Sub
End If
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "poll"
Set objRS = Server.CreateObject("ADODB.Recordset")
objConn.Execute "DROP TABLE " & SName
objConn.Execute "DROP TABLE " & AName
objConn.Execute "DROP TABLE " & RName
Response.Redirect "PollMaker.asp?Msg=已經刪除指定的調查項目。"
End If
%>
在運行ItemMaker.asp編輯調查項目時,程式提取Poll資料庫中定義的調查項目及其問題定義資料初始化數組stemArray[]和ansArray[]。這些用來初始化的字串在寫入時經過“轉義”處理(即調用Escape()函數),從而避免了由於嵌入的引號或其它控制字元可能導致的問題,在使用這些數組之前這些字串被還原(initPoll()函數):