|
網(wǎng)站設(shè)計(jì)中表單驗(yàn)證(ASP) 作者:劉巍 郵箱:support@ceocio.net 網(wǎng)址:http://www.ceocio.net 一般的動(dòng)態(tài)網(wǎng)站需要通過(guò)表單來(lái)收集用戶信息,或者實(shí)現(xiàn)與用戶的交互,雖然我們相信絕大多數(shù)人士既然選擇了填寫
表單就會(huì)認(rèn)真的完成,但是亦不能避免無(wú)聊人士亂填表單,況且即使一個(gè)正常用戶在填寫過(guò)程中也會(huì)無(wú)意識(shí)的出現(xiàn)一些
填寫錯(cuò)誤,或者他們忘記了填某些選項(xiàng)。通常為了避免這種情況,開(kāi)發(fā)者會(huì)給表單加一個(gè)驗(yàn)證的過(guò)程,在表單數(shù)據(jù)提交
到服務(wù)器之前或者服務(wù)器之后對(duì)用戶填寫的數(shù)據(jù)進(jìn)行驗(yàn)證,若遇到錯(cuò)誤的填寫則返回要求用戶進(jìn)行更正。 在ASP中程序員們一般是這樣做的: 1、用javascript在客戶端進(jìn)行驗(yàn)證。 2、用vbscript在客戶端進(jìn)行驗(yàn)證。 3、用vbscript在服務(wù)器端進(jìn)行驗(yàn)證。 上面提到了兩個(gè)不同的環(huán)境,服務(wù)器端和客戶端,客戶端驗(yàn)證實(shí)際上就是包含在已下載的頁(yè)面中,當(dāng)用戶提交表單時(shí)
候,它直接在已下載到本地的頁(yè)面中調(diào)用script來(lái)進(jìn)行驗(yàn)證,這樣可以減少服務(wù)器端的運(yùn)算。而服務(wù)器端的驗(yàn)證則是將
頁(yè)面提交到服務(wù)器處理,服務(wù)器上的另一個(gè)ASP頁(yè)面先執(zhí)行對(duì)表單的驗(yàn)證,然后再返回結(jié)果到客戶端。這樣的缺點(diǎn)是每
一次驗(yàn)證都要經(jīng)過(guò)服務(wù)器,消耗時(shí)間較長(zhǎng)。但是利用服務(wù)器端驗(yàn)證卻可以達(dá)到較好的驗(yàn)證功能。 本文就是主要講述ASP中在服務(wù)器端的驗(yàn)證。 在了解以下介紹方法之前,你需要想想在表單驗(yàn)證問(wèn)題中會(huì)遇到哪些需要值得我們控制的地方。就像軟件工程思想一
樣,先分析一下要在哪些方面進(jìn)行驗(yàn)證。 1、要求用戶的輸入必須是中文(英文或數(shù)字)。 2、要求用戶的輸入必須是有效的郵件地址。 3、對(duì)用戶輸入的數(shù)據(jù)進(jìn)行各種不同的限制。 4、限制用戶輸入的數(shù)據(jù)量。 5、.... 實(shí)際上我們?cè)诰W(wǎng)站設(shè)計(jì)中還會(huì)因情況不同而遇到其他很多不同的問(wèn)題,需要我們自己去定義一些規(guī)定和限制。 下面我們以實(shí)例來(lái)講述驗(yàn)證方法。 1、驗(yàn)證輸入的數(shù)字 假設(shè)一個(gè)文本框 <form name="form1" method="post" action=""> <input type="text" name="textfield"> </form> '要求用戶必須輸入數(shù)字 if not isnumeric(Request.Form("textfield")) then response.write "重新填寫" end if '要求限制數(shù)字長(zhǎng)度,如你要用戶輸入oicq號(hào)碼 '此例限制了用戶的輸入只有為4到10位數(shù)字才有效 if len(Request.Form("textfield"))>10 or len(Request.Form("textfield"))<4 then response.write "重新填寫" end if 當(dāng)然上面用Request.Form和Request是一樣的,隨便你怎么寫了。 2、驗(yàn)證用戶輸入的郵件地址 '引用一段通用檢測(cè)函數(shù)來(lái)說(shuō)明 '由于檢驗(yàn)程序較長(zhǎng),將其定義為一函數(shù)來(lái)調(diào)用 function IsValidEmail(email) dim names, name, i, c 'Check for valid syntax in an email address. IsValidEmail = true names = Split(email, "@") if UBound(names) <> 1 then IsValidEmail = false exit function end if for each name in names if Len(name) <= 0 then IsValidEmail = false exit function end if for i = 1 to Len(name) c = Lcase(Mid(name, i, 1)) if InStr("abcdefghijklmnopqrstuvwxyz_-.", c) <= 0 and not IsNumeric(c) then IsValidEmail = false exit function end if next if Left(name, 1) = "." or Right(name, 1) = "." then IsValidEmail = false exit function end if next if InStr(names(1), ".") <= 0 then IsValidEmail = false exit function end if i = Len(names(1)) - InStrRev(names(1), ".") if i <> 2 and i <> 3 then IsValidEmail = false exit function end if if InStr(email, "..") > 0 then IsValidEmail = false end if end function '上面的這段函數(shù)大家應(yīng)該都看的懂,當(dāng)然你可以修改這段代碼,使得即使用戶輸入XXX@CCC.DDD是錯(cuò)誤的郵件地址
,因?yàn)镈DD不是一個(gè)有效域名。 '引用的時(shí)候可以這樣寫 if IsValidEmail(trim(request("textfield")))=false then response.write "重新填寫" end if 3、驗(yàn)證為空的表單單元 有的信息是要求用戶必須填寫的,所以不允許為空,因此當(dāng)用戶輸入為空的時(shí)候需要提示。 '對(duì)為空單元的處理 if Request.Form("textfield")="" then Response.write "填寫為空" end if 4、判斷用戶輸入的是不是一個(gè)日期 首先明白日期值格式2002-11-19 '直接判斷一個(gè)值是否是日期 if not isdate(Request.Form("textfield")) then Response.write "日期填寫出錯(cuò)" end if 而我們?cè)谠O(shè)計(jì)網(wǎng)站時(shí)候往往用三個(gè)下拉框來(lái)實(shí)現(xiàn)年、月、日三個(gè)不同選項(xiàng),如何將這三個(gè)值聯(lián)系起來(lái),并且進(jìn)行驗(yàn)證
呢? 首先當(dāng)然要建立三個(gè)下拉框了,分別命名表單名為date,month,year,然后就是后臺(tái)的處理了,因?yàn)橄惹拔覀冊(cè)谇芭_(tái)
獲取了date,month,year這三個(gè)傳遞過(guò)來(lái)的值,所以我們必須把他們連接起來(lái)合成一個(gè)變量才能驗(yàn)證和存入數(shù)據(jù)庫(kù)。連
接成標(biāo)準(zhǔn)日期格式表達(dá)式可以這么寫: birthday=trim(Request.Form("year"))&"-"&trim(Request.Form("month"))&"-"&trim(Request.Form("date")) 驗(yàn)證已經(jīng)轉(zhuǎn)換的輸入是否為合法日期可以使用isdate函數(shù): if not isdate(birthday) then response.write "錯(cuò)誤" end if
5、不允許用戶輸入某些特殊字符 在這里我們假設(shè)傳遞的值是content,我們不允許輸入的值是=和% if Instr(request("content"),"=")>0 or Instr(request("content"),"%")>0 then response.write "不能輸入=和%" end if
實(shí)際上我們還可以寫出很多的驗(yàn)證函數(shù),我這里只是列舉一二,希望對(duì)大家有所幫助。
|