近期我和同學處理關于一個醫院護士節投票系統的限制時間間隔問題就是通過下面這種方法來解決的。
主要利用到了datediff,這個函數。
程序代碼
If Request.Form("submit")="投票" Then
If RestrictIP=True Then
fIP=Request.ServerVariables("Remote_Addr")
Set rs=Server.CreateObject("ADODB.RecordSet")
rs.open "Select * from NF_IP where sid="&sid&" and ip='"&fIP&"' and datediff('h',vtime,now())<"&refuseTime,conn,1,3
If not(rs.eof and rs.bof) Then
Response.Write "<script>alert('你已經投過票了!');window.close()</script>"
Response.End
Else
rs.addnew
rs("sid")=sid
rs("ip")=fIP
rs("vtime")=now()
rs.update
End If
rs.close
Set rs=nothing
conn.execute("delete from NF_IP where datediff('h',vtime,now())>="&refuseTime)
End If
If RestrictIP=True Then
fIP=Request.ServerVariables("Remote_Addr")
Set rs=Server.CreateObject("ADODB.RecordSet")
rs.open "Select * from NF_IP where sid="&sid&" and ip='"&fIP&"' and datediff('h',vtime,now())<"&refuseTime,conn,1,3
If not(rs.eof and rs.bof) Then
Response.Write "<script>alert('你已經投過票了!');window.close()</script>"
Response.End
Else
rs.addnew
rs("sid")=sid
rs("ip")=fIP
rs("vtime")=now()
rs.update
End If
rs.close
Set rs=nothing
conn.execute("delete from NF_IP where datediff('h',vtime,now())>="&refuseTime)
End If
注:
vtime----投票者投票的時間
now()--系統現在的時間
refusetime--間隔時間(可根據需要在前臺設置,這里單位為小時h)
核心在下面這句話:
conn.execute("delete from NF_IP where datediff('h',vtime,now())>="&refuseTime)
如果datediff('h',vtime,now)的值,也就是投票時間與系統現在的時間間隔大于所設置的refusetime(前臺設置的投票時間間隔),那么刪除掉那條記錄。這樣就限制了每個IP在同一時間間隔內只能投一票。
關于datediff('h',vtime,now)
datadiff這個函數是取得兩個日期時間值的差,第一個參數"h",表示取后面兩個時間值的小時部分的差值。