Avatar billede obhat Nybegynder
29. juli 2005 - 07:28 Der er 116 kommentarer og
2 løsninger

Tjek for 404

Jeg har en database med en række links, som jeg gerne vil kunne tjekke for 404 - om siden er tilgængelig.

Kan det laves med ASP, så poster med døde links slettes?
Avatar billede softspot Forsker
29. juli 2005 - 09:11 #1
Ja, du kan bruge MSXML2.XMLHTTP ActiveX-komponenten til at lave opslag med.
Avatar billede softspot Forsker
29. juli 2005 - 09:14 #2
Check f.eks. dette link:

http://eksperten.dk/spm/531329
Avatar billede softspot Forsker
29. juli 2005 - 09:20 #3
Men det kan da godt være du skal lave en form for statistik på et link inden du sletter det helt. Det kan jo være at serveren bare er nede for en kortere periode... :)
Avatar billede hiks Nybegynder
29. juli 2005 - 15:51 #4
hej

jeg tror også jeg ville lave een form for tæller tilknyttet hvert enkelt link i databasen - der så kan angive en form for status af linket/linkets kvalitet. At det fejler een gang med 404 eller lign. kan skyldes mange ting. Så kan du også logisk angive en max grænse for når at linket skal slettes og ellers angive linkets "kvalitet" men nogle stjerner eller lign.

bemærk at xmlhttp godt kan være lidt tung hvis det er dokumenter eller større arkiver du skal tjekke.

/hiks
Avatar billede obhat Nybegynder
29. juli 2005 - 19:19 #5
Jamen hvordan rent teknisk? jeg mangler nok noget kode af en slags.
Avatar billede softspot Forsker
29. juli 2005 - 19:24 #6
Prøv lige at følge linket i mit første post - det er et ret konkret eksempel :)
Avatar billede softspot Forsker
29. juli 2005 - 19:24 #7
Sorry - andet post :)
Avatar billede hiks Nybegynder
29. juli 2005 - 19:29 #8
hvis du nu gør noget i den her stil med een database:

<%
function GetHTML(url)
    Set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP.3.0")
    xmlhttp.open "GET", url, false
    xmlhttp.setRequestHeader "User-Agent","My funky browser."
    xmlhttp.send()

    Select Case xmlhttp.status
        case 200 to 299
            GetHTML = 1
        case else
            GetHTML = 0
    End select

    If err.number <> 0 then
        GetHTML = 0
    end if

    Set xmlhttp = nothing
end function

url = "http://www.jubii.dk"

if GetHTML(url) = 0 then 'funktion returnerer 0 hvis siden er nede eller fejl
    response.write "Jubiii - er nede!"
else
    response.write "Jubiii - jubiii virker!"
end if

%>

/hiks
Avatar billede obhat Nybegynder
29. juli 2005 - 19:38 #9
Hm, jeg får denne fejl med koden:

Expected statement

Nu er det 1 link der tjekkes i eksemplet, hvordan trækker jeg alle links ud af min access database?
Avatar billede hiks Nybegynder
29. juli 2005 - 19:59 #10
jeg skal lige have en bedre fejlbesked end det? linienummer og/eller koden du har sat det ind i?

/hiks
Avatar billede softspot Forsker
29. juli 2005 - 20:55 #11
mon ikke det er denne:

    xmlhttp.send()
Avatar billede hiks Nybegynder
29. juli 2005 - 20:59 #12
måske???

jeg vil tro det er fordi der ikke er http:// foran linket så

ang. databasen så laver du jo bare et loop, hvor du kalder funktionen ved hver record akkurat ligesom når du vil udskrive vha response.write


/hiks
Avatar billede obhat Nybegynder
30. juli 2005 - 13:19 #13
Fejlen kommer i linie 9

Expected statement
case 200 to 299
---------^
Avatar billede softspot Forsker
30. juli 2005 - 13:45 #14
Kan du ikke lige prøve at smide hele den kode du bruger ind...

Ud over det skal du nok have slået fejlhåndteringen fra hvis flg. linie skal have nogen effekt:

    If err.number <> 0 then

Men prøv lige at vise koden først, så tager vi lige den anden efterfølgende... :)
Avatar billede nielle Nybegynder
30. juli 2005 - 13:53 #15
Du kan ikke bruge "to" sammen med "case" på den der måde. Brug i stedet noget i stil med:

case 200, 202
Avatar billede hiks Nybegynder
30. juli 2005 - 13:57 #16
nemli - skulle lige til at skrive det samme. Men det er min fejl.

Du kan separerer hver httpstatus kode med komma. Check desuden httpstatuskoder:

http://www.php-faq.com/httpstatus.php

/hiks
Avatar billede obhat Nybegynder
30. juli 2005 - 14:21 #17
Hvis jeg indsætter et dødt link, meldes:
A connection with the server could not be established

Men hvordan kan jeg trække mine links ud af access?
Avatar billede softspot Forsker
30. juli 2005 - 14:22 #18
I dette tilfælde ville 200 to 299 vel betyde at alle værdier mellem 200 og 299 skulle trigger den pågældende case, så en kommasepareret værdiliste ville nærmest være uoverkommelig. Det ville være et af de tilfælde hvor jeg ville anbefale en if...then...else.end if kontruktion... :)

if xmlhttp.status >= 200 and xmlhttp.status <= 299 then
  GetHTML = 1
else
  GetHTML = 0
end if
Avatar billede nielle Nybegynder
30. juli 2005 - 14:27 #19
Man behøver heller ikke at have alle værdier med i sin liste. Man kunne jø nøjes med dem som var lovlige returværdier.
Avatar billede nielle Nybegynder
30. juli 2005 - 14:39 #20
De lovlige værdier kan læses her:

http://www.ietf.org/rfc/rfc2068.txt

Søg på "[Page 39]" og "[Page 40]".
Avatar billede softspot Forsker
30. juli 2005 - 17:02 #21
Hvad hedder din databasefil?
Avatar billede obhat Nybegynder
30. juli 2005 - 18:27 #22
Den hedder "members" og tabellen hedder "data" og kolonnen "url".
Avatar billede softspot Forsker
30. juli 2005 - 18:38 #23
har du en forbindelsesstreng du bruger til at hente data i databasen andre steder eller er dette det første du laver...? Jeg er lidt på jagt efter hvormeget du gerne vil vide og hvormeget du selv har allerede...

Generelt ville jeg jo sige flg. var nødvendig (i pseudokode):

1. hent alle links
2. for hvert link check om der er forbindelse til serveren
3. hvis et link fejler så
3a.  opdater fejltælleren for det link i databasen

Derefter kunne man have en anden rutine som sørger for at rydde op i links alt efter hvormange fejl du vil tillade indenfor en given periode...
Avatar billede softspot Forsker
30. juli 2005 - 18:47 #24
Konkret kunne det være:

strDSN = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("members.mdb") & ";Persist Security Info=False"

set cn = server.createobject("ADODB.Connection")
cn.Open strDSN
set rs = cn.Execute("SELECT * FROM data")

do while not rs.eof
  ' Check om linket eksisterer - det er nok et kald til en
  ' funktion som returnerer false hvis det ikke fungerer
  if not CheckLink(rs("url")) then
    cn.Execute("UPDATE data SET failCount = failCount + 1 WHERE url = '"& rs("url") &"'")
  end if
  rs.MoveNext
loop
rs.Close
set rs = nothing
cn.Close
set cn = nothing

BEMÆRK at jeg på magisk vis har oprettet et nyt felt i tabellen med url'er som indeholder antallet af fejl i forsøg på at koble til url'en...
Avatar billede obhat Nybegynder
30. juli 2005 - 19:33 #25
Ok, nu har jeg forsøgt at indsætte de forskellge koder, men jeg kan ikke rigtig gennemskue systemet.

Jeg får syntax error i linien:
function GetHTML(url)
Avatar billede softspot Forsker
30. juli 2005 - 20:34 #26
prøv at vise din kode i sin helhed.
Avatar billede obhat Nybegynder
30. juli 2005 - 21:24 #27
Koden i helhed:

<%

strDSN = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("members.mdb") & ";Persist Security Info=False"

set cn = server.createobject("ADODB.Connection")
cn.Open strDSN
set rs = cn.Execute("SELECT * FROM data")

do while not rs.eof
  ' Check om linket eksisterer - det er nok et kald til en
  ' funktion som returnerer false hvis det ikke fungerer
  ' Regner med denne kode skal ind her?*******************

function GetHTML(url)
    Set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP.3.0")
    xmlhttp.open "GET", url, false
    xmlhttp.setRequestHeader "User-Agent","My funky browser."
    xmlhttp.send()

    Select Case xmlhttp.status
        case 200 to 299
            GetHTML = 1
        case else
            GetHTML = 0
    End select

    If err.number <> 0 then
        GetHTML = 0
    end if

    Set xmlhttp = nothing
end function

url = "http://www.jubii.dk"

if GetHTML(url) = 0 then 'funktion returnerer 0 hvis siden er nede eller fejl
    response.write "Jubiii - er nede!"
else
    response.write "Jubiii - jubiii virker!"
end if

'*******************************************

  if not CheckLink(rs("url")) then
    cn.Execute("UPDATE data SET failCount = failCount + 1 WHERE url = '"& rs("url") &"'")
  end if
  rs.MoveNext
loop
rs.Close
set rs = nothing
cn.Close
set cn = nothing

%>
Avatar billede softspot Forsker
30. juli 2005 - 22:25 #28
Prøv dette i stedet:

<%
function GetHTML(url)
    on error resume next
    Set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP.3.0")
    xmlhttp.open "GET", url, false
    xmlhttp.setRequestHeader "User-Agent","My funky browser."
    xmlhttp.send()

    if xmlhttp.status >= 200 and xmlhttp.status <= 299 then
        GetHTML = 1
    else
        GetHTML = 0
    End if

    If err.number <> 0 then
        GetHTML = 0
    end if

    Set xmlhttp = nothing
    on error goto 0
end function

strDSN = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("members.mdb") & ";Persist Security Info=False"

set cn = server.createobject("ADODB.Connection")
cn.Open strDSN
set rs = cn.Execute("SELECT * FROM data")

do while not rs.eof
  ' Check om linket eksisterer - det er nok et kald til en
  ' funktion som returnerer false hvis det ikke fungerer
  ' Regner med denne kode skal ind her?*******************

  if GetHTML(rs("url")) = 0 then
    cn.Execute("UPDATE data SET failCount = failCount + 1 WHERE url = '"& rs("url") &"'")
  end if
  rs.MoveNext
loop
rs.Close
set rs = nothing
cn.Close
set cn = nothing

%>
Avatar billede obhat Nybegynder
30. juli 2005 - 23:15 #29
Scriptet kører åbenbart, men serveren for time out efter ca. 3 min
Avatar billede softspot Forsker
30. juli 2005 - 23:20 #30
Hvormange links har du?
Avatar billede obhat Nybegynder
30. juli 2005 - 23:23 #31
Der er vel en 100 stykker
Avatar billede softspot Forsker
30. juli 2005 - 23:42 #32
:D

Ja, så er det nok en opgave der er bedre egnet til at køre batch og ikke som et request fra en browser. Hvordan man starter en batch på en webserver med ASP 3.0 uden en speciel ActiveX-komponent til formålet er jeg ikke klar over, men det kan være der er nogle af de andre der ved det...
Avatar billede obhat Nybegynder
31. juli 2005 - 09:21 #33
Hvad tjekker scriptet så for, som det er nu?

404 406 forbidden ......???
Avatar billede softspot Forsker
31. juli 2005 - 10:26 #34
Den checker at hvis statuskoden ligger indenfor intervallet 200-299 så er linket ok, ellers fejler det. I virkeligheden er det vel, som du selv indikerer, kun et par statuskode der betyder at linket ikke fungerer, så hvis du det er disse som skal være årsag til en optælling af failcount, så skal koden se således ud:

<%
function GetHTML(url)
    on error resume next
    Set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP.3.0")
    xmlhttp.open "GET", url, false
    xmlhttp.setRequestHeader "User-Agent","My funky browser."
    xmlhttp.send()

    ' Hvis statuskoden er 404 eller 406, så er det en fejl
    ' ellers ikke...
    if xmlhttp.status = 404 or xmlhttp.status = 406 then
        GetHTML = 0
    else
        GetHTML = 1
    End if

    If err.number <> 0 then
        GetHTML = 0
    end if

    Set xmlhttp = nothing
    on error goto 0
end function

strDSN = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("members.mdb") & ";Persist Security Info=False"

set cn = server.createobject("ADODB.Connection")
cn.Open strDSN
set rs = cn.Execute("SELECT * FROM data")

do while not rs.eof
  ' Check om linket eksisterer - det er nok et kald til en
  ' funktion som returnerer false hvis det ikke fungerer
  ' Regner med denne kode skal ind her?*******************

  if GetHTML(rs("url")) = 0 then
    cn.Execute("UPDATE data SET failCount = failCount + 1 WHERE url = '"& rs("url") &"'")
  end if
  rs.MoveNext
loop
rs.Close
set rs = nothing
cn.Close
set cn = nothing

%>
Avatar billede obhat Nybegynder
31. juli 2005 - 10:32 #35
Det andet virkede også fint, men inden man svælger at slette nogen link, bør man nok køre "tjek" en 3 - 4 gange på en uge måske.
Jeg kunne godt tænke mig hvis et link kun fejler 1 gang at failcount så bliver sat til 0 hvis linket virker ved andet tjek feks.
Avatar billede softspot Forsker
31. juli 2005 - 10:38 #36
Hvis du f.eks. en gang om ugen gennemløber dine links for fejl, kan du jo dels slette og dels nulstille i samme arbejdsgang (det er faktisk nok det bedste at gøre det på denne måde, med mindre du vil indføre et datostempel for at angive siden hvornår failcount er startet... men det ville vist være lidt overkill i første omgang).

Det kunne du f.eks. gøre ved at udføre denne kode:
<%
strDSN = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("members.mdb") & ";Persist Security Info=False"

set cn = server.createobject("ADODB.Connection")
cn.Open strDSN
cn.Execute("DELETE FROM data WHERE failCount > 3")
cn.Execute("UPDATE data SET failCount = 0")
cn.Close
set cn = nothing

%>
Avatar billede softspot Forsker
31. juli 2005 - 10:39 #37
Først slettes de links hvor failcount er større end 3 og derefter nulstilles resten af dine link's failcount, så de er klar til en ny periode :)
Avatar billede obhat Nybegynder
31. juli 2005 - 10:52 #38
Det må være perfekt :-)
Avatar billede softspot Forsker
31. juli 2005 - 11:04 #39
Hvis det skulle være rigtig fancy (aaah ok, så lidt fancy da), så skulle du udføre disse to trin i en transaktion, så du ikke ender med at slette links men ikke nulstillet resten. M.a.o. du gennemfører det hele eller ingenting! Det burde gøres således (BEMÆRK i øvrigt at paranteser omkring Execute-parametre er fjernet - pga. VBScript-syntaks for metodekald):

<%
strDSN = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("members.mdb") & ";Persist Security Info=False"

set cn = server.createobject("ADODB.Connection")
cn.Open strDSN
on error resume next
cn.BeginTrans
cn.Execute "DELETE FROM data WHERE failCount > 3"
cn.Execute "UPDATE data SET failCount = 0"
if err.number = 0 then
  cn.CommitTrans
else
  cn.RollbackTrans
end if
err.clear
on error goto 0
cn.Close
set cn = nothing

%>
Avatar billede obhat Nybegynder
31. juli 2005 - 11:09 #40
Det er bare rigtig godt - perfekt ;)
Avatar billede softspot Forsker
31. juli 2005 - 11:11 #41
Hvis du er tilfreds, så lægger jeg et svar, men husk nu de to andre indlægsydere :)
Avatar billede obhat Nybegynder
31. juli 2005 - 11:51 #42
Jo jeg synes det virker ret godt nu, det må jeg sige :)
Så skal jeg be de andre om at lægge et svar, så deler jeg points
Avatar billede hiks Nybegynder
31. juli 2005 - 11:59 #43
du får et lille svar af mig - leverede jo kun funktionen til at tjekke. :o)

/hiks
Avatar billede nielle Nybegynder
31. juli 2005 - 14:29 #44
Ingen point til mig på denne her :^)

Men jeg synes nu alligevel at man - om ikke andet, så rent principielt - bør søge direkte på de lovelige statusværdier (30/07-2005 14:39:20) frem for blot at være doven og teste på et helt interval (200-299).
Avatar billede softspot Forsker
31. juli 2005 - 14:37 #45
Som der så også bliver i svaret fra 31/07-2005 10:26:08 :)
Avatar billede softspot Forsker
31. juli 2005 - 14:38 #46
...i en mere målrettet form
Avatar billede obhat Nybegynder
31. juli 2005 - 16:12 #47
Vil det være en mere sikker måde?
Avatar billede softspot Forsker
31. juli 2005 - 16:21 #48
Det er et spørgsmål om man vil skyde med spredhagl eller et enkelt projektil. Jo mere sikker på hvad det er du vil checke for, des mere målrettet kan du udskille fejlkoder... som i den seneste version, hvor det kun er fejlkoderne 404 og 406 der resulterer i en fejlmarkering.
Avatar billede obhat Nybegynder
31. juli 2005 - 16:30 #49
Hvis man vælger fejlkoderne 404 406 osv. så er der vel et hav af koder man skal indsætte, ved ikke hvor mange der er og hvad de alle gør, men der er vel en del at tage hensyn til?
Avatar billede softspot Forsker
31. juli 2005 - 16:31 #50
Ja, det kommer an på hvad du vil checke for. I denne tråd har temaet vel været at serveren ikke kunne finde en side til det ønskede link... men du kan i princippet checke for en masse kriterier (jf. det link nielle postede tidligere i denne tråd: http://www.ietf.org/rfc/rfc2068.txt)...
Avatar billede obhat Nybegynder
31. juli 2005 - 16:36 #51
Tja, jeg ønsker at tjekke for døde links, sider der ikke bliver vist korrekt, feks. 403 for mange bruger 500 server fejl, forbidden osv.
Det gør scriptet jo faktisk også som det er nu ikk?
Avatar billede softspot Forsker
31. juli 2005 - 16:49 #52
I princippet kunne man jo argumentere for at alle statuskode på eller over 400 burde resultere i en fejlmarkering, da de vel alle giver en side som ikke er særlig interessant at se på. Koden vi er kommet frem til i denne tråd, tager kun hånd om 404 og 406, men det burde være overkommeligt for dig at tilføje flere koder hvis det bliver nødvendigt.
Avatar billede hiks Nybegynder
31. juli 2005 - 16:50 #53
men vi kan jo hjælpe lidt med til hvilke du kan håndtere - jeg har klippet fra nielles link:

Status-Code    = "100"  ; Continue
| "101"  ; Switching Protocols
| "200"  ; OK
| "201"  ; Created
| "202"  ; Accepted
| "203"  ; Non-Authoritative Information
| "204"  ; No Content
| "205"  ; Reset Content
| "206"  ; Partial Content
| "300"  ; Multiple Choices
| "301"  ; Moved Permanently
| "302"  ; Moved Temporarily
| "303"  ; See Other
| "304"  ; Not Modified
| "305"  ; Use Proxy
| "400"  ; Bad Request
| "401"  ; Unauthorized
| "402"  ; Payment Required
| "403"  ; Forbidden
| "404"  ; Not Found
| "405"  ; Method Not Allowed
| "406"  ; Not Acceptable
| "407"  ; Proxy Authentication Required
| "408"  ; Request Time-out
| "409"  ; Conflict
| "410"  ; Gone
| "411"  ; Length Required
| "412"  ; Precondition Failed
| "413"  ; Request Entity Too Large
| "414"  ; Request-URI Too Large
| "415"  ; Unsupported Media Type
| "500"  ; Internal Server Error
| "501"  ; Not Implemented
| "502"  ; Bad Gateway
| "503"  ; Service Unavailable
| "504"  ; Gateway Time-out
| "505"  ; HTTP Version not supported

Jeg tror jeg ville tage alle fra 400-406 og 301. Andre bud?

/hiks
Avatar billede hiks Nybegynder
31. juli 2005 - 16:51 #54
det var egentlig også derfor jeg i første omgang ville have brugt en select.

/hiks
Avatar billede softspot Forsker
31. juli 2005 - 16:57 #55
301, er det ikke bare et server-redirect som browseren håndtere automatisk ved at surfe til en anden adresse som serveren sender med tilbage...?
Avatar billede hiks Nybegynder
31. juli 2005 - 17:04 #56
jow - men det var egentlig mest erfaringsmæssigt - for så skal man jo have rettet linket. :) Men ja - man bliver jo redirected.

Man skal også være lidt opmærksom på at webhosts med en IIS med custom errorpages - godt kan give status 200 selvom man har ramt fejlsiden, hvilket jo ikke er så hensigtsmæssigt.

/hiks
Avatar billede obhat Nybegynder
31. juli 2005 - 23:29 #57
Det vil jeg da lige se nærmere på, det er muligvis en god ide at bruge koderne istedet.
Fordeler lige points, 100 til hver.
Avatar billede softspot Forsker
01. august 2005 - 00:07 #58
Tak for point :)
Avatar billede obhat Nybegynder
02. august 2005 - 23:05 #59
Kan jeg være sikker på at alle links tjekkes med de forslag her?
Avatar billede softspot Forsker
02. august 2005 - 23:40 #60
Hmmm... der er jo i realiteten ikke nogen fejlhåndtering omkring gennemløbet af links, så der kunne i realiteten godt opstå en fejl ifm. udlæsningen af data fra databasen. På samme måde kan der jo også godt opstå en fejl i opdateringen eller sletningen af links. Så helt sikker kan du ikke være, men hvis ellers databasen er tilgængelig og sitet kører som forventet, vil jeg mene at det er overvejende sandsynligt at tjekket gennemføres...

Hvorfor? Har du da konstateret at det ikke gennemføres?
Avatar billede hiks Nybegynder
02. august 2005 - 23:58 #61
er det fordi du ikke får noget resultat udskrevet, eller er der ingen af dem der bliver talt op, eller bliver alle talt op?

/hiks
Avatar billede hiks Nybegynder
03. august 2005 - 00:08 #62
jeg kan godt se et problem men det kommer an på hvordan du har indarbejdet dette indlæg:

softspot 31/07-2005 11:04:23

Hvis du udfører det før du går i gang med alt det andet, hver gang scriptet kører - og alle links starter fra nul så vil de forblive 0-1 hele tiden.

En løsning kunne være hvis du har indarbejdet ovenstående at rette loopet til således:

  if GetHTML(rs("url")) = 0 then
    cn.Execute("UPDATE data SET failCount = failCount + 1 WHERE url = '"& rs("url") &"'")
  else
    cn.Execute("UPDATE data SET failCount = 0 WHERE url = '"& rs("url") &"'")
  end if

og så efter at du har loopet alle dine urls igennem foretage din oprydning med:

cn.Execute "DELETE FROM data WHERE failCount > 3"

bemærk alle forbeholdene i dette indlæg...

/hiks
Avatar billede hiks Nybegynder
03. august 2005 - 01:27 #63
nå men - jeg havde lige lidt kvalitetstid her sidst på aftenen og forsøgte lige selv med scriptet og en database med nogle links min database ser sådan ud:

Databasenavn: members.mdb (ligger i db-folderen)
Tabelnavn: data

Attributter (data):
urlID          Autonummering
url            Tekst(255)
urlFailCount  Heltal
urlDate        Dato/Tid

Og nu har jeg modificeret lidt i scriptet således, at jeg også kunne bruge det til noget :o) - Jeg synes det gik rigtigt fint også med 200 links... Ikke hurtigt med ok. Der er ikke lavet voldsomt om - bare inkluderet diverse ting som er nævnt ovenover som jeg ikke ved om du har med...

<%@ Language=VBScript %>
<% 'Response.Buffer = False 'kan også bruges i stedet for flush %>
<% Server.ScriptTimeout = 100 %>
<HTML>
<HEAD>
    <TITLE>LinkDatabase</TITLE>
</HEAD>
<BODY>
<H1>Linkoversigt:</H1>
<%
    dim lastError
    function GetHTML(url)
        On Error Resume Next
        Set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP.3.0")
        xmlhttp.open "GET", url, false
        xmlhttp.setRequestHeader "User-Agent","LinkTestBrowser"
        xmlhttp.send()

        ' Hvis statuskoden er 400, 401, 402, 403, 404, 406, 410, så er det en fejl
        ' ellers ikke...
        Select Case CInt(xmlhttp.status)
            Case 400, 401, 402, 403, 404, 406, 410
                lastError = xmlhttp.status
                GetHTML = 0
            Case Else
                GetHTML = 1
        End Select

        If Err.Number <> 0 then
            GetHTML = 0
        end if

        Set xmlhttp = nothing
        on error goto 0
    end function

    On Error Resume Next
   
    strDSN = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("/db/members.mdb") & ";Persist Security Info=False"

    set cn = server.createobject("ADODB.Connection")
    cn.Open strDSN
    set rs = cn.Execute("SELECT * FROM data;")
   
    With Response
        .Write "<table width=""600"">"
        .Write "<tr><th width=""250"">URL</th><th width=""250"">Sidste tjek</th><th width=""100"">Status</th></tr>"
        .Write "</table>"
    End With
   
    cn.BeginTrans
   
    While rs.eof = False
        ' Check om linket eksisterer - det er nok et kald til en
        ' funktion som returnerer false hvis det ikke fungerer
        ' Regner med denne kode skal ind her?*******************
        With Response
            .Write "<table width=""600"">"
            .Write "<tr><td width=""250"">" & rs("url") & "</td><td width=""250"">" & rs("urlDate") & " - " & DateDiff("d", rs("urlDate"), Now) & " dag(e) siden...</td>"
            If GetHTML(rs("url")) = 0 then
                .Write "<td align=""center"" width=""100""><font color=""red"">fejl (" & rs("urlFailCount") + 1 & ")(status: " & lastError & "</font></td>"
                cn.Execute("UPDATE data SET urlFailCount = urlFailCount + 1, urlDate = Now WHERE urlID = " & rs("urlID") & ";")
            Else
                .Write "<td align=""center"" width=""100""><font color=""green"">ok</font></td>"
                cn.Execute("UPDATE data SET urlFailCount = 0, urlDate = Now WHERE urlID = " & rs("urlID") & ";")
            End If
            .Write "</tr>"
            .Write "</table>"
        End With       
        Response.Flush
        rs.MoveNext
    Wend
   
    cn.Execute("DELETE FROM data WHERE urlFailCount > 3;")
   
    If Err.Number = 0 then
        cn.CommitTrans
    Else
        cn.RollbackTrans
    end if
   
    rs.Close
    set rs = nothing
    cn.Close
    set cn = nothing
   
    Response.Write "<p>Fejl:<br>" & Err.number & " " & Err.Description & "</p>"
%>

</BODY>
</HTML>
Avatar billede softspot Forsker
03. august 2005 - 01:41 #64
hiks >> Jeg kan godt lide din idé med at nulstille fail hvis linket fungerer, det sikrer da i det mindste at links der svarer engang imellem får lidt mere tid at leve i. Jeg synes dog ikke umiddelbart at det er nødvendigt at gøre hele checkdelen til en transaktion, idet du så kommer til at fortryde _ALLE_ opdateringer hvis blot et af dine links fejler (og så skal det hele bare gøre forfra næste gang). Man kan naturligvis argumentere for at det så giver de enkelte links lidt længere tid at leve i, men principielt synes jeg ikke det er optimalt (transktionsloggen bliver også så stor :))...
Avatar billede hiks Nybegynder
03. august 2005 - 01:46 #65
men der kommer jo ingen fejl.. ;)

/hiks
Avatar billede softspot Forsker
03. august 2005 - 01:48 #66
Nåårh nej, det havde jeg glemt :)
Avatar billede obhat Nybegynder
03. august 2005 - 10:10 #67
Jeg siger mange tak for svarene, så har jeg lidt at arbejde med.
Hiks >> det seneste forslag ser vældig godt ud:)
Avatar billede obhat Nybegynder
03. august 2005 - 10:59 #68
Ved gennemløb får jeg ikke vist "lasterror" scriptet udskriver bare:

Fejl(1)(status:

Er det ikke meningen af feks. skal skrives?:
Fejl(1)(status:404)
Avatar billede hiks Nybegynder
03. august 2005 - 11:06 #69
jow - det gør den nu også her. Du skal "dimme" den globalt hvis det skal virke! Ligesom i eksemplet.

/hiks
Avatar billede obhat Nybegynder
03. august 2005 - 11:11 #70
Jeg har sat eks. direkte ind som vist.
ligeledes skrives også Antal=0 selvom jeg havde 2 ved tjekket.

"dimme" ??
Avatar billede softspot Forsker
03. august 2005 - 11:17 #71
dimme = dimensionere

VBScriptsk
Avatar billede softspot Forsker
03. august 2005 - 11:17 #72
dimensionere = gør klar til / gøre plads til i hukommelsen
Avatar billede hiks Nybegynder
03. august 2005 - 11:19 #73
Hva skriver den nede i bunden?

Fejl:
0

?

/hiks
Avatar billede obhat Nybegynder
03. august 2005 - 11:23 #74
Fejl:
0
Avatar billede hiks Nybegynder
03. august 2005 - 11:27 #75
prøv lige at slå begge

on error resume next fra dvs kommentér dem ud

/hiks
Avatar billede hiks Nybegynder
03. august 2005 - 11:40 #76
rettelse til funktionen:

    function GetHTML(url)
        On Error Resume Next
        Set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP.3.0")
        xmlhttp.open "GET", url, false
        xmlhttp.setRequestHeader "User-Agent","LinkTestBrowser"
        xmlhttp.send()

        ' Hvis statuskoden er 400, 401, 402, 403, 404, 406, 410, så er det en fejl
        ' ellers ikke...
        Select Case CInt(xmlhttp.status)
            Case 400, 401, 402, 403, 404, 406, 410
                lastError = xmlhttp.status
                GetHTML = 0
            Case Else
                GetHTML = 1
        End Select

        If Err.Number <> 0 then
            lastError = Err.Number 'denne er tilføjet derfor ingen lastError
            GetHTML = 0
        end if

        Set xmlhttp = nothing
        on error goto 0
    end function

/hiks
Avatar billede hiks Nybegynder
03. august 2005 - 11:41 #77
og tror måske grunden til at den fejler er nu at xmlhttp.status godt kan melde null men er ikke sikker derfor er det ikke sikkert CInt(xmlhttp.status) virker.

/hiks
Avatar billede obhat Nybegynder
03. august 2005 - 11:41 #78
Jeg har netop kørt et tjek igen, denne gang var der 3 fejl og alle blev vist korrekt:
Fejl(1)(status:404)

Men i bunden kom denne melding:
Fejl:
-2147217904 No value given for one or more required parameters.
Avatar billede hiks Nybegynder
03. august 2005 - 11:57 #79
har du forsøgt at slå resume next fra?

/hiks
Avatar billede obhat Nybegynder
03. august 2005 - 12:05 #80
Prøver jeg lige..
Avatar billede obhat Nybegynder
03. august 2005 - 12:11 #81
Så meldes fejlen:

Microsoft JET Database Engine error '80040e10'No value given for one or more required parameters.
/test/test.asp, line 63
Avatar billede hiks Nybegynder
03. august 2005 - 12:13 #82
ja se det var interessant - har du husket at tilføje attributterne fra min db til din database og evt. ændre navnene på attributterne i kodningen?

/hiks
Avatar billede hiks Nybegynder
03. august 2005 - 12:15 #83
det var det softspot også skrev - så laver den pt en rollback hvis den møder en fejl - derfor bliver der ikke updateret. Så det skal vi lige have på plads... :o)

men som sagt der kommer jo ikke nogen fejl... :o/

/hiks
Avatar billede obhat Nybegynder
03. august 2005 - 12:17 #84
Ja det har jeg
Avatar billede hiks Nybegynder
03. august 2005 - 12:23 #85
hvilken een har du som linie 63?

.Write "<td align=""center"" width=""100""><font color=""red"">fejl (" & rs("urlFailCount") + 1 & ")(status: " & lastError & "</font></td>"

eller

cn.Execute("UPDATE data SET urlFailCount = urlFailCount + 1, urlDate = Now WHERE urlID = " & rs("urlID") & ";")

?

/hiks
Avatar billede obhat Nybegynder
03. august 2005 - 12:31 #86
cn.Execute("UPDATE data SET urlFailCount = urlFailCount + 1, urlDate = Now WHERE urlID = " & rs("urlID") & ";")
Avatar billede obhat Nybegynder
03. august 2005 - 12:36 #87
How, jeg havde fået sat et komma for meget, tror det ruller nu.

cn.Execute("UPDATE data SET urlFailCount = urlFailCount + 1,, urlDate = Now WHERE urlID = " & rs("urlID") & ";")
Avatar billede hiks Nybegynder
03. august 2005 - 12:40 #88
fino - du skriver bare hvis der er noget. Det er nu ganske rart at man kan se output når scriptet kører, ik?

/hiks
Avatar billede obhat Nybegynder
03. august 2005 - 12:46 #89
Det er kanon, meget tæt på perfekt:)
Måske kunne det være godt, hvis det sidste tjek altid vises øverst, i stedet for nederst, så behøver man ikke at scrolle, kan det måske laves?
Og til aller sidst en counter øverst, så kan man meget tydlig se hvor langt scriptet er nået.
Bare hvis det ikke er for meget arbejde i det.
Avatar billede hiks Nybegynder
03. august 2005 - 13:32 #90
hehe sjovt nok var det - det jeg lavede til mig selv lidt senere igår... Har lavet det i javascripts (som ikke er min stærke side - men det her gik da vist lige) - jeg ved ikke helt hvad du mener med øverst/nederst jeg har lavet et bookmark i bunden nu så du kan hoppe derned.

here goes:

<%@ Language=VBScript %>
<% 'Response.Buffer = False 'kan også bruges i stedet for flush %>
<% Server.ScriptTimeout = 100 %>
<% Session.LCID = 1030 %>
<HTML>
<HEAD>
    <TITLE>LinkDatabase</TITLE>
</HEAD>
<BODY>
<H1>Linkoversigt:</H1>

<SCRIPT language="Javascript">
function countGood(objectX){
    var count = parseInt(objectX.value);
    objectX.value = count + 1;
}
</SCRIPT>

<INPUT VALUE="0" NAME="good" maxlength=3 readonly size =3> godkendte links...<BR>
<INPUT VALUE="0" NAME="bad" maxlength=3 readonly size =3> dårlige links...<BR><BR>
<A href="#"> Gå til bunden</A>
<%
    dim lastError
    function GetHTML(url)
        On Error Resume Next
        Set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP.3.0")
        xmlhttp.open "GET", url, false
        xmlhttp.setRequestHeader "User-Agent","LinkTestBrowser"
        xmlhttp.send()

        ' Hvis statuskoden er 400, 401, 402, 403, 404, 406, 410, så er det en fejl
        ' ellers ikke...
        Select Case CInt(xmlhttp.status)
            Case 400, 401, 402, 403, 404, 406, 410
                lastError = xmlhttp.status
                GetHTML = 0
            Case Else
                GetHTML = 1
        End Select

        If Err.Number <> 0 then
            lastError = Err.number
            GetHTML = 0
        end if

        Set xmlhttp = nothing
        on error goto 0
    end function

    On Error Resume Next
   
    strDSN = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("/db/members.mdb") & ";Persist Security Info=False"

    set cn = server.createobject("ADODB.Connection")
    cn.Open strDSN
    set rs = cn.Execute("SELECT * FROM data;")
   
   
    With Response
        .Write "<table width=""600"">"
        .Write "<tr><th width=""250"">URL</th><th width=""250"">Sidste tjek</th><th width=""100"">Status</th></tr>"
        .Write "</table>"
    End With
   
    cn.BeginTrans
   
    While rs.eof = False
        ' Check om linket eksisterer - det er nok et kald til en
        ' funktion som returnerer false hvis det ikke fungerer
        ' Regner med denne kode skal ind her?*******************
        With Response
            .Write "<table width=""600"">"
            .Write "<tr><td width=""250"">" & rs("url") & "</td><td width=""250"">" & rs("urlDate") & " - " & DateDiff("d", rs("urlDate"), Now) & " dag(e) siden...</td>"
            If GetHTML(rs("url")) = 0 then
                .Write "<td align=""center"" width=""100""><font color=""red"">fejl (" & rs("urlFailCount") + 1 & ")(status: " & lastError & "</font></td>"
                .Write "<SCRIPT>countGood(bad);</SCRIPT>" 'tæl op
                cn.Execute("UPDATE data SET urlFailCount = urlFailCount + 1, urlDate = Now WHERE urlID = " & rs("urlID") & ";")
            Else
                .Write "<td align=""center"" width=""100""><font color=""green"">ok</font></td>"
                .Write "<SCRIPT>countGood(good);</SCRIPT>" 'tæl op
                cn.Execute("UPDATE data SET urlFailCount = 0, urlDate = Now WHERE urlID = " & rs("urlID") & ";")
            End If
            .Write "</tr>"
            .Write "</table>"
        End With       
        Response.Flush
        rs.MoveNext
    Wend
   
    cn.Execute("DELETE FROM data WHERE urlFailCount > 3;")
   
    If Err.Number = 0 then
        cn.CommitTrans
    Else
        cn.RollbackTrans
    end if
   
    rs.Close
    set rs = nothing
    cn.Close
    set cn = nothing
    Response.Write "<A name=#></A>"
    Response.Write "<p>Fejl:<br>" & Err.number & " " & Err.Description & "</p>"
%>

</BODY>
</HTML>

/hiks
Avatar billede obhat Nybegynder
03. august 2005 - 14:03 #91
Tælleren virker fint :-)
Det jeg mente med bunden, var om det tjekkede link bliver placeret i toppen af listen, så de andre bliver skubbet ned ...

Tjek omvendt "DESC" ??
Avatar billede hiks Nybegynder
03. august 2005 - 14:17 #92
du er da en værre een! :o)

jeg sidder og overvejer om det kan lade sig gøre med divs og noget javascript men ellers tror jeg ikke... Du må jo tænke på at serveren smider noget til browseren fortløbende og det næste vil du så have til at stå ovenover det som den lige har smidt afsted, hvilket er vanskeligt at klare i ren asp, vil jeg tro. Så jeg vil tro at du skal have fat i noget klient side scripting og som sagt så er det ikke min skarpeste side. :D Min kunnen svarer nok nogenlunde til ovenstående... hehe

/hiks
Avatar billede obhat Nybegynder
03. august 2005 - 14:21 #93
hiks >> det er nu også meget godt som det er nu, det var også kun hvis det kunne klares med et par små ændringer.
Men ellers siger jeg mange tak for hjælpen.
Avatar billede obhat Nybegynder
03. august 2005 - 14:42 #94
Jeg får godt nok den her fejl på en lang række links, som ikke fejler noget.

Fejl (1)(status: -2147483638
Avatar billede hiks Nybegynder
03. august 2005 - 14:51 #95
fedt - ved du hvad fejlbeskeder har af ref i msdn:

Dataene, som kræves for at fuldføre handlingen, er ikke til rådighed endnu.

:/

graver lige lidt i det. hvor mange links har du?

/hiks
Avatar billede obhat Nybegynder
03. august 2005 - 14:55 #96
Jeg tjekker på 300 links
Avatar billede hiks Nybegynder
03. august 2005 - 15:38 #97
hmmm

det har nu lykkedes mig at bringe min maskine i knæ med utallige loops, tror jeg... :s

Men jeg tror frem til at det må være XMLHTTP der ikke når at "grabbe" siden inden vi forsøger at aflæse statusen - jeg kan ikke se hvorfor det skulle være sådan - har lige smidt 500 links på min maskine og to forskellige sessioner og den står "gladeligt" og tygger igennem. Om ikke andet så kan du jo prøve følgende (det var her jeg i første forsøg lagde min maskine ned). Erstat getHTML funktionen med denne:

    function GetHTML(url)
        On Error Resume Next
       
        Set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP.3.0")
        xmlhttp.open "GET", url, false
        xmlhttp.setRequestHeader "User-Agent","LinkTestBrowser"
        xmlhttp.send()

        'sekunder siden midnat
        dim lngTimer, blnTimedOut
        lngTimer = Timer
        blnTimedOut = False

        'loop indtil statusen er klar eller timeout (10 sek.)
        Do Until xmlhttp.status <> ""
            If Timer - lngTimer >= 10 Then
                blnTimedOut = True
               
                Exit Do
            End If
        Loop
       
        If blnTimedOut = True Then
            GetHTML = 1 'sætter den til 1, således den ikke bliver slettet pga serveren eller lign. er sløv
            set xmlhttp = Nothing
            Exit Function
        End if

        ' Hvis statuskoden er 400, 401, 402, 403, 404, 406, 410, så er det en fejl
        ' ellers ikke...               
        Select Case CInt(xmlhttp.status)
            Case 400, 401, 402, 403, 404, 406, 410
                lastError = xmlhttp.status
                GetHTML = 0
            Case Else
                GetHTML = 1
        End Select

        If Err.Number <> 0 then
            lastError = Err.number
            GetHTML = 0
        end if

        Set xmlhttp = nothing
       
        on error goto 0
    end function

Prøv så lige at tjek om du fortsat får det fejlnummer. Ovenstående er bare et skud.

/hiks
Avatar billede obhat Nybegynder
03. august 2005 - 16:14 #98
Så tyder alt på at det virker.
Fik i hvert fald igen fejl denne gang :-)
Avatar billede hiks Nybegynder
03. august 2005 - 16:17 #99
nej men den timer sikkert ud en masse gange og vil returnere at URLen eksisterer - men hvis du kan leve med det så er det jo fint. Fra tid til anden skal siderne jo nok blive tjekket.

/hiks
Avatar billede hiks Nybegynder
03. august 2005 - 16:18 #100
hurraaaa indlæg nr. 100 i denne tråd... hehe!

god fornøjelse med det!

/hiks
Avatar billede obhat Nybegynder
03. august 2005 - 16:20 #101
Tak Tak.
Jeg tjekker resten af dagen, håber jeg må spørge, hvis der er noget?

/obhat
Avatar billede obhat Nybegynder
03. august 2005 - 18:40 #102
Hm ok,
Nu vil jeg gerne sætte det hele lidt pænt op i et par tabeller og med lidt HMTL, men så får jeg en Headerfejl, hvad skyldes det?:

Response-objekt fejl 'ASP 0156 : 80004005'

Headerfejl

HTTP-headerne skrives allerede til klientbrowseren. Ændringer af HTTP-headere skal foretages, inden sideindholdet skrives.
Avatar billede hiks Nybegynder
03. august 2005 - 18:44 #103
kommer meget an på hvad det er du har tilføjet. Hvis du forsøger at inkludere den via en anden siden kan det være at response.buffer og <%@ Language=VBScript %> er sat.

/hiks
Avatar billede obhat Nybegynder
03. august 2005 - 18:47 #104
Jeg har bare sat et par tabeller ind med noget tekst og ligeledes et par tabeller i bunden, også bare med noget tekst.
Avatar billede hiks Nybegynder
03. august 2005 - 18:50 #105
du bliver nødt til at vise koden hvis jeg skal rette i det.

/hiks
Avatar billede obhat Nybegynder
03. august 2005 - 18:54 #106
Jamen nu bliver det underligt, alt HTLM er fjernet igen, kun rå ASP, men får alligevel Headerfejl
Avatar billede obhat Nybegynder
03. august 2005 - 19:10 #107
Tror jeg er ved at være træt, kigger på det i morgen igen :)
Avatar billede obhat Nybegynder
03. august 2005 - 23:24 #108
Uanset hvad jeg gør, så kan jeg ikke indsætte scriptet i noget grafik, hvis jeg gør det, hænger siden indtil scriptet er kørt, så vises siden først.
Kan serveren ikke vise HTML sammen med scriptet?

Headerfejlen er væk, var kommet til at sætte et forkert tegn.
Avatar billede hiks Nybegynder
03. august 2005 - 23:27 #109
du kan slå det fra med response.buffer eller response.flush - hvis du indarbejder det i en tabel vil det ikke virke før hele tabellen er skrevet færdig. Det er også derfor jeg har lavet opdelingen i adskilte tabeller...

/hiks
Avatar billede obhat Nybegynder
03. august 2005 - 23:33 #110
Det her kommer i starten af siden.

<%@ Language=VBScript %>
<% Response.Buffer = False 'kan også bruges i stedet for flush %>
<% Server.ScriptTimeout = 100 %>
<% Session.LCID = 1030 %>

Response.Buffer er slået til, men hjælper ikke.
Ved ikke om jeg helt forstår
Avatar billede hiks Nybegynder
03. august 2005 - 23:36 #111
hvis du sætter response.buffer = True så vil den først skrive siden når det hele er genereret - ved response.buffer = False vil den skrive siden fortløbende som tags'ne i dokumentet bliver lukket. Det er bl.a. også grunden til at tabeller ikke bliver "udskrevet" førend </table> er nået for den enkelte tabel.

/hiks
Avatar billede hiks Nybegynder
04. august 2005 - 00:31 #112
hej igen

det er da ved at være et langtidsprojekt det her :o) - igen idag var der jo kun fodbold i fjerneren så det blev til lidt kvalitetstid foran den anden skærm. Jeg har lavet sådan nu at man kan vende links om i rækkefølge - dog kun som vbscript (magtede ikke javascriptet) dvs firefox o.l. er udelukket og så har jeg lagt lidt design på den. Du kan se det her: http://www.uploaded.dk/active/linkdatabase.asp

Jeg skal nok poste sourcen hvis du er interesseret!

/hiks
Avatar billede obhat Nybegynder
04. august 2005 - 01:09 #113
Jo tak,- det ser godt ud :)
Vil gerne se sourcen..
Avatar billede hiks Nybegynder
04. august 2005 - 01:22 #114
here goes:

<%@ Language=VBScript %>
<% 'Response.Buffer = False 'kan også bruges i stedet for flush %>
<% Server.ScriptTimeout = 1000 %>
<% Session.LCID = 1030 %>
<HTML>
<HEAD>
    <TITLE>LinkDatabase</TITLE>
    <style type="text/css">
        <!--
        h1 {
            font: 16px Verdana, sans-serif;
            font-weight: bold;
        }
        input {
            border: 0px solid;
            text-align: right;
        }
        table {
            border: 0px solid #999;
            border-collapse: collapse;
        }
        th {
            font-weight: bold;
            align: center;
        }
        td {
            padding: 3px 10px;
        }
        .over, tr:hover {
            background: #ccc;
            cursor: default;
        }
        * {
            font: 10px Verdana, sans-serif;
        }
        //-->
    </style>
    <script type="text/javascript">
        <!--
        function setRowClass() {
            var rows = document.getElementsByTagName("tr");
            for(var i in rows) {
                rows[i].onmouseover = function() {
                    this.className = "over";
                }
                rows[i].onmouseout = function() {
                    this.className = null;
                }
            }
        }
        onload= setRowClass;

        function countGood(objectX){
            var count = parseInt(objectX.value);
            objectX.value = count + 1;
        }

        function vendDataJS() {
            var currDivs = [];
            var theParentNode = document.getElementById('all');
               
            for(var i = 0; i < theParentNode.childNodes.length; i++) {
                if(theParentNode.childNodes[i].nodeType == 1) {
                    currDivs.push(theParentNode.childNodes[i].innerHTML);
                }
            }

            var index = theParentNode.childNodes.length - 1;
            for(var i = 0; i < theParentNode.childNodes.length; i++) {
                if(theParentNode.childNodes[i].nodeType == 1) {
                    theParentNode.childNodes[i].innerHTML = currDivs[index --];
                }
            }

            setRowClass();
        }
           
        //-->
    </SCRIPT>
    <SCRIPT language="Vbscript">
        Function VendData()
            dim i, arrTables
           
            arrTables = document.getElementsByName("all")
           
            Redim arrIndHold(CInt(arrTables.childNodes.length - 1))
           
            if arrTables.hasChildNodes then
                for each childX in arrTables.childNodes
                    arrIndhold(i) = childX.innerHTML
                    i = i + 1
                next
            end if
           
            for i = ubound(arrIndhold) to lbound(arrIndhold) step -1
                arrTables.childNodes(ubound(arrIndhold) - i).innerHTML = arrIndhold(i)
            next
           
            setRowClass
           
        End Function   
    </SCRIPT>
</HEAD>
<BODY>
<H1>Linkoversigt:</H1>
<P>
<INPUT VALUE="0" NAME="good" maxlength=3 readonly size =3> godkendte links...<BR>
<INPUT VALUE="0" NAME="bad" maxlength=3 readonly size =3> dårlige links...<BR><BR>
<A href="#"> Gå til bunden</A> - <a href="#" onclick="VendData();">Vend data (VBS)</a> - <a href="#" onclick="vendDataJS();">Vend data (JS)</a></P>
<%
    dim lastError
    function GetHTML(url)
        On Error Resume Next
       
        Set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP.3.0")
        xmlhttp.open "GET", url, false
        xmlhttp.setRequestHeader "User-Agent","LinkTestBrowser"
        xmlhttp.send()

        'sekunder siden midnat
        dim lngTimer, blnTimedOut
        lngTimer = Timer
        blnTimedOut = False

        'loop indtil statusen er klar eller timeout (10 sek.)
        Do Until xmlhttp.status <> ""
            If Timer - lngTimer >= 10 Then
                blnTimedOut = True
               
                Exit Do
            End If
        Loop
       
        If blnTimedOut = True Then
            GetHTML = 1 'sætter den til 1, således den ikke bliver slettet pga serveren eller lign. er sløv
            set xmlhttp = Nothing
            Exit Function
        End if

        ' Hvis statuskoden er 400, 401, 402, 403, 404, 406, 410, så er det en fejl
        ' ellers ikke...               
        Select Case CInt(xmlhttp.status)
            Case 400, 401, 402, 403, 404, 406, 410
                lastError = xmlhttp.status
                GetHTML = 0
            Case Else
                GetHTML = 1
        End Select

        If Err.Number <> 0 then
            lastError = Err.number
            GetHTML = 0
        end if

        Set xmlhttp = nothing
       
        on error goto 0
    end function

    Sub Links()
        On Error Resume Next
   
        strDSN = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("/db/members.mdb") & ";Persist Security Info=False"
       
        set cn = server.createobject("ADODB.Connection")
        cn.Open strDSN
        set rs = cn.Execute("SELECT * FROM data;")
   
        With Response
            .Write "<table width=""600"">"
            .Write "<thead><th width=""250"">URL</th><th width=""250"">Sidste tjek</th><th width=""100"">Status</th></thead>"
            .Write "</table>"
        End With
   
        cn.BeginTrans
   
        dim i 'taeller til sortering
   
        Response.Write "<div id=""all"">"
   
        While rs.eof = False
            ' Check om linket eksisterer - det er nok et kald til en
            ' funktion som returnerer false hvis det ikke fungerer
            ' Regner med denne kode skal ind her?*******************
            With Response
                .Write "<div id=""" & i & """>"
                .Write "<table width=""600"" id=""" & i & """>"
                .Write "<tr><td width=""250"">" & rs("url") & "</td><td width=""250"">" & rs("urlDate") & " - " & DateDiff("d", rs("urlDate"), Now) & " dag(e) siden...</td>"
                If GetHTML(rs("url")) = 0 then
                    if rs("urlFailCount") > 100 then
                        .Write "<td align=""center"" width=""100""><img src=""../images/status/3.gif"" alt=""fejl (" & rs("urlFailCount") + 1 & ")(status: " & lastError & ")"" /></td>"
                    else
                        .Write "<td align=""center"" width=""100""><img src=""../images/status/2.gif"" alt=""fejl (" & rs("urlFailCount") + 1 & ")(status: " & lastError & ")"" /></td>"
                    end if
                    .Write "<SCRIPT>countGood(bad);</SCRIPT>" 'tæl op
                    cn.Execute("UPDATE data SET urlFailCount = urlFailCount + 1, urlDate = Now WHERE urlID = " & rs("urlID") & ";")
                Else
                    .Write "<td align=""center"" width=""100""><img src=""../images/status/1.gif"" alt=""OK"" /></td>"
                    .Write "<SCRIPT>countGood(good);</SCRIPT>" 'tæl op
                    cn.Execute("UPDATE data SET urlFailCount = 0, urlDate = Now WHERE urlID = " & rs("urlID") & ";")
                End If
                .Write "</tr>"
                .Write "</table>"
                .Write "</div>"           
            End With
            i = i + 1
            Response.Flush
            rs.MoveNext
        Wend
   
        Response.Write "</div>"
   
        cn.Execute("DELETE FROM data WHERE urlFailCount > 1000;")
   
        If Err.Number = 0 then
            cn.CommitTrans
        Else
            cn.RollbackTrans
        end if
   
        rs.Close
        set rs = nothing
        cn.Close
        set cn = nothing
        Response.Write "<A name=#></A>"
        Response.Write "<p>Fejl:<br>" & Err.number & " " & Err.Description & "</p>"
    End Sub
   
    Call Links()
%>
</BODY>
</HTML>

Bemærk venligst at jeg sgu fik lavet det om til et javascript også... Jeg lærer også!

Bemærk også jeg har sat diverse grænser for at smide links væk op og smidt det i en sub - det var hvis jeg skulle bruge det senere hen. Grænserne og alt andet justerer du jo bare selv.

Jeg havde egentlig tidligere een idé om at jeg ville trække een fra når linket virkede således at man fik et kvalitetsbarometer for linkets tilstand over tid, men jeg undlod dog dette pt.

nat nat

/hiks

go fornøjelse

/hiks
Avatar billede obhat Nybegynder
04. august 2005 - 09:39 #115
Det er blevet vældig godt:)
Tusind tak for hjælpen
Avatar billede obhat Nybegynder
04. august 2005 - 15:03 #116
Jeg har tænk en del over måden der tjekkes på.
Hvis serveren slet ikke findes, hvis et domaine simpelthen er lukket og dns nedtaget, retuneres der ikke nogen fejlkode, protokolen vil være ukendt.
men systemet siger alligevel ok.

Derimod hvis man tjekker om kode 200 er tilstede ????
Avatar billede hiks Nybegynder
05. august 2005 - 08:17 #117
den vil give fejl - hvis du ser de to sider som jeg har på min liste:

etfejllink.dk og etandetfejllink.dk fejler jo...

eller hvad mener du?

/hiks
Avatar billede obhat Nybegynder
05. august 2005 - 11:53 #118
Jeg har et par links, som er lukket og hvor DNS'en er nedtaget, de retunerer ikke nogen fejlkode, hvis man tager egenskaber for domainet, er protokollen ukendt, disse sider vil med:
' Hvis statuskoden er 400, 401, 402, 403, 404, 406, 410, så er det en fejl

blive godkendt som OK, selvom det er døde sider.
Med: if xmlhttp.status >= 200 and xmlhttp.status <= 299 then

ville de blive fanget som døde sider.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester