Avatar billede apo Praktikant
22. februar 2005 - 16:01 Der er 9 kommentarer og
1 løsning

Loop nedlægger server

Att.: ASP-hajer (Kun Jer der virkelig har forstand på ASP!).

Jeg har følgende loop:

<%
' INDSÆTTER 3 SIDSTE ARTIKLER
' --------------------------------------------------
  strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=d:\www\xxxxxx.dk\db\artikler.mdb"
  Set myConn = Server.CreateObject("ADODB.Connection")
  myConn.Open strDSN

  Dim strSQL, rs, Id, Foto, Titel, Blikfang
  Id = rs("Id")
  Foto = rs("Foto")
  Titel = rs("Titel")
  Blikfang = rs("Blikfang")

  strSQL = "SELECT TOP 3 * FROM Artikler ORDER BY ID DESC"
  Set rs = myConn.Execute(strSQL)

  Do Until rs.EOF
%>
<table border="0" cellspacing="0" cellpadding="0">
          <tr>
            <td width="100" height="100" valign="top"><a href="VisArtikel.asp?ArtikelID=<%=Id%>"><img
            src="gfx/artikler/<%=Foto%>" border="0" WIDTH="100" HEIGHT="100"></a></td>
            <td width="10" height="100"></td>
            <td width="370" height="100" valign="top"><table border="0" cellspacing="0"
            cellpadding="0" class="tekst">
              <tr>
                <td width="370" height="0" valign="top" class="overskrift"><%=Titel%>
</td>
              </tr>
              <tr>
                <td width="370" height="3"></td>
              </tr>
              <tr>
                <td width="370" height="0" valign="top"><%=Left(Blikfang,220)%>
<% Response.Write " ..."%>
</td>
              </tr>
              <tr>
                <td width="370" height="10" valign="top"></td>
              </tr>
              <tr>
                <td width="370" height="0" valign="top"><a href="VisArtikel.asp?ArtikelID=<%=Id%>"
                class="link3">Læs artiklen</a> | <a href="Artikler.asp" class="link3">Alle artikler</a></td>
              </tr>
            </table>
            </td>
          </tr>
          <tr>
            <td width="100" height="20" valign="top"></td>
            <td width="10" height="20"></td>
            <td width="370" height="20" valign="top"></td>
          </tr>
        </table>
<%
      rs.MoveNext
  Loop

  rs.Close
  myConn.Close
  Set myConn = Nothing
%>

Er dette loop korrekt opsat, eller bruger det urimelig store systemressourcer (vil det f.eks. kunne nedlægge en server?)?

Ifølge min udbyder af webhotel skulle netop dette loop være årsagen til at én af dennes servere har været nedlagt siden i lørdags...

Er det mig der har anvendt en skodkode eller tager udbyderen fejl?

Apo
Avatar billede hiks Nybegynder
22. februar 2005 - 16:11 #1
hej

- som jeg ser det: Nej - ved et lille hurtigt gennemsyn. Dog er det lidt mærkeligt i form af at du sætter dine variable udenfor loopet. Men det burde bare give dig en syntaks fejl. Så medmindre at du i din database bruger det samme id i hele din database med en mia. records så virker det lidt mærkeligt.

Min rettelser kan du se nedenfor - og bevirker at du nu får tre forskellige nyheder og ikke bare een.

<%
' INDSÆTTER 3 SIDSTE ARTIKLER
' --------------------------------------------------
  strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=d:\www\xxxxxx.dk\db\artikler.mdb"
  Set myConn = Server.CreateObject("ADODB.Connection")
  myConn.Open strDSN

  Dim strSQL, rs, Id, Foto, Titel, Blikfang

  strSQL = "SELECT TOP 3 * FROM Artikler ORDER BY ID DESC"
  Set rs = myConn.Execute(strSQL)

  While rs.EOF = False '<- rettet
    Id = rs("Id") '<- rettet
    Foto = rs("Foto") '<- rettet
    Titel = rs("Titel") '<- rettet
    Blikfang = rs("Blikfang") '<- rettet
%>
<table border="0" cellspacing="0" cellpadding="0">
          <tr>
            <td width="100" height="100" valign="top"><a href="VisArtikel.asp?ArtikelID=<%=Id%>"><img
            src="gfx/artikler/<%=Foto%>" border="0" WIDTH="100" HEIGHT="100"></a></td>
            <td width="10" height="100"></td>
            <td width="370" height="100" valign="top"><table border="0" cellspacing="0"
            cellpadding="0" class="tekst">
              <tr>
                <td width="370" height="0" valign="top" class="overskrift"><%=Titel%>
</td>
              </tr>
              <tr>
                <td width="370" height="3"></td>
              </tr>
              <tr>
                <td width="370" height="0" valign="top"><%=Left(Blikfang,220)%>
<% Response.Write " ..."%>
</td>
              </tr>
              <tr>
                <td width="370" height="10" valign="top"></td>
              </tr>
              <tr>
                <td width="370" height="0" valign="top"><a href="VisArtikel.asp?ArtikelID=<%=Id%>"
                class="link3">Læs artiklen</a> | <a href="Artikler.asp" class="link3">Alle artikler</a></td>
              </tr>
            </table>
            </td>
          </tr>
          <tr>
            <td width="100" height="20" valign="top"></td>
            <td width="10" height="20"></td>
            <td width="370" height="20" valign="top"></td>
          </tr>
        </table>
<%
      rs.MoveNext
  Wend '<- rettet

  rs.Close
  myConn.Close
  Set myConn = Nothing
%>

/hiks
Avatar billede apo Praktikant
22. februar 2005 - 16:31 #2
"Min rettelser kan du se nedenfor - og bevirker at du nu får tre forskellige nyheder og ikke bare een."

Hiks > Jamen, jeg har hele tiden fået vist tre forskellige artikler, så koden har fungeret godt nok (og jeg har ikke modtaget nogen form for syntaksfejl!). I øvrigt indeholder databasen kun 5 records i alt :-)

Hvad siger du så til min webhotel-udbyders udtalelse om at min kode har nedlagt serveren de sidste 3 dage? Er det fysisk umuligt med den kode eller er han blot ude på at kaste skylden videre?

Hans begundelse var at loopet kørte uendeligt og derfor optog alle ASP-ressourcer på serveren, således at alle andre websites på serveren ikke kunne fungere.

Apo
Avatar billede hiks Nybegynder
22. februar 2005 - 16:39 #3
Er du sikker på at det er den fil han henviser til?

Får du vist siden hurtigt og uden at den står og hænger? Siden er ikke større end det du har pasted ind her vel?

Ang. det andet så kan jeg altså ikke få det til at passe at den viser forskellige nyheder (og i det hele taget at den viser nyheder), da de er placeret udenfor loopet og inden du udfører din sql - hvilket vil sige at dit recordset slet ikke eksisterer.

/hiks
Avatar billede apo Praktikant
22. februar 2005 - 16:51 #4
Jeps, jeg er helt sikker på at det er den fil de henviser til (de havde nemlig været inde og omdøbe den til Default.asp_DEFEKT)

Jeg har i dag fjernet alle filer fra mit webhotel, men indtil i lørdags fungerede alt som det skulle (og blev vist efter hensigten). Koden (med undtagelse af få rettelser) har set sådan ud i hvertfald siden nytår, og har kørt uden problemer.

Jeg har ikke pastet hele sidekoden herind, men resten er i HTML. Dog har jeg i toppen af siden følgende ASP-kode:

<% Option Explicit %>
<% Session.Timeout = 60 %>
<%
  If Session("Start") <> "xxx" Then
      Response.Redirect("/default.asp")
  End If
%>

Jeg kan ikke se hvordan det skulle kunne nedlægge en server, med mindre de har overfyldt den med kunder, som i en indisk togkupé :-D

Apo
Avatar billede hiks Nybegynder
22. februar 2005 - 16:59 #5
men prøv at se hvad du skriver i toppen der...

du bliver ved med at redirecte til den samme side hvis du ikke har sat session("start") eller den ikke er "xxx" - er det ikke den der er fejlen så? Hvis en bruger eller en robot har trigget den side og ikke har fået sat session("start") ?

/hiks
Avatar billede apo Praktikant
22. februar 2005 - 17:11 #6
Det har du jo ret i... Weird! For den plejer at være sat til:

<%
  If Session("Start") <> "xxx" Then
      Response.Redirect("/default2.asp")
  End If
%>

Jeg ved ikke hvorfor den nu er ændret til at skulle redirecte til default.asp (jeg har selv sat den til default2.asp som er en adgangskontrol via sessions). Så må det jo have været det der har udløst fejlen.

Men er det virkelig nok til at kunne nedlægge en hel server?

Apo
Avatar billede hiks Nybegynder
22. februar 2005 - 17:19 #7
tjaaa - det er et godt spørgsmål om det kan være det - men hvis der er mange der har ladet siden stå og loade sådan der kan det vel godt resultere i mange sidevisninger - og noget arbejde for en server. Men det virker mærkeligt da den jo stopper udførelsen når browseren lukkes.

og ang. robotter såsom google og msn har en deadlock mekanisme således at de afbryder sessionen. Så det virker mærkeligt.

Det havde været mere logisk med dit loop! :o)

/hiks
Avatar billede apo Praktikant
22. februar 2005 - 17:30 #8
Eftersom jeg p.t. ikke har annonceret websitet (jeg er stadig igang med at udvikle det), burde det kun være mig der ved at siderne ligger der. Hvis en robot ankommer til forsiden (index.htm) vil dens søgning stoppe der, da resten ligger som skyggesider (der er ingen links der fører videre fra index.htm).

Så det undrer mig virkelig hvis mine besøg alene skulle have kunne lave al balladen. Bortset fra hvis robotterne også er sat til at søge efter Default.asp?

Jeg undrer mig også over at mit loop ikke burde fungere, for det har som nævnt virket upåklageligt og uden fejl i rigtig lang tid :-D

Hvad er forskellen på mit gamle loop, og den rettelse du har foretaget? Altså loop uden 'Do' og med 'Wend' i stedet for 'Next'.

Apo

P.S. Smid et svar så får du de 15 points :-)
Avatar billede hiks Nybegynder
22. februar 2005 - 17:40 #9
ja - det er også det jeg synes er ulogisk - men hvis du har testet det og den virkelig bliver ved med at stå og loope siden så kan det vel kun være det.

der er ikke den store forskel i typen af loops - jeg syntes dog at while løkker er kønnere. Men det har med hastighed at gøre og det hænger også sammen med datatyperne osv. Men så længe du ikke arbejder med større recordsets så er det vist ligegyldigt.

/hiks
Avatar billede apo Praktikant
22. februar 2005 - 17:54 #10
Ah, nu ved jeg hvad du mener mine variabler uden for loopet... Jeg er først gået igang med at dim'e efter problemerne med serveren opstod (derfor er de udenfor loopet, da jeg endnu ikke har testet siden med dim)! Det er derfor jeg endnu ikke har oplevet fejl ved loopet.

Hastigheden er vigtig, så jeg vil da benytte mig af din metode hvis det giver større hastighed. Databasen indeholder på nuværende tidspunkt kun 5 records, men kommer på længere sigt til at indeholde flere.

Tak for hjælpen, der er points til dig :-)

// Lukker

Apo
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