/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Spamsikring af gæstebog
Fra : Erik Ginnerskov


Dato : 07-02-06 22:20

Hej NG

Jeg (eller rettere min gæstebog) har beklageligvis pådraget mig (sig) en
spammers interesse. Jeg vil derfor have lavet et spamfilter. Gæstebogen
bliver veritabelt tæppebombet.

I første omgang vil jeg registrere de IP-numre, som nye indlæg sendes fra -
numrene skal ikke vises i den offentlige gæstebog, kun i min hemmelige
administrationsside.

Jeg har indsat et par linjer i scriptet for at aftaste og indskrive numrene
i databasen:

<%
If Request.Form("Gem") <> "" Then
strError = ""
strNavn = Trim(Request.Form("Navn"))
strEmail = Trim(Request.Form("Email"))
strIp = Request.ServerVariables("REMOTE_ADDR") 'ny linje indsat her!
strOverskrift = Trim(Request.Form("Overskrift"))
strKommentar = Trim(Request.Form("Kommentar"))
If Len(strNavn) = 0 Then
strError = "<li>Du skal skrive dit navn!</li>"
ElseIf validateEmail(strEmail) = False Then
strError = "<li>Du skal skrive en gyldig e-mail adresse!</li>"
ElseIf len(strOverskrift) = 0 Then
strError = "<li>Du skal skrive en overskrift til dit indlæg!</li>"
ElseIf Len(strKommentar) = 0 Then
strError = "<li>Du skal skrive en kommentar!</li>"
End If
If Len(strError) = 0 Then
Set rs = Server.CreateObject("ADODB.RecordSet")
strSQL = "SELECT * FROM Guestbook WHERE (ID = 0)"
rs.Open strSQL, tempConn, adOpenKeyset, adLockOptimistic
If (rs.BOF Or rs.EOF) Then
rs.AddNew
rs("Navn") = Server.HTMLEncode(strNavn)
rs("email") = Replace(strEmail, "@", "&#64;")
rs("ip") = Request.ServerVariables("REMOTE_ADDR") 'ny linje indsat her!
rs("Overskrift") = Server.HTMLEncode(strOverskrift)
rs("Kommentar") = Server.HTMLEncode(strKommentar)
rs("Dato") = Now()
rs.Update
End If
rs.Close
Set rs = Nothing
Else
strError = "<p><ul>" & strError & "</ul></p>"
strMode = "add"
End If
End If
%>

Det virker så langt, at jeg får registreret indlæggenes IP-numre. Men
hvordan får jeg lavet en spærring, så afsendere fra 'forbudte adresser ikke
kan skrive i gæstebogen?

Jeg havde forestillet mig, at der efter den første linje, hvor IP aftastes,
skal indsættes noget i retning af denne pseudokode:

if ip er i forbudte range then
strError = "<li>Desværre, der opstod en fejl. Dit indlæg blev ikke
registreret.</li>"

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/




 
 
Andrias Sundskarð (07-02-2006)
Kommentar
Fra : Andrias Sundskarð


Dato : 07-02-06 23:26

Hvad med en select sætning?
F.eks. "select ip from ip_ban_list where ip = '127.0.0.1'"

Hvis dette recordset har en (eller flere) rækker, så skrottes indlægget...

ip_ban_list er så en tabel i databasen, hvor du indsætter de ip
addresser der ikke skal have lov til at skrive i din gæstebog.

/as

Erik Ginnerskov wrote:
> if ip er i forbudte range then
> strError = "<li>Desværre, der opstod en fejl. Dit indlæg blev ikke
> registreret.</li>"
>

Erik Ginnerskov (08-02-2006)
Kommentar
Fra : Erik Ginnerskov


Dato : 08-02-06 05:39

Andrias Sundskarð wrote:
> Hvad med en select sætning?
> F.eks. "select ip from ip_ban_list where ip = '127.0.0.1'"
>
> Hvis dette recordset har en (eller flere) rækker, så skrottes
> indlægget...
>
> ip_ban_list er så en tabel i databasen, hvor du indsætter de ip
> addresser der ikke skal have lov til at skrive i din gæstebog.

Det vil jeg da forsøge.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Erik Ginnerskov (08-02-2006)
Kommentar
Fra : Erik Ginnerskov


Dato : 08-02-06 06:05

Andrias Sundskarð wrote:
> Hvad med en select sætning?
> F.eks. "select ip from ip_ban_list where ip = '127.0.0.1'"

Jeg prøvede dette:

strIp = Request.ServerVariables("REMOTE_ADDR")
'select ip from ip_ban_list where ip = '127.0.0.1' 'ny linje indsat her!
strError = "<li>Desværre, der opstod en fejl." &_ 'ny linje indsat her!
"Dit indlæg blev ikke registreret.</li>" 'ny linje indsat
her!

.... og lavede en tabel ip_ban_list, hvor jeg indsatte en række numre, som
jeg har fået lov til at eksperimentere med (mit eget er ikke inkluderet
her).

Men uanset hvad jeg skriver i "where ip = '??.?.?.?', kan jeg ikke længere
selv skrive i gæstebogen - jeg sidder og eksperimenterer i en lokal kopi, så
den rigtige gæstebog ikke bliver lagt død. Jeg fåri stedet udskrevet den
specifiserede fejlmeddelelse.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Jens Gyldenkærne Cla~ (13-02-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 13-02-06 00:24

Erik Ginnerskov skrev:

> Nu påstår scriptet, at mit IP-nummer har været brugt til
> spamming, så jeg får ikke lov til at skrive noget i
> gæstebogen. Men mit IP-nummer står _ikke_ i den databasetabel,
> der indeholder de forbudte numre.

Det går fremad - men du har stadig to problemer i filen
guestbook.asp.

Det første er selve din sql-sætning:

sql = "SELECT 1 FROM ip_ban_list WHERE bannedip = '12.23.34.56'"

Som den står herover, er det altid ip-nummeret 12.23.34.56 der
kontrolleres. Du skal udskifte den faste værdi med en
servervariabel der viser ip-nummeret (jeg kan ikke lige huske
navnet på variablen - prøv evt med
Request.ServerVariables("REMOTE_ADDR"), men udskriv den til skærmen
først).

Dernæst mangler du at lægge en handling ind i den if-sætning der
skelner mellem forbudte og tilladte ip-numre:

   If rs.EOF Then
' Alt o.k. - ingen poster = ip-nummer ikke på listen
Else
' Ip-nummer fundet, bloker indlægget
End If

Som den står herover (og i din fil pt), gør sætningen hverken fra
eller til (linjer der starter med apostrof er bare kommentarer).
Det var meningen at du selv skulle putte bloker-koden ind i else-
blokken og o.k.-koden ind i then-blokken.

Her er en hurtig mulighed hvis du vil blokere:

   If Not rs.EOF Then
       ' Bemærk at betingelsen er vendt - vi har kun brug for at
       ' gøre noget når der skal blokeres
       
       ' Luk og sluk databaseforbindelsen:
       rs.close
       set rs = Nothing
       objConn.Close
       set objConn = Nothing
   
       ' Viderestil til en "du er blokeret"-side
       response.redirect ("du-maa-ikke-skrive-her.asp")
       ' Denne linje bliver aldrig kørt
   End If

NB: Hvis response.redirect skal virke, må der ikke komme html-kode
før response.redirect-linjen.

--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Erik Ginnerskov (13-02-2006)
Kommentar
Fra : Erik Ginnerskov


Dato : 13-02-06 01:37

Jens Gyldenkærne Clausen wrote:

> Du skal udskifte den faste værdi med en
> servervariabel der viser ip-nummeret

Jeg prøvede at indsætte dette lige efter legend i guestbook.inc:

<% strRemAdr = Request.ServerVariables("REMOTE_ADDR")
response.write "<p>" & strRemAdr & "</p>" %>

.... og får udskrevet mit IP-nummer øverst i formularen.

> Her er en hurtig mulighed hvis du vil blokere:
>
> If Not rs.EOF Then
> rs.close
> set rs = Nothing
> objConn.Close
> set objConn = Nothing
>
> ' Viderestil til en "du er blokeret"-side
> response.redirect ("du-maa-ikke-skrive-her.asp")
> ' Denne linje bliver aldrig kørt
> End If

Jeg har nu prøvet denne ændring:

objConn.Open strDsn
sql = "SELECT 1 FROM ip_ban_list WHERE bannedip = 'strRemAdr'"
Set rs = objConn.Execute(sql)
If not rs.EOF Then 'ændring
herfra
rs.close
set rs = nothing
strError = "<li>IP ... spamme min gæstebog ...</li>"
End If
'ændring hertil!
strOverskrift = Trim(Request.Form("Overskrift"))

Nu kan jeg igen skrive i gæstebogen.

Men selv om jeg derefter prøvede at lægge mit eget IP-nummer ind i den
'forbudte liste', bliver jeg ikke blokeret.

> NB: Hvis response.redirect skal virke, må der ikke komme html-kode
> før response.redirect-linjen.

Den mulighed kan jeg overveje, når blokeringen er kommet til at virke.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Jørn Andersen (13-02-2006)
Kommentar
Fra : Jørn Andersen


Dato : 13-02-06 03:13

On Mon, 13 Feb 2006 01:36:59 +0100, "Erik Ginnerskov"
<erik@donotspammmeplease.invalid> wrote:

>Jeg prøvede at indsætte dette lige efter legend i guestbook.inc:
><% strRemAdr = Request.ServerVariables("REMOTE_ADDR")
>response.write "<p>" & strRemAdr & "</p>" %>
>
>... og får udskrevet mit IP-nummer øverst i formularen.

So far so good.

<snip>
>Jeg har nu prøvet denne ændring:
> objConn.Open strDsn
> sql = "SELECT 1 FROM ip_ban_list WHERE bannedip = 'strRemAdr'"

Skal nok være:
sql = "SELECT 1 FROM ip_ban_list WHERE bannedip = '" & strRemAdr & "'"

Den skal jo ikke sammenlignes med strengen: 'strRemAdr'
men med værdien af variablen: strRemAdr

Desuden er jeg lidt udsikker på "l" i "SELECT 1" - er det et feltnavn?
Ellers brug evt. SELECT *

> Set rs = objConn.Execute(sql)
> If not rs.EOF Then 'ændring
>herfra
> rs.close
> set rs = nothing
> strError = "<li>IP ... spamme min gæstebog ...</li>"
> End If
>'ændring hertil!
> strOverskrift = Trim(Request.Form("Overskrift"))
>
>Nu kan jeg igen skrive i gæstebogen.
>
>Men selv om jeg derefter prøvede at lægge mit eget IP-nummer ind i den
>'forbudte liste', bliver jeg ikke blokeret.


>> NB: Hvis response.redirect skal virke, må der ikke komme html-kode
>> før response.redirect-linjen.
>
>Den mulighed kan jeg overveje, når blokeringen er kommet til at virke.

Vær opmærksom på, at hvis du *ikke* bruger den mulighed, så skal
> rs.close
> set rs = nothing
være uden for if'en. Ellers bliver rs-objektet ikke "dræbt".


Good luck!

--
Jørn Andersen,
Brønshøj

Erik Ginnerskov (13-02-2006)
Kommentar
Fra : Erik Ginnerskov


Dato : 13-02-06 17:01

Jørn Andersen wrote:

>> sql = "SELECT 1 FROM ip_ban_list WHERE bannedip = 'strRemAdr'"
>
> Skal nok være:
> sql = "SELECT 1 FROM ip_ban_list WHERE bannedip = '" & strRemAdr & "'"

Jeg har nu forsøgt med de ændringer, du og Jens har foreslået. Jeg kan
stadig skrive i gæsteboden, uanset om mit IP står i banned-listen eller ej.

Det gør heller ikke nogen forskel, om jeg skriver "SELECT 1 ......" eller
"SELECT * ....."

Jeg prøvede også at slette "not" i "If not rs.EOF Then". Så kunne jeg _ikke_
skrive i gæstebogen, uanset om mit IP står på listen eller ej.

Det aktuelle script:

http://hjemmesideskolen.dk/usenet/guestbookasp.txt

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Jørgen Müller (13-02-2006)
Kommentar
Fra : Jørgen Müller


Dato : 13-02-06 17:12

Erik Ginnerskov skrev:

>strIp = Request.ServerVariables("REMOTE_ADDR")
>sql = "SELECT 1 FROM ip_ban_list WHERE bannedip = '" & strRemAdr & "'"

Brugerens IP adresse ligger ikke i variablen strRemAdr så skift den ud med
strIp.

--
Med Venlig Hilsen
Jørgen Müller
www.smaabaadsklub.dk



Erik Ginnerskov (13-02-2006)
Kommentar
Fra : Erik Ginnerskov


Dato : 13-02-06 18:01

Jørgen Müller wrote:

> Brugerens IP adresse ligger ikke i variablen strRemAdr så skift den
> ud med strIp.

Det var lige præcis det, der gjorde udslaget. Nu kan jeg skrive i
gæstebogen, hvis mit IP-nummer ikke står på listen, men bliver blokeret,
hvis mit nummer er på listen.

Tak for hjælpen alle tre.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Jens Gyldenkærne Cla~ (08-02-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 08-02-06 14:26

Erik Ginnerskov skrev:

> Jeg prøvede dette:
>
> strIp = Request.ServerVariables("REMOTE_ADDR")
> 'select ip from ip_ban_list where ip = '127.0.0.1' 'ny linje


Linjen herover er udkommenteret og dermed ikke aktiv.


> strError = "<li>Desværre, der opstod en fejl." &_ 'ny linje


- så i praksis angiver du bare strError hver eneste gang.


> ... og lavede en tabel ip_ban_list, hvor jeg indsatte en række
> numre, som jeg har fået lov til at eksperimentere med (mit
> eget er ikke inkluderet her).

Du skal køre sql-sætningen mod databasen først. I princippet kan du
bare teste om der returneres noget eller ej:

   sql = "SELECT 1 FROM ip_ban_list WHERE ip = '12.23.34.56'
   set rs = conn.Execute (sql)
   If rs.EOF Then
       ' Alt o.k. - ingen poster = ip-nummer ikke på listen
   Else
       ' Ip-nummer fundet, bloker indlægget
   End If
   rs.close
   set rs = nothing


> Jeg fåri stedet udskrevet den specifiserede fejlmeddelelse.

En lille kommentar - jeg synes du skal fortælle at indlægget
blokeres fordi ip-nummeret har været misbrugt til spam. Jeg kan
ikke se nogen grund til at forklæde en blokering som en fejl.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

David Trasbo (08-02-2006)
Kommentar
Fra : David Trasbo


Dato : 08-02-06 14:55

Jens Gyldenkærne Clausen skrev:

> En lille kommentar - jeg synes du skal fortælle at indlægget
> blokeres fordi ip-nummeret har været misbrugt til spam. Jeg kan
> ikke se nogen grund til at forklæde en blokering som en fejl.

Helt enig! Den kunne f.eks. se sådan her ud:

"Du kan ikke skrive i min gæstebog, da din IP-adresse er blevet blokeret for
at forhindre at gæstebogen bliver udsat for spam."

--
David Trasbo.
Vær en god Usenet-bruger. http://usenet.dk/netikette.



Erik Ginnerskov (08-02-2006)
Kommentar
Fra : Erik Ginnerskov


Dato : 08-02-06 21:19

Jens Gyldenkærne Clausen wrote:

>> 'select ip from ip_ban_list where ip = '127.0.0.1' 'ny linje

> Linjen herover er udkommenteret og dermed ikke aktiv.

Det så jeg selv to minutter efter at heg skrev om fejlfunktionen. Jeg flover
mig.

> Du skal køre sql-sætningen mod databasen først. I princippet kan du
> bare teste om der returneres noget eller ej:
>
> sql = "SELECT 1 FROM ip_ban_list WHERE ip = '12.23.34.56'
> set rs = conn.Execute (sql)
> If rs.EOF Then
> ' Alt o.k. - ingen poster = ip-nummer ikke på listen
> Else
> ' Ip-nummer fundet, bloker indlægget
> End If
> rs.close
> set rs = nothing

Jeg prøver den ændring og ser, hvad der så sker.

> En lille kommentar - jeg synes du skal fortælle at indlægget
> blokeres fordi ip-nummeret har været misbrugt til spam. Jeg kan
> ikke se nogen grund til at forklæde en blokering som en fejl.

Formuleringen var udtænkt på basis af at ville lave en blokering for et
range af IP-numre, hvor iblandt der teoretisk kunne forekomme hæderlige
brugere. Jeg ønskede ikke at fornærme disse nogen med en påstand om, at de
spammede mig.

Men selvfølgelig er det hensyn ligegyldigt, hvis blokeringen kun rammer
IP-numre, som faktisk har hældt lo.. i min gæstbog.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Erik Ginnerskov (08-02-2006)
Kommentar
Fra : Erik Ginnerskov


Dato : 08-02-06 21:48

Jens Gyldenkærne Clausen wrote:

> Du skal køre sql-sætningen mod databasen først.

Nu har den del af mit script denne udformning:

If Request.Form("Gem") <> "" Then
strError = ""
strNavn = Trim(Request.Form("Navn"))
strEmail = Trim(Request.Form("Email"))
strIp = Request.ServerVariables("REMOTE_ADDR")
sql = "SELECT 1 FROM ip_ban_list WHERE ip = '12.23.34.56'"
set rs = conn.Execute (sql) 'linje 18 her
If rs.EOF Then
Else
End If
rs.close


Nu får jeg denne fejlmelding:

Fejltype:
Der opstod en Microsoft VBScript-kørselsfejl (0x800A01A8)
Et objekt er obligatorisk: 'conn'
/guestbook.asp, line 18

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Jens Gyldenkærne Cla~ (09-02-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 09-02-06 00:55

Erik Ginnerskov skrev:

> Nu får jeg denne fejlmelding:
>
> Fejltype:
> Der opstod en Microsoft VBScript-kørselsfejl (0x800A01A8)
> Et objekt er obligatorisk: 'conn'
> /guestbook.asp, line 18

Du skal initialisere din dataforbindelse. Jeg går ud fra at du
allerede har noget kode der skriver til databasen - du kan sagtens
bruge samme dataforbindelse.

Helt generelt vil jeg også råde dig til at bruge option explicit -
så får du fejl når du ikke erklærer dine variable - det er som
regel hurtigere at finde fejl når den slags er på plads.

--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Erik Ginnerskov (09-02-2006)
Kommentar
Fra : Erik Ginnerskov


Dato : 09-02-06 05:55

Jens Gyldenkærne Clausen wrote:

> Du skal initialisere din dataforbindelse. Jeg går ud fra at du
> allerede har noget kode der skriver til databasen - du kan sagtens
> bruge samme dataforbindelse.

Jeg inkluderer øverst i dokumentet en dbconnect.asp:

<!-- #include file="dbconnect.asp" -->

dbconnect.asp ser sådan ud:

<%
tempConn = "Data Source=[path
to]\guestbook.mdb;Provider=Microsoft.Jet.OLEDB.4.0;"
%>

Hvad vil du have tilføjet og hvor? Der er i databasefilen to tabeller:
guestbook og ip_ban_list. Den første tabel kan jeg fint læse. I tabellen
ip_ban_list er der en kolonne: ip.

> Helt generelt vil jeg også råde dig til at bruge option explicit -
> så får du fejl når du ikke erklærer dine variable - det er som
> regel hurtigere at finde fejl når den slags er på plads.

Det vil jeg kigge på i løbet af weekenden, hvis vi ikke forinden har fået
det til at funke uden.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Jens Gyldenkærne Cla~ (13-02-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 13-02-06 09:42

Jørn Andersen skrev:

> Desuden er jeg lidt udsikker på "l" i "SELECT 1" - er det et
> feltnavn? Ellers brug evt. SELECT *

Det er tallet 1 der står som eneste feltnavn - det er fordi man
sådan set slet ikke behøver at hente nogen værdi fra databasen, man
skal bare se om der returneres poster eller ej.

Man kunne også skrive:

   SELECT NULL FROM ...
   SELECT True FROM ...
   SELECT 'fundet' FROM ...

- pointen er bare at man skal have ét eller andet at returnere. Når
man (jeg) ikke bare skriver SELECT *, er det fordi man så beder om
at få en hel række felter man slet ikke har brug for overført fra
databasen. En mindre radikal løsning end SELECT 1 kunne være at
hente et enkelt felt (ligegyldigt hvilket, men helst et lille et):

   SELECT idFelt FROM ...

--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Jens Gyldenkærne Cla~ (13-02-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 13-02-06 12:06

Jørn Andersen skrev:

> Vær opmærksom på, at hvis du *ikke* bruger den mulighed, så
> skal
>> rs.close
>> set rs = nothing
> være uden for if'en. Ellers bliver rs-objektet ikke "dræbt".

Uanset om man laver redirect inde i if-sætningen eller ej skal man
lukke og slukke rs efter if-sætningen. Der skal jo også lukkes når
der ikke viderestilles.

Helt generelt skal man sørge for at rydde pænt op (lukke
dataobjekter og -forbindelser) hver gang man har brugt dem. Hvis
man benytter viderestilling, skal man huske at lave oprydningen før
man forlader siden.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Erik Ginnerskov (11-02-2006)
Kommentar
Fra : Erik Ginnerskov


Dato : 11-02-06 01:23

Jens Gyldenkærne Clausen wrote:

> Helt generelt vil jeg også råde dig til at bruge option explicit -
> så får du fejl når du ikke erklærer dine variable

Det har jeg nu prøvet, og får så denne fejlmelding:

Fejltype:
ADODB.Recordset (0x800A0CC1)
Elementet kan ikke findes i den samling, der svarer til det anmodede navn
eller ordenstal.
/guestbook.inc, line 44

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Jørn Andersen (11-02-2006)
Kommentar
Fra : Jørn Andersen


Dato : 11-02-06 02:14

On Sat, 11 Feb 2006 01:23:11 +0100, "Erik Ginnerskov"
<erik@donotspammmeplease.invalid> wrote:

>Jens Gyldenkærne Clausen wrote:
>
>> Helt generelt vil jeg også råde dig til at bruge option explicit -
>> så får du fejl når du ikke erklærer dine variable
>
>Det har jeg nu prøvet, og får så denne fejlmelding:
>
>Fejltype:
>ADODB.Recordset (0x800A0CC1)
>Elementet kan ikke findes i den samling, der svarer til det anmodede navn
>eller ordenstal.
>/guestbook.inc, line 44

Hvilket betyder, at der ikke er overensstemmelse mellem databasen (din
SQL) og de værdier du forsøger at trække ud af dit recordset.

--
Jørn Andersen,
Brønshøj

Jens Gyldenkærne Cla~ (09-02-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 09-02-06 14:54

Erik Ginnerskov skrev:

> Jeg inkluderer øverst i dokumentet en dbconnect.asp:
>
> <!-- #include file="dbconnect.asp" -->
>
> dbconnect.asp ser sådan ud:
>
> <%
> tempConn = "Data Source=[path
> to]\guestbook.mdb;Provider=Microsoft.Jet.OLEDB.4.0;"

I tempConn har du din connectionstring - men du må også have et
connectionobjekt et sted.

Prøv at kigge på opbygningen af eksemplet i asp-tutorialen:
<http://www.html.dk/tutorials/asp/lektion18.asp>

Din tempConn svarer til eksemplets DSN. Et andet sted i din fil
(eller i en inkluderet fil) må du have to linjer med:

Set XXX = Server.CreateObject("ADODB.Connection")
XXX.Open tempConn

(hvor XXX er det navn du anvender til din forbindelse).
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

terje (09-02-2006)
Kommentar
Fra : terje


Dato : 09-02-06 19:42

Jens. Burde ikke den artikkelen omskrives? For eksempel slik:

With oConn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" &
Server.MapPath("MinDatabase.mdb") & ";User Id=;Password="
.Open
End With

terje?

Erik Ginnerskov (11-02-2006)
Kommentar
Fra : Erik Ginnerskov


Dato : 11-02-06 00:56

Jens Gyldenkærne Clausen wrote:

> I tempConn har du din connectionstring - men du må også have et
> connectionobjekt et sted.

> Din tempConn svarer til eksemplets DSN. Et andet sted i din fil
> (eller i en inkluderet fil) må du have to linjer med:
>
> Set XXX = Server.CreateObject("ADODB.Connection")
> XXX.Open tempConn

Du har ret. I det modul, der læser gæstebogen, har jeg et par linjer:

strSQL = "SELECT * FROM Guestbook ORDER BY Dato DESC;"
Set myConn = Server.CreateObject("ADODB.Connection")
myConn.Open tempConn
Set rs = myConn.Execute(strSQL)

Jeg prøvede at lave en linje mere efter den første af linjerne herover:

strSQL = "SELECT * FROM ip_ban_list;" 'den nye tabel

Men jeg får stadig fejlen:

Fejltype:
Der opstod en Microsoft VBScript-kørselsfejl (0x800A01A8)
Et objekt er obligatorisk: 'conn'
/guestbook.asp, line 18

Du kan se hele det originale - før jeg i begyndelsen af ugen begyndte at
logge IP-numre - filsæt her:

http://hjemmesideskolen.dk/files/aspguestbook.zip

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Jørn Andersen (11-02-2006)
Kommentar
Fra : Jørn Andersen


Dato : 11-02-06 01:49

On Sat, 11 Feb 2006 00:55:35 +0100, "Erik Ginnerskov"
<erik@donotspammmeplease.invalid> wrote:

> myConn.Open tempConn
<snip>

>Men jeg får stadig fejlen:
>
> Fejltype:
> Der opstod en Microsoft VBScript-kørselsfejl (0x800A01A8)
> Et objekt er obligatorisk: 'conn'
> /guestbook.asp, line 18

Kan det være et spørgsmål om, at du det enes ted alder den "tempConn"
og det andet sted bar "conn" - ?

Eller har jeg bare ikke forstået de finere nuancer?


--
Jørn Andersen,
Brønshøj

Jens Gyldenkærne Cla~ (11-02-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 11-02-06 17:58

Erik Ginnerskov skrev:

> Jeg prøvede at lave en linje mere efter den første af linjerne
> herover:
>
> strSQL = "SELECT * FROM ip_ban_list;" 'den nye tabel

Er ovenstående den linje du har tilføjet? Linjen herover gør ikke
noget i forhold til databasen - den tildeler kun en strengværdi
(SELECT....) til en strengvariabel (strSQL).
Det er vigtigt at forstå at for at få kontakt til en database, skal
man køre en kommando gennem et connection-objekt - uanset om basen
skal opdateres eller man skal hente informationer fra den. Når man
skriver:
   strSQL = "SELECT foo FROM bar"
- og lignende, er det kun fordi det gør det lettere at holde styr
på sql-koden. Det er først i det øjeblik at man sender sql-koden
til basen at der sker noget:

   set X = Y.Execute(strSQL)

- hvor X er navnet på dit postsæt og Y er navnet på din
forbindelsesvariabel. Typisk kalder man X for rs og Y for conn,
objConn, myconn eller lignende.


> Fejltype:
> Der opstod en Microsoft VBScript-kørselsfejl (0x800A01A8)
> Et objekt er obligatorisk: 'conn'
> /guestbook.asp, line 18

- og hvordan ser din linje 18 ud?

Som Jørn er inde på, er problemet nok bare at du bruger conn et
sted, og myConn (eller tempConn) et andet sted.

> Du kan se hele det originale - før jeg i begyndelsen af ugen
> begyndte at logge IP-numre - filsæt her:

Ellers tak - det er mere relevant at se de linjer der fejler nu.
Læs gerne siden her: <http://asp-faq.dk/article/?id=41>.

--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Erik Ginnerskov (11-02-2006)
Kommentar
Fra : Erik Ginnerskov


Dato : 11-02-06 23:38

Jens Gyldenkærne Clausen wrote:

>> Fejltype:
>> Der opstod en Microsoft VBScript-kørselsfejl (0x800A01A8)
>> Et objekt er obligatorisk: 'conn'
>> /guestbook.asp, line 18
>
> - og hvordan ser din linje 18 ud?

Ups, det glemte jeg at anføre. Jeg skal tilstræbe, at det ikke sker igen.
Jeg ved det jo godt. ;)

> Ellers tak - det er mere relevant at se de linjer der fejler nu.

Jeg har lavet nogle kopier af de involverede filer:

http://hjemmesideskolen.dk/usenet/guestbookasp.txt
http://hjemmesideskolen.dk/usenet/guestbookinc.txt
http://hjemmesideskolen.dk/usenet/dbconnectasp.txt
http://hjemmesideskolen.dk/usenet/headerinc.txt

Databasen guestbook.mdb indeholder to tabeller:

I tabellen guestbook er en kolonne "ip", hvori der nu skrives
IP-nummer for alle nye indlæg - den del virker.

I tabellen ip_ban_list er en kolonne "bannedip", hvori jeg indtil videre
ved håndkraft indskriver de IP-numre, der ikke skal have lov til at
skrive i gæstebogen.

Som koden ser ud nu, får jeg denne fejlmelding, når jeg prøver at skrive i
gæstebogen:

Fejltype:
Der opstod en Microsoft VBScript-kørselsfejl (0x800A01A8)
Et objekt er obligatorisk: 'PROVIDER=MSDASQL;DRI'
/guestbook.asp, line 30

Linje 30 er denne:

If Request.Form("Gem") <> "" Then
strError = ""
strNavn = Trim(Request.Form("Navn"))
strEmail = Trim(Request.Form("Email"))
strIp = Request.ServerVariables("REMOTE_ADDR")
sql = "SELECT 1 FROM ip_ban_list WHERE bannedip = '12.23.34.56'"
set rs = tempConn.Execute (sql) 'linje
30 her
If rs.EOF Then
' Alt o.k. - ingen poster = ip-nummer ikke på listen
Else
' Ip-nummer fundet, bloker indlægget
End If
rs.close
set rs = nothing

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Jørn Andersen (12-02-2006)
Kommentar
Fra : Jørn Andersen


Dato : 12-02-06 00:51

On Sat, 11 Feb 2006 23:38:23 +0100, "Erik Ginnerskov"
<erik@donotspammmeplease.invalid> wrote:

>Jeg har lavet nogle kopier af de involverede filer:
>
>http://hjemmesideskolen.dk/usenet/guestbookasp.txt
>http://hjemmesideskolen.dk/usenet/guestbookinc.txt
>http://hjemmesideskolen.dk/usenet/dbconnectasp.txt
>http://hjemmesideskolen.dk/usenet/headerinc.txt
<snip>

>Som koden ser ud nu, får jeg denne fejlmelding, når jeg prøver at skrive i
>gæstebogen:
>
> Fejltype:
> Der opstod en Microsoft VBScript-kørselsfejl (0x800A01A8)
> Et objekt er obligatorisk: 'PROVIDER=MSDASQL;DRI'
> /guestbook.asp, line 30
>
>Linje 30 er denne:
> set rs = tempConn.Execute (sql) 'linje 30 her

I din dbconnect.asp har du:
tempConn = "Data Source=[path til
databasefilen]\guestbook.mdb;Provider=Microsoft.Jet.OLEDB.4.0;"
- men tempConn er ikke et object, men blot DSN-strengen.

For at lave et object skal man bruge Set. For at *bruge* objektet skal
det indeholde et eller andet meningsfyldt.

Hvis du omdøber tempConn til strDsn, og indsætter følgende to linier
før din linie 30:
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open strDsn

- og ændrer din linie 30 til:
Set rs = objConn.Execute(sql)

- så tror jeg den er ved at være der. Jeg har ikke tjekket, om du har
andre variable, der hedder objConn eller strDsn, så check selv dette.
Og husk at Dim'e dine nye variable.


Good luck!

--
Jørn Andersen,
Brønshøj

Erik Ginnerskov (13-02-2006)
Kommentar
Fra : Erik Ginnerskov


Dato : 13-02-06 00:06

Jørn Andersen wrote:

Opdateret med seneste ændringer:

http://hjemmesideskolen.dk/usenet/guestbookasp.txt
http://hjemmesideskolen.dk/usenet/guestbookinc.txt
http://hjemmesideskolen.dk/usenet/dbconnectasp.txt


> Hvis du omdøber tempConn til strDsn, og indsætter følgende to linier
> før din linie 30:
> Set objConn = Server.CreateObject("ADODB.Connection")
> objConn.Open strDsn
>
> - og ændrer din linie 30 til:
> Set rs = objConn.Execute(sql)

Det har jeg nu prøvet.

Nu påstår scriptet, at mit IP-nummer har været brugt til spamming, så jeg
får ikke lov til at skrive noget i gæstebogen. Men mit IP-nummer står _ikke_
i den databasetabel, der indeholder de forbudte numre.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Erik Ginnerskov (13-02-2006)
Kommentar
Fra : Erik Ginnerskov


Dato : 13-02-06 23:44

Erik Ginnerskov wrote:

> I første omgang vil jeg registrere de IP-numre, som nye indlæg sendes
> fra - numrene skal ikke vises i den offentlige gæstebog, kun i min
> hemmelige administrationsside.

> Men
> hvordan får jeg lavet en spærring, så afsendere fra 'forbudte
> adresser ikke kan skrive i gæstebogen?

De to hurdler er nu klaret. Nu skal jeg have lavet en side, hvorfra jeg
online kan indskrive nye numre på listen, der skal blokeres.

Jeg har omskrevet koden i guestbook.asp og er foreløbig kommet så langt:

http://hjemmesideskolen.dk/usenet/ipbanasp.txt
http://hjemmesideskolen.dk/usenet/ipbaninc.txt

Når jeg indlæser ipban.asp i browseren, får jeg denne fejlmelding (ikke i
stedet for siden, men på siden (den del, der bliver sendt, inden scriptet
fejler)):

Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC Driver Manager] Data source name not found and no default
driver specified
/ipban.inc, line 29

Linje 29 i ipban.inc er denne:

myConn.Open strDsn

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/




Jens Gyldenkærne Cla~ (14-02-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 14-02-06 00:15

Erik Ginnerskov wrote:

> Microsoft OLE DB Provider for ODBC Drivers error '80004005'
> [Microsoft][ODBC Driver Manager] Data source name not found and no
> default driver specified
> /ipban.inc, line 29
>
> Linje 29 i ipban.inc er denne:
>
> myConn.Open strDsn
>

Hvad indeholder strDSN?

Bruger du Option Explicit?


--
Jens G. Clausen

Erik Ginnerskov (14-02-2006)
Kommentar
Fra : Erik Ginnerskov


Dato : 14-02-06 00:38

Jens Gyldenkærne Clausen wrote:

> Hvad indeholder strDSN?

Ups, det var en fejl fra min side. Jeg havde glemt at opdatere dbconnect.asp
på nettet. Det opdagede jeg, da jeg lige skulle tjekke gæstebogen.

Den fejl er nu rettet. Men når jeg nu prøver at indlæse ipban.asp får jeg
denne fejlmelding:

Microsoft JET Database Engine error '80040e10'
No value given for one or more required parameters.
/ipban.inc, line 30

Fejlen udskrives samme sted som før. Linje 30 er denne:

Set rs = myConn.Execute(strSQL)

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Erik Ginnerskov (14-02-2006)
Kommentar
Fra : Erik Ginnerskov


Dato : 14-02-06 01:07

Erik Ginnerskov wrote:

> Men når jeg nu prøver at indlæse ipban.asp får
> jeg denne fejlmelding:
>
> Microsoft JET Database Engine error '80040e10'
> No value given for one or more required parameters.
> /ipban.inc, line 30

Ovenstående er når jeg indlæser siden fra serveren. Indlæser jeg siden
lokalt, får jeg denne fejlmelidng:

Fejltype:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E10)
[Microsoft][ODBC Microsoft Access-driver] Der er for få parametre. Der
var ventet 1.
/ipban.inc, line 30

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Jørn Andersen (14-02-2006)
Kommentar
Fra : Jørn Andersen


Dato : 14-02-06 09:13

On Tue, 14 Feb 2006 00:38:00 +0100, "Erik Ginnerskov"
<erik@donotspammmeplease.invalid> wrote:

>Den fejl er nu rettet. Men når jeg nu prøver at indlæse ipban.asp får jeg
>denne fejlmelding:
>
> Microsoft JET Database Engine error '80040e10'
> No value given for one or more required parameters.
> /ipban.inc, line 30
>
>Fejlen udskrives samme sted som før. Linje 30 er denne:
>
> Set rs = myConn.Execute(strSQL)

Det tyder på en fejl i din SQL-streng. Den slags finder man nemmest
ved at udskrive den. Indsæt (midlertidigt) før linje 30:

Response.Write strSQL
(og evt.:) Response.End

- så kan du se, om SQL-strengen ser rigtig ud, dvs. om der er
syntax-fejl, og om de variable, du har puttet ind i den faktisk er som
du forventer.


Good luck!

--
Jørn Andersen,
Brønshøj

Jens Gyldenkærne Cla~ (14-02-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 14-02-06 16:59

Jørn Andersen skrev:

>> Fejlen udskrives samme sted som før. Linje 30 er denne:
>>
>> Set rs = myConn.Execute(strSQL)
>
> Det tyder på en fejl i din SQL-streng. Den slags finder man
> nemmest ved at udskrive den.

Ja.

Erik, jeg vil foreslå dig at bruge 5-10 minutter på at læse
følgende artikler fra gruppens oss-side:

   <http://asp-faq.dk/article/?id=41>
   <http://asp-faq.dk/article/?id=9>

Jeg har ikke noget mod at hjælpe, men du kan spare en del indlæg
ved at læse startartiklen (41) før du spørger.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Erik Ginnerskov (14-02-2006)
Kommentar
Fra : Erik Ginnerskov


Dato : 14-02-06 18:39

Jens Gyldenkærne Clausen wrote:

> http://asp-faq.dk/article/?id=41

Jeg synes da ellers, at jeg har gjort, hvad der er mig muligt, for at give
så fyldestgørende oplysninger som muligt. I går kl. 23:44 gav jeg link til
txt-versioner af de involverede to filer. Men jeg skal da gerne gentage dem:

http://hjemmesideskolen.dk/usenet/ipbanasp.txt
http://hjemmesideskolen.dk/usenet/ipbaninc.txt

Filerne er opdateret med seneste ændringer.

> http://asp-faq.dk/article/?id=9

.... og jeg har indført "option explicit" - det gjorde jeg straks du spurgte
i går. Alle involverede variabler er blevet Dim'et.

Response.Write strAddLine
strSQL = "SELECT * FROM ip_ban_list ORDER BY Dato DESC;"
Set myConn = Server.CreateObject("ADODB.Connection")
myConn.Open strDsn
Set rs = myConn.Execute(strSQL) 'linje 30 her
If Not (rs.BOF Or rs.EOF) Then

Men nu prøvede jeg at fjerne "ORDER BY Dato DESC" fra linje 27. Det fik
scriptet til at bede om at få et par variabler mere Dim'et.

Derved kom udlæsningen af de registrerede IP-numre i tabellen til at virke.
Men jeg får ikke adgang til at skrive nye numre ind - når jeg har skrevet et
nummer i formularen og trykker "Send", får jeg denne fejlmeddelelse:

Fejltype:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E0C)
Der er ikke angivet nogen kommandotekst for kommandoobjektet.
/ipban.asp, line 19

If Request.Form("Gem") <> "" Then
strError = ""
strIp = Trim(Request.Form("Ip"))
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open strDsn
Set rs = objConn.Execute(sql) 'linje 19 her
If Len(strIp) = 0 Then
strError = "<li>Du skal skrive et IP-nummer!</li>"
End If

Jeg har stirret på og sammenlignet scriptet i guestbook.asp og ipban.asp og
i guestbook.inc og ipban.inc. Jeg kan ikke få øje på, hvorfor det ikke
makker ret.

Fuldt opdaterede txt-versioner af guestbook her:

http://hjemmesideskolen.dk/usenet/guestbookasp.txt
http://hjemmesideskolen.dk/usenet/guestbookinc.txt

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Jørn Andersen (14-02-2006)
Kommentar
Fra : Jørn Andersen


Dato : 14-02-06 22:35

On Tue, 14 Feb 2006 18:38:40 +0100, "Erik Ginnerskov"
<erik@donotspammmeplease.invalid> wrote:

>Men jeg får ikke adgang til at skrive nye numre ind - når jeg har skrevet et
>nummer i formularen og trykker "Send", får jeg denne fejlmeddelelse:
>
> Fejltype:
> Microsoft OLE DB Provider for ODBC Drivers (0x80040E0C)
> Der er ikke angivet nogen kommandotekst for kommandoobjektet.
> /ipban.asp, line 19

Hvis du vil slå fejlkoder op, så brug:
<url: http://www.aspfaq.com/>
og skriv fx 80040E0C ind i søgefeltet.

Det giver dig fx:
<url: http://www.aspfaq.com/show.asp?id=2041>

>If Request.Form("Gem") <> "" Then
> strError = ""
> strIp = Trim(Request.Form("Ip"))
> Set objConn = Server.CreateObject("ADODB.Connection")
> objConn.Open strDsn
> Set rs = objConn.Execute(sql) 'linje 19 her

Hvad siger den, når du udskriver sql'en med:
Response.Write sql
- ?
Hedder den sql eller strSql?

(Jeg har ikke orket at trawle dit script igennem, men prøver mest at
give nogle "metoder".)

Det med at udskrive SQL-strengen (eller andre variable, man er i tvivl
om) er nok et af de vigtigste værktøjer, og jeg tror det var det Jens
hintede ad med sine links. (Siden er desværre nede lige nu, så jeg kan
ikke checke.)


Good luck!

--
Jørn Andersen,
Brønshøj

Jens Gyldenkærne Cla~ (14-02-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 14-02-06 22:15

Erik Ginnerskov skrev:

> Jeg synes da ellers, at jeg har gjort, hvad der er mig muligt,
> for at give så fyldestgørende oplysninger som muligt. I går
> kl. 23:44 gav jeg link til txt-versioner

Linkene er udmærkede, men når det drejer sig om fejl i sql-
sætninger - en af de hyppigste fejl overhovedet - er det
væsentligste at få udskrevet indholdet i sql-variablen.
Det kan man ikke se alene ud fra kildekoden.

> ... og jeg har indført "option explicit" - det gjorde jeg
> straks du spurgte i går.

Det har jeg overset - beklager.


> Fejltype:
> Microsoft OLE DB Provider for ODBC Drivers (0x80040E0C)
> Der er ikke angivet nogen kommandotekst for
> kommandoobjektet. /ipban.asp, line 19

Her er det igen vigtigt at vide hvad du har i din sql-variabel (her
kaldet sql). Lige som den tidligere fejl er det meget hurtigt at
afklare ved at udskrive variablen på skærmen.

Ud fra fejlmeddelelsen gætter jeg på at du har "dimmet" den, men
glemt at lægge indhold i den (har du en linje med sql = "..." nogen
steder i filen?)

--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Erik Ginnerskov (15-02-2006)
Kommentar
Fra : Erik Ginnerskov


Dato : 15-02-06 02:51

Jens Gyldenkærne Clausen wrote:

>> Fejltype:
>> Microsoft OLE DB Provider for ODBC Drivers (0x80040E0C)
>> Der er ikke angivet nogen kommandotekst for
>> kommandoobjektet. /ipban.asp, line 19
>
> Her er det igen vigtigt at vide hvad du har i din sql-variabel (her
> kaldet sql). Lige som den tidligere fejl er det meget hurtigt at
> afklare ved at udskrive variablen på skærmen.

Jeg prøvede at indsætte en "Response.Write sql" efter "Set objConn =
Server.CreateObject("ADODB.Connection")"

Så får jeg abslolut ingenting ud. Helt hvid baggrund og ingenting i "Vis
kilde"

> Ud fra fejlmeddelelsen gætter jeg på at du har "dimmet" den, men
> glemt at lægge indhold i den (har du en linje med sql = "..." nogen
> steder i filen?)

Jeg havde ikke en sådan linje. Den havde jeg slettet, da jeg var af den
overbevisning, at den ikke skulle bruges i denne situation. Jeg kunne jo
uden problemer læse indholdet i tabellen. Men nu prøvede jeg at indsætte en
sådan linje:

If Request.Form("Gem") <> "" Then
strError = ""
strIp = Trim(Request.Form("Ip"))
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open strDsn
sql = "SELECT * FROM ip_ban_list WHERE bannedip = '" & strIp & "'"
Response.Write sql
Response.end
Set rs = objConn.Execute(sql)

Så får jeg denne udskrift på skærmen:

SELECT * FROM ip_ban_list WHERE bannedip = 'xxx.xxx.x.xx'

Fjerner jeg udskriftkommandoen, får jeg denne fejlmelidng:

Fejltype:
ADODB.Recordset (0x800A0BB9)
Argumenterne har en forkert type eller er uden for det angivne
område, eller der er opstået en konflikt mellem dem.
/ipban.asp, line 29

Kode:

If Len(strError) = 0 Then
Set rs = Server.CreateObject("ADODB.RecordSet")
strSQL = "SELECT * FROM bannedip WHERE (ID = 0)"
rs.Open strSQL, strDsn, adOpenKeyset, adLockOptimistic 'linje 29
If (rs.BOF Or rs.EOF) Then

Slår jeg "800A0BB9" op på http://www.aspfaq.com/ får jeg en besked på at
skulle inkludere en fil, jeg ikke har og som jeg ikke kender indholdet på.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Jørn Andersen (15-02-2006)
Kommentar
Fra : Jørn Andersen


Dato : 15-02-06 05:46

On Wed, 15 Feb 2006 02:50:43 +0100, "Erik Ginnerskov"
<erik@donotspammmeplease.invalid> wrote:

>Så får jeg denne udskrift på skærmen:
>
> SELECT * FROM ip_ban_list WHERE bannedip = 'xxx.xxx.x.xx'

SO far so good - så ved du, at du har en SQL-streng, og at den ser
fornuftig ud.

>Fjerner jeg udskriftkommandoen, får jeg denne fejlmelidng:
>
> Fejltype:
> ADODB.Recordset (0x800A0BB9)
> Argumenterne har en forkert type eller er uden for det angivne
> område, eller der er opstået en konflikt mellem dem.
> /ipban.asp, line 29
>
>Kode:
>
> If Len(strError) = 0 Then
> Set rs = Server.CreateObject("ADODB.RecordSet")
> strSQL = "SELECT * FROM bannedip WHERE (ID = 0)"
> rs.Open strSQL, strDsn, adOpenKeyset, adLockOptimistic 'linje 29
> If (rs.BOF Or rs.EOF) Then
>
>Slår jeg "800A0BB9" op på http://www.aspfaq.com/ får jeg en besked på at
>skulle inkludere en fil, jeg ikke har og som jeg ikke kender indholdet på.

Du har sikkert set på denne side:
<url: http://www.aspfaq.com/show.asp?id=2102>

- som peger videre på en forklaring her:
<url: http://www.aspfaq.com/show.asp?id=2112>


Det du mangler er ADO-konstanter til VB Script, i dette tilfælde
> adOpenKeyset, adLockOptimistic 'linje 29

Og som der står på siden kan man
a) enten includere en ret stor fil med alle konstanter: ADOVBS.INC
b) eller indsætte de konstanter man faktisk bruger
c) eller bruge konstanternes værdier og blot notere sig deres navne i
en kommentar
d) bruge en METADATA-erklæring, som kun indlæser de nødvendige
værdier.

Du *har* sikkert en adovbs.inc på din maskine (hos mig ligger den
langt nede i en undermappe under D:\Windows).
Her kan du slå værdierne op. Dem du har brug for her er:

'---- CursorTypeEnum Values ----
Const adOpenForwardOnly = 0
Const adOpenKeyset = 1
Const adOpenDynamic = 2
Const adOpenStatic = 3

'---- LockTypeEnum Values ----
Const adLockReadOnly = 1
Const adLockPessimistic = 2
Const adLockOptimistic = 3
Const adLockBatchOptimistic = 4

Indsæt dem øverst i dokumentet (eller evt. i en fælles include-fil,
hvis de skal genbruges) eller skriv blot værdierne:
rs.Open strSQL, strDsn, 1, 3 'linje 29

Hvis du kigger øverst i din:
<url: http://hjemmesideskolen.dk/usenet/guestbookasp.txt>
kan du se, at man her har defineret dem øverst:
Const adOpenKeyset = 1
Const adLockOptimistic = 3


Good luck!

--
Jørn Andersen,
Brønshøj

Erik Ginnerskov (15-02-2006)
Kommentar
Fra : Erik Ginnerskov


Dato : 15-02-06 23:09

Jørn Andersen wrote:

> Const adOpenKeyset = 1
> Const adLockOptimistic = 3

Ved at indsætte de to linjer øverst i scriptet, lige efter "option
explicit", fik jeg denne fejlmelding:

Fejltype:
Der opstod en Microsoft VBScript-kompileringsfejl (0x800A0411)
Navnet er omdefineret
/ipban.asp, line 10, column 20
Dim strIp, objConn, adOpenKeyset, adLockOptimistic, sql
-------------------^

Jeg prøvede så at slette "adOpenKeyset" og "adLockOptimistic" i linjen
her over. Så får jeg i stedet denne fejl, når jeg prøver at skrive nyt IP i
blokadelisten:

Fejltype:
ADODB.Recordset (0x800A0CC1)
Elementet kan ikke findes i den samling, der svarer til det
anmodede navn eller ordenstal.
/ipban.asp, line 28

Koden:

If Len(strError) = 0 Then
Set rs = Server.CreateObject("ADODB.RecordSet")
strSQL = "SELECT * FROM ip_ban_list WHERE (ID = 0)"
rs.Open strSQL, strDsn, 1, 3
If (rs.BOF Or rs.EOF) Then
rs.AddNew
rs("Ip") = Server.HTMLEncode(strIp) 'linje 28 her
rs.Update
End If

Det fik mig til at tænke, om rs("Ip") vil skrive til et felt, som hedder
"Ip". Jeg rettede så den linje til

rs("BannedIp") = Server.HTMLEncode(strIp)

Og så lykkedes det lige pludselig at få lov til at skrive nye IP-numre i
databasen over de numre, der skal blokeres.

Jeg takker for kampen og undskylder, hvis jeg har været lidt tung at danse
med. ;)

I øvrigt ser det ud som om det hele har været en "Don Quixotes kamp mod
vindmøllerne". Alene i dag har jeg slettet 8 spamindlæg fra 6 forskellige
IP-numre og de indtil nu registrerede numre ligger meget spredt med
tilsyneladende også danske numre involveret.

Derfor har jeg mistanke om, at banditten ved hjælp af en Trojaner er i stand
til at spoofe en masse forskellige sagesløse (?) menneskers adresser.

Hvis ikke snart den tæppebombning aftager, kan jeg meget mod min vilje blive
nødt til at lukke min gæstebog for en tid og derefter omdøbe den til noget
andet inden næste forsøg på at have den kørende.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Jørn Andersen (16-02-2006)
Kommentar
Fra : Jørn Andersen


Dato : 16-02-06 01:22

On Wed, 15 Feb 2006 23:09:11 +0100, "Erik Ginnerskov"
<erik@donotspammmeplease.invalid> wrote:

>Og så lykkedes det lige pludselig at få lov til at skrive nye IP-numre i
>databasen over de numre, der skal blokeres.

Tillykke med, at det lykkedes!

>Jeg takker for kampen og undskylder, hvis jeg har været lidt tung at danse
>med. ;)

Da jeg startede med ASP for 3-4 år siden havde jeg aldrig arbejdet med
nogen form for programmering før, men jeg havde 3 ugers restferie, som
skulle afvikles, og hvor jeg ikke havde ret mange andre planer. Så den
stod stort set på ASP fra morgen til aften 3-4 dage om ugen.

Der er lige en indkøringsperiode, hvor man støder på nye ting så tit,
at man hele tiden mister overblikket. Uden denne gruppe og Wrox's
ASP-bog var jeg aldrig kommet over denne første fase.

ASP er jo et miljø, hvor der er mange forskellige ting, der skal
spille sammen, før man får et resultat. Men med lidt stædig
vedholdenhed og en masse hjælp fra mere erfarne, så hjælper det
efterhånden. Når man så begynder at kunne få ting til at virke, så
kommer kampen for at skrive noget bedre kode ... så der er hele tiden
nyt at lære.


Good luck!

--
Jørn Andersen,
Brønshøj

Jens Gyldenkærne Cla~ (15-02-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 15-02-06 10:58

Jørn Andersen skrev:

> Det med at udskrive SQL-strengen (eller andre variable, man er
> i tvivl om) er nok et af de vigtigste værktøjer, og jeg tror
> det var det Jens hintede ad med sine links.

Netop (samt et hint vedr. option explicit som Erik allerede havde
fulgt).


> (Siden er desværre nede lige nu, så jeg kan ikke checke.)

Den er heldigvis oppe igen.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Jens Gyldenkærne Cla~ (15-02-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 15-02-06 23:57

Erik Ginnerskov skrev:

>> Const adOpenKeyset = 1
>> Const adLockOptimistic = 3

[snip]

> Fejltype:
> Der opstod en Microsoft VBScript-kompileringsfejl
> (0x800A0411) Navnet er omdefineret

Det er fordi du først erklærer to konstanter og derefter to
variable med samme navne - den går ikke.


> Jeg prøvede så at slette "adOpenKeyset" og "adLockOptimistic"
> i linjen her over.

Godt, så er der en fejl mindre.

> Det fik mig til at tænke, om rs("Ip") vil skrive til et felt,
> som hedder "Ip".

- rigtigt tænkt.


> Jeg rettede så den linje til
>
> rs("BannedIp") = Server.HTMLEncode(strIp)
>
> Og så lykkedes det lige pludselig at få lov til at skrive nye
> IP-numre i databasen over de numre, der skal blokeres.

Tillykke.


> I øvrigt ser det ud som om det hele har været en "Don Quixotes
> kamp mod vindmøllerne". Alene i dag har jeg slettet 8
> spamindlæg fra 6 forskellige IP-numre og de indtil nu
> registrerede numre ligger meget spredt med tilsyneladende også
> danske numre involveret.

Se evt. tråden "Irriterende indlæg i gæstebogen" i
dk.edb.internet.webdesign - hvor der er flere gode forslag til at
undgå gæstebogsspam. Tokes forslag om et felt man ikke må skrive i,
ser interessant ud. Jeg tror nu også at mit eget - der blot går ud
på at omdøbe gæstebogen så adressen ikke afslører at det er en
gæstebog - vil være ret effektivt.

Det er selvfølgelig lidt bøvlet når du allerede har en
guestbook.asp, men man kunne fx ændre guestbook.asp til en flad
side der fortæller at adressen er ændret på grund af spam, og beder
folk benytte et link i menuen til den nye gæstebog.

--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Erik Ginnerskov (16-02-2006)
Kommentar
Fra : Erik Ginnerskov


Dato : 16-02-06 14:49

Jens Gyldenkærne Clausen wrote:

>> Og så lykkedes det lige pludselig at få lov til at skrive nye
>> IP-numre i databasen over de numre, der skal blokeres.
>
> Tillykke.

Takker.

> Se evt. tråden "Irriterende indlæg i gæstebogen" i
> dk.edb.internet.webdesign

Den tråd inspirerede mig til at ville tilføje et skjult <input type="text
....>. Det er bare så irriterende, at man dagligt skal slette adskillige
indlæg af den dybt underlødige slags (7-9-13, der her endnu ikke været nogen
i dag).

I formularen har jeg indsat dette:

<p style="display:none">
<label for="sub">Subject:</label><input type="text" id="sub" name="subject"
value="<%=strSubject%>" /><br />
</p>

Og i det script, der modtager og behandler formulardata har jeg tilføjet
dette:

Dim Subject, strSubject
......
strSubject = Trim(Request.Form("Subject"))
If Len(strSubject) = not 0 Then
' Der er blevet skrevet i Subject, bloker indlægget
rs.close
set rs = nothing
Response.Redirect "blokeret.asp"
End If

Men der er en syntaksfejl i den anden linje. Jeg bliver ikke blokeret, hvis
jeg (har midlertidigt gjort indtastningsfeltet synligt) har skrevet i
Subject.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Jens Gyldenkærne Cla~ (16-02-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 16-02-06 15:10

Erik Ginnerskov skrev:

> If Len(strSubject) = not 0 Then

Hvis du kigger nærmere på ovenstående linje, tror jeg godt du kan
finde fejlen selv.


Hvis ikke, kan du få et par løsningsforslag her:

If Not Len(strSubject) = 0 Then

If Len(strSubject) <> 0 Then

If strSubject <> "" Then


--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Erik Ginnerskov (16-02-2006)
Kommentar
Fra : Erik Ginnerskov


Dato : 16-02-06 15:44

Jens Gyldenkærne Clausen wrote:
> Erik Ginnerskov skrev:
>
>> If Len(strSubject) = not 0 Then
>
> Hvis du kigger nærmere på ovenstående linje, tror jeg godt du kan
> finde fejlen selv.

Umiddelbart synes jeg da, at formuleringen lyder rigtig. Men det virker som
sagt ikke.

> Hvis ikke, kan du få et par løsningsforslag her:
>
> If Not Len(strSubject) = 0 Then
>
> If Len(strSubject) <> 0 Then
>
> If strSubject <> "" Then

Det gør alle tre af dine forslag til gengæld. Så skulle der - i kombination
med, at jeg allerede har omdøbt gæstebogen - efterhånden være sat en
effektiv stopper for det svineri.

Jeg takker endnu en gang.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Jens Gyldenkærne Cla~ (16-02-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 16-02-06 16:11

Erik Ginnerskov skrev:

>>> If Len(strSubject) = not 0 Then
>>
>> Hvis du kigger nærmere på ovenstående linje, tror jeg godt du
>> kan finde fejlen selv.
>
> Umiddelbart synes jeg da, at formuleringen lyder rigtig.

Not er en boolsk operator - den skal derfor anvendes på et boolsk
udtryk (et udtryk der er sandt eller falsk). I dit udtryk herover
vil højresiden ( Not 0 ) formentlig blive til værdien -1.
Det sker fordi:

1: Len(strSubject) beregnes til et tal (fx 17)
2: Asp skal beregne Not 0
3: Not er en boolsk operator, mens 0 i asp-sammenhæng kan læses som
værdien False - derfor udregnes:
   Not 0 => Not False => True
4: Nu foretages sammenligningen 17 = True. Asp er stadig meget
tolerant mht. typeerklæringer, så True laves straks om til
talværdien -1. Dermed udregnes der:
   17 = True => 17 = -1 => False

Dermed bliver if-sætningen falsk.

Not skal bruges til at negere et helt boolsk udtryk:

   If Not X

   If Not (X AND Y)
   
   If (Not X) OR Y

Hvis man vil "vende" et lighedstegn, kan man derfor bruge:

   If Not (X = Y)

- eller

   If X <> Y

- men hverken

   If X Not = Y

eller

   If X = Not Y


--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Erik Ginnerskov (16-02-2006)
Kommentar
Fra : Erik Ginnerskov


Dato : 16-02-06 16:23

Jens Gyldenkærne Clausen wrote:

> Not skal bruges til at negere et helt boolsk udtryk:
>
> If Not X
> If Not (X AND Y)
> If (Not X) OR Y
>
> Hvis man vil "vende" et lighedstegn, kan man derfor bruge:
>
> If Not (X = Y)
> - eller
> If X <> Y
>
> - men hverken
>
> If X Not = Y
> eller
> If X = Not Y

Så er vi ovre i den højere matematik. Den slags har jeg ikke beskæftiget mig
ret meget med i 40 år, så der er vist lidt, som er gået i glemmebogen. ;)

Anyway, det kom til at virke.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://ginnerskov.dk
http://html-faq.dk/



Søg
Reklame
Statistik
Spørgsmål : 177496
Tips : 31968
Nyheder : 719565
Indlæg : 6408491
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste