 Källkoden för /anders.enges/asp/guestbook2.asp
 Källkoden för /anders.enges/asp/guestbook2.asp 
<!--#include file="../inc/navstuff.asp" -->
Gästboksexemplet avspeglar kanske min motvilja mot MÅNGA sidor. 
Därför används samma sida för all hantering. Dessutom vet jag faktiskt inte hur 
gästböcker ser ut. Brukar ju inte surfa...<P>
Gästboken är baserad på en tabell med namnet <b>GUESTBOOK</b> som skall finnas 
i samma databasfil som EXEMPELDATA. Den är konstruerad på följande sätt:<br>
<blockquote>
<TABLE BORDER="1" cellpadding="4">
<tr bgcolor="#cccccc"><td><b>Fält</b></td><TD><b>Typ</b></TD><TD><b>Längd</b></TD><TD><b>Index?</b></TD></tr>
<tr><td>ID</td><TD>AutoNumber</TD><TD>Long Integer</TD><TD>Ja</TD></tr>
<tr><td>FROM</td><TD>Text</TD><TD>100</TD><TD>Nej</TD></tr>
<tr><td>EMAIL</td><TD>Text</TD><TD>100</TD><TD>Nej</TD></tr>
<tr><td>URL</td><TD>Text</TD><TD>120</TD><TD>Nej</TD></tr>
<tr><td>COMMENT</td><TD>Memo</TD><TD> </TD><TD>Nej</TD></tr>
<tr><td>DATE</td><TD>Date/Time</TD><TD> </TD><TD>Nej</TD></tr>
<tr><td>IP_ADRESS</td><TD>Text</TD><TD>18</TD><TD>Nej</TD></tr>
<tr><td>BROWSER</td><TD>Text</TD><TD>60</TD><TD>Nej</TD></tr>
</TABLE>
Samtliga Textfält skall dessutom ha <b>Allow Zero Length: Yes</b> för att vi skall kunna lämna tomt i fälten<p></p>
</blockquote>
Gästboken fungerar med hjälp av en enda sida. Denna sida används 
för tre olika saker<ol>
<li>Visa listan
<li>Visa en form för inmatning av nytt data till gästboken
<li>Lägger till denna nya post till tabellen</li>      
</ol>
Det som avgör vilken del som skall visas är vad som står på adressraden<ol>
<li>Om det är tomt så visas gästboken
<li>Om man klickar på länken sätts ?NY=1 till efter filenamnet och sidan laddas om
<li>Om det står NY=1 på adressraden visas en tom form för inmatning
<li>Om vi i denna form klickar på <b>OK</b> så kommer det att ske en submit 
på formen. Allt data från formen sänd då till sidan via adressraden
<li>Om det sänts data från formen (kontrolleras genom att 
    se om FORM= fanns på adressraden så läggs data in i datatabellen. Sedan laddas 
    sidan om utan någonting på adressraden för att komma tillbaka till listan<                      /li>  
                        
              
</ol>
Det är dock inte denna ordning som programmet är konstruerat. Om vi ser i programkoden kan vi se följande<ol>
<li><span class=asp>If Not IsEmpty(Request("FROM")) Then</span><br>
Kontrollerar om vi fått sidan efter en form submit (punkt 5 i föregående lista)<br>
En uppdatering sker då och sidan laddas om.
<li>Sedan kommer <span class=asp>if Request("NEW") = 1 Then</span> för att kontrollera om 
vi kommit hit efter att ha klickat på "Klicka här för att skriva i min gästbok" länken.
<li>Sedan kommer en <span class=asp>Else</span> dit vi kommer om adressraden var "tom"<br>
Där visas själva gästboken med en "normal" <span class=asp>Do While Not RS.EOF</span></li>
</ol>
Hela punkt 1 ovan sköts om av följande kod. Detta är en generell 
"insättningskod" som går enkelt att anpassa för egna behov<br>
<div class=code>
<span class=asp><%<br>
' Om vi submitar formen så kommer FROM helst att vara satt <br>
' Detta kan vi kontrollera här<br>
' Vi tar värdena som kommer i URL och sätter in dem i en databas<br>
' Orsaken till den "konstiga" placeringen i filen är att man <br>
' inte kan använda Response.Redirect om man redan skrivit <br>
' till sidan. <br>
' Man skulle kunna sätta Response.Buffer = 1 för att undvika detta<br>
' men det går även att sätta koden tillräckligt tidigt<br>
  If Not IsEmpty(Request("FROM")) Then<br>
   ' SQL satsen för tabellen<br>
   SQL = "SELECT * FROM GUESTBOOK"<br>   Set Conn =
      Server.CreateObject("ADODB.Connection")<br>
   Conn.Open strConn<br>   Set RS =
      Server.CreateObject("ADODB.RecordSet")<br>
   ' Måste öppna recordetten för uppdatering = 3 som sista<br>
   ' parameter<br>
   RS.Open SQL, Conn, 1, 3<br>
   ' Kollar vad klockan är nu<br>
   currentTime = now<br>
   ' Sätter in en ny post<br>
   RS.AddNew<br>
   ' tar värdet som kom för FROM från URL med Request<br>
   ' och sätter det i fältet med samma namn<br>
   ' vi upprepar för övriga fält<br>   RS("FROM") =
    Request("FROM")<br>   RS("EMAIL") =
    Request("EMAIL")<br>   RS("URL") =
    Request("URL")<br>   RS("COMMENT") =
    Request("COMMENT")<br>
   ' Vi kollar även (utan att de vet det) vilken<br>
   ' IP adress de har samt vilken browser de använder<br>   RS("IP_ADRESS") =
    Request.ServerVariables("REMOTE_ADDR")<br>   RS("BROWSER") =
    Request.ServerVariables("HTTP_USER_AGENT")<br>
   ' datum skall matas in i formen mm/dd/yyyy hh:mm:ss<br>
   ' för att fungera med alla LCID och lansdinställningar på servern<br>   RS("DATE") = Month(currentTime) & "/" & _<br>             Day(currentTime) & "/" & _<br>             Year(currentTime)& " " & _<br>             Hour(currentTime) & ":" & _<br>             Minute(currentTime) & ":" & _<br>
             Second(currentTime)<br>
   ' Vi sparar de nya fältvärdena<br>
   RS.Update<br>
   ' Sedan är vi färdiga med denna session<br>
   RS.Close<br>
   Conn.Close<br>
   Set RS = Nothing<br>
   Set Conn = Nothing<br>
   ' Vi visar inte sidan utan "redirectar" till samma sida men <br>
   ' utan några värden på URL raden (Ser snyggare ut!)<br>
   Response.Redirect Request.ServerVariables("URL")<br>
  End If<br>
%<br></span>
</div>
<p>
Hela punkt två sköts om av förljande kod<br>
<DIV class=code>
<FONT COLOR=#006400><!-- Form för att kunna mata in de nya värdena. --><br></FONT>
<form method="GET"><br>
<table><br>
<tr><br>
   <td><br>
      Jag är: <br>
   </td><br>
   <td><br>
      <INPUT TYPE="TEXT" NAME="FROM" SIZE="40" MAXLENGTH="100"><br>
   </td><br>
</tr><br>
<tr><br>
   <td><br>
      Email: <br>
   </td><br>
   <td><br>
      <INPUT TYPE="TEXT" NAME="EMAIL" SIZE="40" MAXLENGTH="100"><br>
   </td><br>
</tr><br>
<tr><br>
   <td><br>
      Hemsidan: <br>
   </td><br>
   <td><br>
      <INPUT TYPE="TEXT" NAME="URL" SIZE="40" MAXLENGTH="120"><br>
   </td><br>
</tr><br>
<tr><br>
   <td colspan="2"><br>
   <TEXTAREA NAME="COMMENT" COLS="60" ROWS="8"></TEXTAREA><br>
   </td><br>
</tr><br>
<tr><br>
   <td colspan="2"><br>
   <<FONT COLOR=#006400>!-- <br>
      Ett trix för att undvika "fula knappar". <br>
      Kör submit genom href o javascript <br>
      GUEST hänvisar till formen<br>
   --><br>
  <      /FONT>   <br>   <a 
href="javascript:document.GUEST.submit()"></DIV>
<DIV class=code>   <font face="Comic Sans 
MS,Arial,Helvetica,Univers" size="7">Ok</font></a><br>
      <br>
   <<FONT COLOR=#006400>!-- går tillbaka till huvudlistan --><br></FONT>
   <a href="<span class=asp><% =Request.ServerVariables("URL") %></span>"></DIV>
<DIV class=code>    <font face="Comic Sans 
MS,Arial,Helvetica,Univers" size="7">Tillbaka</font></a><br>
   </td><br>
</tr><br>
</table><br>
</form><br>
<FONT COLOR=#006400><!-- Formen tog slut --><br></DIV></FONT>
Hela punkt tre sköts om av följande kod<br>
<div class=code>
<span class=asp><%<br>
' Öppna tabeller och sorter så de nyaste kommer först<br>
' vi visar bara de 20 senaste (TOP 20)<br>
  SQL = "SELECT TOP 20 * FROM GUESTBOOK ORDER BY DATE DESC"<br>
  Set Conn =
        Server.CreateObject("ADODB.Connection")<br>
  Conn.Open strConn<br>
  ' En simpel forward only duger<br>
  Set RS = Conn.Execute(SQL)<br>
%></span><br>
<font face="Comic Sans MS,Arial,Helvetica,univers" size="5"><br>
<a href="<span class=asp><% =Request.ServerVariables("URL")%></span>?NEW=1"><br>
<img src="../images/bullet2.gif" border="0"><br>
Klicka här för att skriva i min gästbok</a><br>
</font><br>
<span class=asp><%<br>
 theRow = 1<br>
 Do While Not RS.EOF <br>
%></span><br>
<div align="<span class=asp><% =getZigZag %></span>"><br>
<table width="400" border="3" BORDERCOLORLIGHT="#F5F5DC" BORDERCOLORDARK="#BC8F8F"><br>
<tr><td>Mitt namn:</td><td bgcolor="FFFFFF"><span class=asp><%=RS("FROM")%></span> </td></tr><br>
<tr><td>Email:</td><td bgcolor="FFFFFF"><span class=asp><%=RS("EMAIL")%></span>; </td></tr><br>
<tr><td>Hemsida:</td><td bgcolor="FFFFFF"><span class=asp> <ahref="http://<%=RS("URL")%></span>" target="_new"><span class=asp><%=RS("URL")%></span></a> </td></tr><br>
<tr><td colspan="2" bgcolor="FFFFFF"><span class=asp><%=RS("COMMENT")%></span> </td></tr><br>
<tr><td width="100">Tid:</td><td bgcolor="FFFFFF"><span class=asp><%=RS("DATE")%></span> </td></tr><br>
</table><br>
</div><br>
<span class=asp><%<br>
 RS.MoveNext<br>
 Loop<br>
 RS.Close<br>
 Conn.Close<br>
 Set RS = Nothing<br>
 Set Conn = Nothing<br>
%</span><br>
...<br>
<span class=asp><%<br>
' Jag tycker om "varannangångs kod" !<br>
Dim	zigZag<br>
Function getZigZag()<br>
   if zigZag Then<br>
      getZigZag = "LEFT"<br>
   Else<br>
      getZigZag = "RIGHT"<br>
   End If<br>
   zigZag = Not zigZag<br>
End Function<br>
%</span><br>
</div><!--#include file="../inc/footer.asp" -->