Detta är tredje delen i artikelserien om hur man bygger en webbshop i ASP från grunden. Har du missat de tidigare delarna finns de här: Hur man gör en webbshop i ASP (del 1) och Hur man gör en webbshop i ASP (del 2). Vår webbshop hämtar nu kategorierna från databasen och länkar dem enligt default.asp?kategori=[ID]. Vi vill självklart visa produkterna under kategorisidorna och det är vad denna del kommer avhandla.
—
Vi har nu unika länkar som alla skiljer sig åt på en punkt - ID-numret i länken. Logiskt sätt måste vi använda oss av denna siffra för att kunna ta fram produkter som i databasen har samma siffra i fältet “intKategoriID” eftersom de tillhör den aktuella kategorin. Siffran i länken kan man skriva ut på sidan genom:
<% Response.Write Server.HTMLEncode(Request.QueryString(”kategori”)) %>
Oj, tänker ni kanske. Det var omständigt. Måste allt det där finnas med? Svaret är både ja och nej. Till en början använder vi oss av Response.Write, funktionen för att skriva ut något med hjälp av ASP-kod. Request.QueryString(”kategori”) innehåller värdet av “kategori=[ID]” i länken, dvs 1 eller 2 etc. Ett sista steg är att kapsla in QueryString-värdet med funktionen Server.HTMLEncode() som som sagt gör att eventuell HTML-kod skrivs ut i klartext. Det är nödvändigt eftersom det annars är lätt för elakartade besökare att knappra in exempelvis denna länk: default.asp?kategori=<script src=”elakt-script.js”> som vid utskrift då skriver ut och kör javascriptet “elakt-script.js”, och det är aldrig att rekommendera. Det kan ge fel personer kontroll över er webbshop.
Vi vill dock inte skriva ut värdet just nu. Vi vill bara använda oss av det i vår SQL-sträng för att sålla ut så enbart rader där intKategoriID = Request.QueryString(”kategori”) finns med. Vi förflyttar oss således till main-sektionen i default.asp och skriver följande:
<% Set Conn = Server.CreateObject(”ADODB.Connection”)
Conn.Open “Driver={MySQL ODBC 3.51 Driver};Server=” & strMySQLServer & “;port=” & strMySQLPort & “;Database=” & strMySQLDatabase & “;User=” & strMySQLUsername & “;Password=” & strMySQLPassword & “;”
Vår SQL-sträng måste vi skriva om enligt innan nämnda frågeutformning - vi vill ta fram alla rader från tabellen produkter där intKategoriID är samma som Request.QueryString(”kategori”)
SQL = “SELECT ID, intKategoriID, strProdukt, strProduktBeskrivning, intPris FROM produkter WHERE intKategoriID = ” & strip(Request.QueryString(”kategori”)) & ” ORDER BY strProdukt”
Vad är då funktionen strip() för något? När man använder sig av variabler i sina SQL-strängar är det väldigt viktigt att man först säkerställer att inte vad som helst skickas med. I detta fallet vill vi enbart ha en siffra, men om man är elakartad besökare kan man genom att manipulera Request.QueryString(”kategori”) i värsta fall rasera hela databasen. strip() är en egenutvecklad funktion som helt sonika förmildrar riskerna med att drabbas av ondsinta inputs i SQL-strängen. Detta genom att ersätta alla enkelfnuttar ‘ med ” (två enkelfnuttar). Kopiera funktionen nedanför och klistra in näst längst upp i default.asp, under inkluderingen av settings.asp:
<% Function strip(input)
retVal = replace(input, “‘”, “””)
strip = retVal
End Function %>
Åter till databaskopplingen. Vi fortsätter med att exekvera vår SQL-sträng.
Set RS = Conn.Execute(SQL)
Sen följer samma tillvägagångssätt som för kategorierna. Vi kollar ifall det hittas några produkter. Ifall så inte är fallet skrivs det ut att “Inga produkter hittas”. I annat fall skrivs produkterna ut, nu sorterade efter produktnamn (strProdukt, se SQL-strängen ovan)
If RS.EOF Then
Response.Write “Inga produkter hittades”
Else
Do Until RS.EOF %>
<a href=”default.asp?produkt=<%=Server.HTMLEncode(RS(”ID”))%>”><%=Server.HTMLEncode(RS(”strProdukt”))%></a>, <%=Server.HTMLEncode(RS(”intPris”))%> kr<br>
<% RS.MoveNext
Loop
End if
Set RS = Nothing
Set Conn = Nothing %>
Varje produkt länkas nu till default.asp?produkt=[ID] och då vill vi självklart visa produktinformationen när man klickar på länken. Detta har gjort att vi vill visa olika information på samma yta (main-sektionen) och vi behöver således kolla med en IF-sats vilken sida det är som visar för stunden. Detta görs genom att lägga in en enklare IF-sats i main-sektionen.
<% If Request.QueryString(”kategori”) <> “” Then
kod för visning av kategori
ElseIf Request.QueryString(”produkt”) <> “” Then
kod för visning av produkt
Else
kod som visas när ingen kategori eller produkt är valdEnd if %>
Vi går igenom hur det funkar. Först kollas ifall Request.QueryString(”kategori”) har ett värde som är annat än “” (tom). Ifall det finns ett värde på kategori i länken (dvs. om vi har klickat på en kategorilänk) så skall koden nedanför skrivas ut. Det samma gäller för nästa steg, men här kollas ifall Request.QueryString(”produkt”) har ett värde som är annat än “” (tom). Slutligen, ifall båda dessa värden var tomma visas det som finns under Else, som är sista anhalten om inget annat villkor uppfyllts. Vad vi alltså gjort är att vi delat upp ett litet segment på sidan till att visa olika information beroende på vilken variabel i länken som har ett värde. Detta gör att det dynamiskt skapas nya sidor efter hur länkadressen ser ut, istället för att man manuellt ska sitta och skapa produkt1.html, produkt2.html och så vidare.
Denna IF-sats skall ligga precis under <div id=”main”> och bör sluta precis innan </div> för samma maindiv-tagg. Klistra sedan in den kod som vi skrivit hittills under rätt villkor för att rätt information skall visas på rätt ställe. Den kodsnutt med databashämtning för produkter under kategorisidan skall alltså ersätta “kod för visning av kategori”. Var noga med att <% och %> är rätt till antalet. <% signalerar början på ASP-kod och %> påvisar att ett block med ASP-kod avslutas. Man kan inte ha två öppna <%, utan måste alltid avsluta de öppna taggarna med %>. Låter det knepigt? Ladda hem filerna, så klarnar det säkert!
Vi går nu vidare och skapar produktinformationssidan som man kommer till när man har klickat på en produktlänk, ex. default.asp?produkt=1. Det är precis samma sätt som innan. Skapa en databaskoppling, fundera över vilken relation vi har mellan den siffra vi får med oss i länken och vad som finns angivet i databasen, skriv SQL-strängen, exekvera, kolla antal resultat och skriv ut resultat beroende på antal och stäng slutligen databasanslutningen. Så här:
<% Set Conn = Server.CreateObject(”ADODB.Connection”)
Conn.Open “Driver={MySQL ODBC 3.51 Driver};Server=” & strMySQLServer & “;port=” & strMySQLPort & “;Database=” & strMySQLDatabase & “;User=” & strMySQLUsername & “;Password=” & strMySQLPassword & “;”
SQL = “SELECT ID, intKategoriID, strProdukt, strProduktBeskrivning, intPris FROM butik_produkter WHERE ID = ” & strip(Request.QueryString(”produkt”))
Vi väljer att ta fram den information som finns i databasen om produkten som har det ID-nummer som återfinns i länken (default.asp?produkt=1). Eftersom ID var av typen auto_increment, automatiskt ökande värde för varje rad som läggs in, riskerar vi inte att få fler svar än en (1) rad från databasen. Eller noll (0) - ifall vi exempelvis manuellt skrivit in ID 1452 i länken och produkten inte existerar. Vi kommer således nu undan med mindre kod, eftersom det inte finns någon anledning att vilja loopa ut något. Antingen är det en rad eller så är det ingen, så att begära att gå till nästa rad och skriva ut denna är en situation som inte uppstår. Vi fortsätter hur som helst med att exekvera SQL-strängen och sen bör resten vara rätt självförklarande.
Set RS = Conn.Execute(SQL)
If RS.EOF Then
Response.Write “Produkten hittades inte”
Else %>
<h1><%=Server.HTMLEncode(RS(”strProdukt”))%></h1>
<p><%=Server.HTMLEncode(RS(”strProduktBeskrivning”))%></p>
<h2><%=Server.HTMLEncode(RS(”intPris”))%> kr</h2>
<a href=”default.asp?kop=<%=Server.HTMLEncode(RS(”ID”))%>”>Lägg i varukorgen</a>
<% End if
Set RS = Nothing
Set Conn = Nothing %>
Vi har nu skrivit ut produktnamn med <h1>-tagg, produktbeskrivning som textstycke, pris som <h2>-tagg och slutligen lagt in en länk som i framtiden är ämnad att lägga till varan i varukorgen. Och det är just precis vad som avhandlas i nästa steg av denna guide, så ladda hem filerna (1 kb) och dubbelkolla innan du skyndar dig vidare till nästa del.