Hejsan!
Jag håller på en gästbok som kommer att innehålla ett ip ban script. Jag har nästan fått det att funka jag har för nuvarande koden nedan:
<%
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("../secret/secret.mdb")
Set RecSet = Server.CreateObject("ADODB.Recordset")
SQLsats = "SELECT * FROM BannedIpnr ORDER by Ipnr desc"
RecSet.Open SQLsats, Connect, adOpenStatic, adLockOptimistic
Do Until RecSet.EOF
If RecSet("Ipnr") = Request.Servervariables("REMOTE_ADDR") Then
Response.Write"Du är spärrad"
Else
Response.Write"Du är inte spärrad"
End If
RecSet.MoveNext
Loop
%>
Scriptet kollar i databasen om besökarens ip nummer finns där. Om den inte finns kommer den att skriva ut "Du är inte spärrad" om den finns där kommer den att skriva ut "Du är spärrad". Problemet nu är att om jag lägger in 2 ip nummer i databasen som inte är min kommer den att skriva ut "Du är inte spärrad" 2 gånger. Samma sak gäller om jag är spärrad. Det jag undrar över är om det att göra så att den avbryter Do Until loopen så fort den har hittat IP nummret om den finns i databasen och skriver ut "Du är spärrad" bara en gång. Samt om den loopar igenom hela databasen och inte hittar IP nummret då ska den skriva ut "Du är inte spärrad" endast en gång även om databasen innehåller flera andra IP nummer.
Do Until RecSet.EOF
strIp = strIp & RecSet("Ipnr")
RecSet.MoveNext
Loop
If InStr(strIp,Request.Server.Variables("REMOTE_ADDR")) > 0 Then
Response.Write("Du är spärrad")
Else
Response.Write("Du är inte spärrad")
End If
InStr letar igenom variabeln strIp, som innehåller alla IP-adresser i databasen, och om positionen den hittade besökarens IP-adress är större än 0 (om texten man letar efter inte finns är positionen 0) så ska den skriva ut att man är blockad. Lär mer här.
Borde väl egentligen vara bättre att kolla direkt i sql-frågan?
<%
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("../secret/secret.mdb")
Set RecSet = Server.CreateObject("ADODB.Recordset")
RecSet.Open "SELECT * FROM BannedIpnr WHERE Ipnr = '" & Request.Servervariables("REMOTE_ADDR") & "'", Connect
if not RecSet.eof then passed = true else passed = false
RecSet.close
set RecSet = nothing
Connect.close
set Connect = nothing
If passed then
Response.Write("Du är spärrad")
Else
Response.Write("Du är inte spärrad")
End If
%>
Borde väl egentligen vara bättre att kolla direkt i sql-frågan?
<%
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("../secret/secret.mdb")
Set RecSet = Server.CreateObject("ADODB.Recordset")
RecSet.Open "SELECT * FROM BannedIpnr WHERE Ipnr = '" & Request.Servervariables("REMOTE_ADDR") & "'", Connect
if not RecSet.eof then passed = true else passed = false
RecSet.close
set RecSet = nothing
Connect.close
set Connect = nothing
If passed then
Response.Write("Du är spärrad")
Else
Response.Write("Du är inte spärrad")
End If
%>
Att köra ut alla adresserna till en sträng verkar inte vara den bästa lösningen när man kan ställa en jämförelse mot databasen direkt istället. Strängfunktioner är inte kända för att vara snabba. ;)
257 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25