<< Föregående: Inledning Nästa: ASP-koden i default.asp >>

Filen skriv.asp – bara ASP-kod

Den här filen kommer aldrig att visas för besökaren. Därför behöver den ingen HTML-kod alls. I stället är det här det mesta av jobbet utförs och allt som skrivs här är ASP-kod.

Skriptavgränsarna

All ASP-kod skall inledas och avslutas med ASP-skriptavgränsare. Sätt in ett <% längst upp i filen och ett %> längst ned. Det är mellan dessa skriptavgränsare du skriver all kod. Avgränsarna är mycket viktiga – varje försök att "glömma bort" dem leder omedelbart till körfel.

Kommentarer

En mycket god regel är att kommentera koden – hellre för många kommentarer än för få. Anledningen är helt enkelt att man glömmer vad man har gjort och varför.

Nybörjarprogrammerare tror ofta inte på det här. "Jag som är ung och frisk och stark och har en välsmord hjärna – jag glömmer inte alls!" Erfarna programmerare vet att det inte är så. Alla glömmer, oavsett hur pigg hjärnan är.

Alltså: kommentera i massor. Du kommer att ha glädje av det när du senare försöker läsa din kod, hitta felen i den (felsökning är en stor del av allt programmerande), förstå hur du har tänkt, lista ut vad de många kodraderna egentligen gör...

I ASP-kod kan du skriva kommentarer på två sätt. Antingen skriver du kommentaren på en egen rad som inleds med ett enkelt citationstecken – enkelfnutt. Exempel:

'Det här är en kommentarsrad

Eller också lägger du kommentaren på samma rad som koden men i slutet, även då med enkelfnutt. Exempel:

Dim strDatabas   'Innehåller databasens lagringsplats och namn

Ett bra sätt att samla kommentarer är det här, som Microsoft rekommenderar:

'*************************************
'Purpose: vad rutinen skall göra
'Inputs: en lista över alla parametrar som skickas till rutinen
'   parameter1: beskrivning, datatyp och så vidare
'   parameter2: beskrivning, datatyp och så vidare
'Returns: vilken datatyp rutinen returnerar samt vad den innehåller
'Comments: andra kommentarer om rutinen, uppdateringshistorik och så vidare
'*************************************

Det här gör det lätt att se kommentarerna i koden, utan att behöva leta för mycket.

Konventioner för namngivning av variabler

Jag skall bara helt kort nämna detta med prefix för variabler. Prefixen är inte nödvändiga, men du har nytta av dem när du skall läsa och förstå din kod.

I din kod kommer du att behöva ett antal variabler. En del av dem skall innehålla textsträngar, andra innehåller talvärden eller till exempel datum. Genom att konsekvent använda prefix till variabelnamnet ser du lätt vilken typ variabeln är. Ett exempel är variabeln strDatabas som jag använde ovan – str betyder här att variabeln innehåller en textsträng. Några andra exempel:

bln = booleanskt värde (sant eller falskt)
dat = datum/tid
int = integer

skriv.asp

Nog med pekpinnar – vi kastar oss raskt in i ASP-koden till skriv.asp i stället. Jag kommer att gå igenom koden uppifrån och ned en bit i taget, och efter varje avsnitt förklarar jag vad avsnittet gör (och varför).

<%

'Skapa ett filsystemobjekt
   Set fsoMinFil = Server.CreateObject("Scripting.FileSystemObject")

'Initiera ett filobjekt med sökväg och namn på textfilen som skall öppnas

'********************************
'Skriv sökvägen till textfilen som skall användas.
'Textfilen måste finnas och innehålla något (det räcker med
'ett enda mellanslag). I annat fall kraschar skriptet.
'Lägg gärna sidslutet här, till exempel kontaktadressen, men
'tänk på att skriva all kod i en enda rad.
'********************************

'********************************
'Metod 1: Använd den här metoden för att lägga textfilen
'utanför rotmappen på servern – fråga webbhotellet
'vilken adress du skall använda.
'********************************
'  Set strFilObjekt = fsoMinFil.GetFile("här anger du adressen/gester.txt")

'********************************
'Metod 2: Använd den här metoden när textfilen ligger i samma
'mapp som övriga filer.
'********************************
   Set strFilObjekt = fsoMinFil.GetFile(Server.Mappath("gester.txt")


Förklaringar

Filen inleds med skriptavgränsaren <% som är ett absolut krav.

Sedan använder vi metoden Server.CreateObject för att skapa ett filsystemobjekt, som vi behöver för att kunna skriva till och läsa från textfilen. Objektet får prefixet fso för att vi direkt skall kunan se att det är just ett filsystemobjekt.

Nästa steg blir att tala om för skriptet var textfilen finns. Som du ser i kommentarerna måste textfilen du anropar redan finnas och den måste dessutom innehålla någonting – om så bara ett mellanslag. Men vi kan utnyttja det här kravet till något mycket bättre. Jag återkommer till detta i avsnittet Snygga till textfilen.

I koden ser du två olika metoder för att ange sökvägen till textfilen. Den första – den som är "bortkommenterad" – använder du om textfilen skall ligga utanför din rotkatalog på servern, så att den blir hyggligt oåtkomlig för angrepp utifrån (den kommer ju att innehålla e-postadresser).

Ta i så fall kontakt med supporten på ditt webbhotell och fråga vilken adress du skall använda. Den kan till exempel se ut så här:

g:/inetpub/mer_text/mer_text/mer_text.domän

Ta bort enkelfnutten i början av raden och sätt i stället en enkelfnutt i början av följande rad:

   Set strFilObjekt = fsoMinFil.GetFile(Server.Mappath("gester.txt")

i stället.

Så länge du provkör din gästbok hemma på datorn och utan att vara uppkopplad, måste du använda metoden med Server.MapPath(). Annars kommer skriptet inte att fungera.

Våra första variabler

I det här första kodavsnittet har vi angett våra första variabler – fsoMinFil och strFilObjekt. Prefixet på den senare visar att det är en variabel som skall innehålla en textsträng, och den textsträngen kommer att bestå av sökvägen till textfilen.

Server.MapPath()

Server är ett objekt i ASP och MapPath("url") är en metod för detta objekt. Genom att skriva så här får vi den fullständiga, fysiska sökvägen till och filnamnet på den resurs som finns på den adress som anges mellan citationstecknen – i det här fallet vår textfil.

Vår variabel strFilObjekt tilldelas alltså värdet "sökvägen till textfilen och textfilens namn".

'Öppna textfilen
   Set tsObjekt = strFilObjekt.OpenAsTextStream

'Läs in tidigare inlägg från textfilen
'Vi gör detta för att kunna placera det senaste inlägget först
   strTidigareInlagg = CStr(tsObjekt.ReadAll)


Förklaringar

Vi skall nu öppna vår textfil och läsa in allt som redan finns i den. Vi använder metoden OpenAsTextStream, som gör att vi kan läsa från och skriva till filen.

Vi skapar ett TextStream-objekt – tsObjekt – och talar om vad det skall göra, nämligen använda filen vars sökväg finns i strFilObjekt och öppna den som TextStream.

Sedan skapar vi en ny strängvariabel – strTidigareInlagg – för att fylla den med allt som tidigare finns skrivet i textfilen. Detta gör vi för att senare, när textfilen får ett nytt inlägg, kunna placera alla tidigare inlägg efter det nya inlägget.

Vi talar om att den nya strängvariabeln som en textsträng (CStr) skall ta in allt som finns i filen (tsObjekt) och läsa in filen som en enda sträng (ReadAll).

Därmed har vi allt som textfilen innehåller sparat i en enda variabel.

Formuläret

Nu skall vi sysselsätta oss med de uppgifter som kommer från formuläret på sidan default.asp. Observera att kodraderna här bryts till flera rader på en del ställen. Kopiera koden härifrån så att du undgår dessa felaktiga radbrytningar.

Mycket av koden som har med formuläret att göra skulle kunna förkortas och/eller förenklas. Men jag gör inte det – i stället låter jag den vara litet onödigt lång för att det skall bli lättare att förstå vad den gör.

Jag har kommenterat koden rikligt för att det skall bli enklare att särskilja de olika funktionerna. Alla dessa kommentarer behöver du naturligtvis inte ta med i din egen kod, men de skadar inte heller!

'Hämta från formuläret, kontrollera innehållet och formatera det som skall läggas till i textfilen.

'Hämta innehållet i formulärets namnrad.
   strNytt_namn = Request.Form("mitt_namn")

'Hämta innehållet i formulärets textruta, det vill säga själva inlägget.
   strNy_text = Request.Form("mitt_inlagg")

'Ta bort eventuella mellanslag i början av namnet. Mellanslag längre in, som mellan förnamn och efternamn, lämnas kvar.
   For i = 1 to len(strNytt_namn)
   if not mid(strNytt_namn,i,1) = " " then exit for
      if mid(strNytt_namn,i,1) = " " then
      strNytt_namn = mid(strNytt_namn,i + 1,len(strNytt_namn))
      end if
   next

'Ta bort mellanslag i början av inlägget.
   For i = 1 to len(strNy_text)
   if not mid(strNy_text,i,1) = " " then exit for
      if mid(strNy_text,i,1) = " " then
      strNy_text = mid(strNy_text,i + 1,len(strNy_text))
      end if
   next

'Kolla om ett namn har skrivits in. Detta behövs för att stoppa spammare med javaskript inaktiverat.

'Om formuläret innehåller fel skickar de fyra följande if-satserna besökaren tillbaka till formulärsidan.

'Om namnet är det som från början stod i namnraden, alltså "Skriv ditt namn", godkänns det inte.
   if strNytt_namn = "Skriv ditt namn" then
   response.redirect("gestbok.asp")
   end if

'Kolla att det finns ett namn - de borttagna mellanslagen i början kan ju medföra att det inte finns något namn kvar.
   if strNytt_namn = "" then
   response.redirect("gestbok.asp")
   end if

'Kolla att det finns ett inlägg. Se föregående kommentar.
   if strNy_text = "" then
   response.redirect("gestbok.asp")
   end if

'Kolla att inlägget inte inleds med hake – detta stoppar de allra flesta spammarna, eftersom deras inlägg skrivs in som html-kod.
   if mid(strNy_text,1,1) = "<" then
   response.redirect("gestbok.asp")
   end if

'Hämta innehållet i epost
   strNy_epost = Request.Form("e_post")
   If strNy_epost = "E-postadress" Then
   strNy_epost = ""
   Else
   strNy_epost = Request.Form("e_post")

'Om e-postadress angavs skrivs HTML-koden för hela raden inklusive länk till e-postadressen
   strNy_epost = "<B class=""bildtext""/>E-post: </B><A HREF=""mailto:" & strNy_epost & """>Skriv till mig</A>
"
   End if

'Hämta innehållet i hemsida
   strNy_hemsida = Request.Form("hemsida")
   If strNy_hemsida = "Hemsida (uteslut http://)" Then
   strNy_hemsida = ""
   Else
   strNy_hemsida = Request.Form("hemsida")

'Även om det står att man inte skall ange http://, kommer en del besökare att göra det. Följande rader tar bort den delen av hemsidesadressen
      If Left(strNy_hemsida, 7) = "http://" or Left(strNy_hemsida, 7) = "HTTP://" then
      strNy_hemsida = Mid (strNy_hemsida, 8, Len (strNy_hemsida) - 7)
      End if

'Om hemsidesadress angavs skrivs HTML-koden för hela raden inklusive länk till den angivna sidan
   strNy_hemsida = "<B class=""bildtext"">Hemsida: </B><A HREF=""http://" & strNy_hemsida & """ target=""_blank"">Min hemsida</A>
"
   End if

'HTML-koda å, ä, ö, HTML-tagghakar och liknande tecken från namn och inlägg. Detta gör att html-kod inte kan köras i gästboken.
   strNytt_namn = Server.HTMLEncode(strNytt_namn)
   strNy_text = Server.HTMLEncode(strNy_text)


'När den eventuella html-koden är borta, gör vi om enterslag till radmatningar
   strNy_text = replace(strNy_text,chr(13),"
")

'Vi skulle kunna ta bort html-koden även från e-post- och hemsidesadress, men avstår från det för att undvika att visa HTML-koden på sidan. De båda följande raderna är bortkommenterade.
   'strNy_epost = Server.HTMLEncode(strNy_epost)
   'strNy_hemsida = Server.HTMLEncode(strNy_hemsida)


Förklaringar

Om besökaren har skrivit in sin e-postadress och/eller hemsidesadress, kommer ASP-koden att skriva HTML-kod för dessa så att det skapas länkar till adresserna. Om besökaren inte har angett dessa uppgifter, skapas inte ens raderna för e-post- och hemsideslänkar.

Men när länkkoden skall skrivas, kräver både HTML-kod och ASP-kod en hel del citationstecken, vilket betyder att det kommer två eller flera citationstecken i rad. Här blir det viktigt att hålla ordning på fnuttarna!

Request-objektet

Request-objektet gör att vi får tillgång till det som besökaren gör på webbsidan. Objektet har fem "samlingar" och av dem skall vi använda Form, som gör att vi får tillgång tll det som har skrivits i ett formulär vars METHOD-attribut är satt till POST.

Flera nya strängvariabler

Vi behöver nu en rad nya variabler för att hantera innehållet i de olika delarna av formuläret.

  • strNytt_namn hämtar med Request.Form innehållet i formulärets textrad mitt_namn
  • strNy_text hämtar innehållet i textarean mitt_inlagg
  • strNy_epost hämtar innehållet i textraden e_post
  • strNy_hemsida hämtar innehållet i textraden hemsida

De båda första variablerna skall alltid ha ett innehåll. Att de har det kontrollerade vi först på default.asp med hjälp av javaskriptet och sedan i skriv.asp med hjälp av if-satserna ovan.

Men de båda sista variablerna skall vi särbehandla. Om besökaren inte skrev in e-postadress eller hemsidesadress, vill vi att variablerna skall vara tomma, så att de inte skriver ut någonting på sidan.

Titta på de båda kodblock som följer efter 'Hämta innehållet i epost. Den första raden har samma form som när det gäller namnet och inlägget. Men sedan kommer två rader med den första delen av ett villkor:

   If strNy_epost = "E-postadress" Then
   strNy_epost = ""

Det här betyder: Om (If) strNy_epost innehåller det som stod i formuläret redan när sidan laddades, nämligen "E-postadress", har besökaren inte skrivit in en e-postadress. I så fall skall strängvariabeln strNy_epost lämnas helt tom ("").

I annat fall (Else), det vill säga om besökaren har skrivit en e-postadress, skall variabeln få det innehåll som finns i formulärets "e_post". Egentligen behöver vi inte upprepa den här raden som jag har gjort i koden, men vi gör det ändå för tydlighetens skull.

Else-delen börjar alltså med att ge strNy_epost det värde som fanns i formuläret. Sedan skall detta värde placeras i HTML-kod, för att skapa en länk. Därför gör vi här om strNy_epost så att den kommer att innehålla både HTML-koden och besökarens e-postadress, samt en text som skall visas i länken: Skriv till mig.

HTML-koden skall innehålla "E-post:" i fetstil följt av ett mellanslag (&nbsp;). Sedan följer på samma rad länken till e-postadressen med länktexten Skriv till mig. Efter länken lägger vi in en radmatning <BR>.

Allt detta samlar vi ihop och stoppar in i variabeln strNy_epost. Vi kommer att använda den längre ned. Glöm för all del inte att avsluta villkorskoden med ett "End if".

På samma sätt behandlar vi variabeln strNy_hemsida. Men vi skall sätta ett extra villkor på den här variabeln.

Trots att du har talat om i formuläret att man inte skall skriva in http://, kommer en del besökare att göra det. I dessa fall skulle länken till besökarens hemsida inte fungera, eftersom den skulle börja med http://http://.

Alltså kontrollerar vi om hemsidesvaribelns innehåll börjar med http:// eller HTTP:// och tar i så fall bort de 7 första tecknen ur variabeln.

Koda tecken som skulle kunna ställa till problem

Efter villkorskoden följer två rader som byter ut potentiellt problematiska tecken mot deras HTML-motsvarigheter. Men när detta är gjort byter vi ut de enterslag besökaren har gjort mot radmatningar i html-kod, för att "nytt stycke" verkligen skall bli nytt stycke.

Därmed har våra fyra strängvariabler fått det innehåll de skall ha och vi kan fortsätta.

'Samla ihop allt som skall skrivas till textfilen, inklusive datum (NOW) för det nya inlägget och alla gamla inlägg
'Samtidigt skriver vi HTML-koden för visningen på sidan.
'Hela koden nedan skall stå på en enda rad

   strNytt_inlagg = "<P><I>Skickat:&nbsp;" & NOW & "</I><BR><B>" & strNytt_namn & "</B><BR>" & strNy_text & "<BR>" & strNy_epost & strNy_hemsida & "</P>" & strTidigareInlagg


Förklaringar

Först gör vi en ny strängvariabel – strNytt_inlagg. I den skall vi samla allt det som skall skrivas till textfilen, och vi gör det i rätt ordning:

  1. Först skrivs den kursiverade texten Skickat:, följd av ett mellanslag och sedan datum och tid då inlägget postades.
  2. På en ny rad skrivs besökarens namn i fetstil.
  3. På nästa rad följer texten i besökarens inlägg.
  4. Om besökaren har angett en e-postadress, anges den på en egen rad som in leds med ett "E-post:" i fetstil, följt av länktexten "Skriv till mig". Om besökaren inte angav en e-postadress, skapas inte denna rad. All kod till raden hämtas från variabeln strNy_epost.
  5. Om besökaren angav en hemsidesadress skapas en ny rad med denna adress som länk. Koden hämtas från variabeln strNy_hemsida.
  6. De fyra inledande delarna skapas som ett sammanhållet P-element. Efter detta läggs all text som redan tidigare fanns i textfilen. Denna hämtas från variabeln strTidigareInlagg.

Därmed har strNytt_inlagg fått hela det innehåll som skall skrivas till textfilen. Nu gör vi det.

'Skapa en helt ny textfil med samma namn som den gamla
'Innehållet från den gamla textfilen finns redan sparat i
'variabeln strTidigareInlagg

'Även här använder du metod efter hur du tänker lägga
'textfilen på servern

'********************************
'Metod 1: Använd den här metoden för att lägga textfilen
'utanför rotmappen på servern – fråga webbhotellet
'vilken adress du skall använda.
'********************************
'  Set tsObjekt = fsoMinFil.CreateTextFile("här anger du adressen/gester.txt")

'********************************
'Metod 2: Använd den här metoden när textfilen ligger i samma
'mapp som övriga filer.
'********************************
   Set tsObjekt = fsoMinFil.CreateTextFile(Server.MapPath("gester.txt"))

'Skriv det nya inlägget följt av alla de gamla
'till den nya textfilen
   tsObjekt.Write CStr(strNytt_inlagg)


Förklaringar

Det som händer här är att det skapas en helt ny och tom textfil, med samma namn som den gamla textfilen. Den gamla textfilen kommer helt enkelt att skrivas över, men innehållet i den filen har du redan sparat i variabeln strNytt_inlagg, där det har placerats efter det nya inlägget.

När filen har skapats, skrivs innehållet i strNytt_inlagg till filen. I och med detta finns all text och all kod som skall skrivas på default.asp i textfilen.

Det som nu återstår är att stänga de öppna objekten och gå tillbaka till sidan default.asp. Det gör vi med den avslutande kodsnutten. Glöm inte att sätta in den avslutande skriptavgränsaren %>.

'Stänger objekt som inte längre behövs
   Set fsoMinFil = Nothing
   Set tsObjekt = Nothing
   Set strFilObjekt = Nothing

'Tillbaka till sidan med gästboksformuläret
   Response.Redirect "default.asp"

%>

Nu har du hela koden till skriv.asp. Spara filen – sedan skall vi fortsätta med ASP-koden som skall finnas på default.asp.

   << Föregående: Inledning Nästa: ASP-koden i default.asp >>

© SupportData.Net