Lär dig skriva betygsystem i ASP
Förord
När jag skrev den första kursen för ASP, så designade jag även en betygsättningsfunktion till detta. Jag tänkte i utbildningssyfte berätta hur jag gjorde för att göra detta ASP-script. Programmet som dels lagrade betygsättningen, samt den text som angivits av besökaren. Eftersom jag egentligen bara ville veta om det var dåligt- (tyckte jag det vore bäst om svaret även mailades till mig, som ett komplement). Det som kom in skulle ju förhoppningsvis vara påståenden som jag skulle försöka rätta till, och det så fort som möjligt.Sagt och gjort. Jag började med att snickra ihop en tabell som låg i min databas. Denna tabellen skulle innehålla värden som summerades för antalet betyg på Mycket Bra, Bra samt dålig. Egentligen behövdes endast även ett fält för att veta vilken kurs som denna sammanställningen gällde för. Jag bestämde mig för att numrera alla kurserna och de fick helt enkelt heta nummer 1 till 999.... Tabellen har designats med följande innehåll.
Namn Fält Förklaring
KursNr Long Nummer på den kurs som betyget gäller för.
Betyg Long Här lagras 1,2,3 osv för betygsgraden där 1 är mycket bra.
Message Memo Här lagras de texterna som angivits om användaren ansett att kursen var dålig, felaktig eller något annat. Memofilen skapas endast på det/de poster som något anges, vilket gör att tabellen blir mindre eftersom inte alla kommer att svara. Hade det varit ett textfält med exempelvis bredden 40, hade varje record fått ett fält med 40 tecken trots att den var blank.
Med SQL kommandot create table kurs (kursNr long, betyg long, message memo) skapade jag denna tabellen som nu skall användas till kursen. Observera att jag använder inga index, för det antalet poster som kommer att lagras är så få och att sätta ett index kommer bara ta kraft och storlek på databasen.
Informationen som skall sändas defineras upp i ett s.k. formulär. Där kan du ha knappar, listboxar, textboxar mm. I din html-kod måste du bestämma en layout som du skall använda för att få reda på det du vill. Exemplet som jag använder är för detta exempel den layouten som ni ser i den högra kolumnen.
Du ser först att om du klickar på knappen Sänd- kommer programmet att starta _betyg.asp. I denna formen finns även 3 knappar samt ett eventuellt meddelande. värdet 'value' är satt till 1, 2 resp. 3 för knapparna med namnen choice1, choice2 och choice3. Det finns även en textbox med namnet message. Avslutningsvis ligger även en gömd variabel som kallas class_id och det är den som säger vilket nummer det är på den aktuella kursen. Eftersom användaren inte anger detta själv- kallas den gömd. Du ser även namnet "hidden" på dess .
När .asp-scriptet startas kan du hämta de värden som finns i ditt formulär genom att ställa frågan Request.Form("kontroll_namn"). Då returneras det värdet som du angav i din form. Detta är s.k. gömda fält och alternativet hade varit att kalla .asp-scriptet med dessa värden i action-kommandot.
Det första jag började med var att göra i ordning själva formuläret. Du ser det i den högra spalten och där har jag satt tre alternativknappar. Dessa heter Choice1, Choice2 och Choice3. Jag har även en rullningsbar textruta som jag kallar message, och slutligen en knapp som sänder meddelande till asp-scriptet. I egenskapen för formuläret så ställer jag in vilket program som skall anropas.
Det finns tillfällen då man inte vill spara informationen i en Access, SQL eller Oracle databas. Då kan man även använda sig av FileSystemObject (FSO). Genom att ansluta denna komponent i IIS kan man arbeta med filer som placeras på webbservern såsom det vore din egen hårddisk. För att initialisera denna kontrollen skriver du följande:
Detta exempel börjar med precis samma sak som tidigare exempel. Informationen hämtas ut från föregående form. En kontroll att användaren inte tryckte på SÄND flera gånger görs mha. cookies. Startar objektet FSO och skriver en textmassa som adderas till föregående text. Om filen inte fanns förrut- skapas denna fil och informationen adderas.
Genom att skriva ett program som listar alla dessa meddelanden, kan du enkelt ta reda på vad det står i din fil- utan att behöva hämta hem den från din webbserver.
Som du ser så är det inte speciellt stor skillnad på detta programmet. Det är egentligen bara SQL-satsen som är utbytt och cookie-hanteringen som är borttagen. Egentligen så finns dessa programsnuttar i samma script - men eftersom det är mer lättläst på detta sättet så har jag valt att presentera det så.
Nu skall vi även ta en titt på hur man läser en textfil också för att få samma resultat.
Du ser även att vi frågar om en inputparameter här: class_id = request.querystring("kurs"). Detta är för att få reda på vilket kursnummer som vi skall lista ut. För att kunna starta detta programmet och exempelvis lista innehållet för de resultat som angivits i kurs nummer 2 måste du starta programmet genom att exempelvis skriva så här i din browser: http://minwebbplats/_betyg_reader.asp?kurs=2
Förhoppningsvis har ni lärt er lite intressanta saker om FSO, cookies och databas hantering som kan vara bra att ha tillhands när ni arbetar med ASP-script
Tabellstruktur
Namn Fält Förklaring KursNr Long Nummer på den kurs som betyget gäller för.
Betyg Long Här lagras 1,2,3 osv för betygsgraden där 1 är mycket bra.
Message Memo Här lagras de texterna som angivits om användaren ansett att kursen var dålig, felaktig eller något annat. Memofilen skapas endast på det/de poster som något anges, vilket gör att tabellen blir mindre eftersom inte alla kommer att svara. Hade det varit ett textfält med exempelvis bredden 40, hade varje record fått ett fält med 40 tecken trots att den var blank.
Med SQL kommandot create table kurs (kursNr long, betyg long, message memo) skapade jag denna tabellen som nu skall användas till kursen. Observera att jag använder inga index, för det antalet poster som kommer att lagras är så få och att sätta ett index kommer bara ta kraft och storlek på databasen.
HTML formuläret
Informationen som skall sändas defineras upp i ett s.k. formulär. Där kan du ha knappar, listboxar, textboxar mm. I din html-kod måste du bestämma en layout som du skall använda för att få reda på det du vill. Exemplet som jag använder är för detta exempel den layouten som ni ser i den högra kolumnen.
Du ser först att om du klickar på knappen Sänd- kommer programmet att starta _betyg.asp. I denna formen finns även 3 knappar samt ett eventuellt meddelande. värdet 'value' är satt till 1, 2 resp. 3 för knapparna med namnen choice1, choice2 och choice3. Det finns även en textbox med namnet message. Avslutningsvis ligger även en gömd variabel som kallas class_id och det är den som säger vilket nummer det är på den aktuella kursen. Eftersom användaren inte anger detta själv- kallas den gömd. Du ser även namnet "hidden" på dess .
När .asp-scriptet startas kan du hämta de värden som finns i ditt formulär genom att ställa frågan Request.Form("kontroll_namn"). Då returneras det värdet som du angav i din form. Detta är s.k. gömda fält och alternativet hade varit att kalla .asp-scriptet med dessa värden i action-kommandot.
Sända resultatet
Det första jag började med var att göra i ordning själva formuläret. Du ser det i den högra spalten och där har jag satt tre alternativknappar. Dessa heter Choice1, Choice2 och Choice3. Jag har även en rullningsbar textruta som jag kallar message, och slutligen en knapp som sänder meddelande till asp-scriptet. I egenskapen för formuläret så ställer jag in vilket program som skall anropas.
<%
' -----------------------------------------------------------
' program : _betyg.asp
' kallas från : alla ASP kurser
' syfte : betygsättning av kurser
' copyright : (c) 1999, Pelle Johansson, www.pellesoft.se
' -----------------------------------------------------------
Const adCmdText = 1
Response.Buffer = True
' hämtar ut informationen...
class_id = Request.Form("class_id")
choice_1 = Request.Form("choice1")
choice_2 = Request.Form("choice2")
choice_3 = Request.Form("choice3")
comments = Request.Form("message")
choice = (choice_1 + choice_2 + choice_3)
' bygger en variabel som är [kurs + nummer] för att
' användas till vår temporära cookies.
CookieName = "kurs" & class_id
' har användaren röstat tidigare, i så fall återgår
' vi direkt till det dokument som kördes sist.
If Request.Cookies(CookieName) <> "" Then
FromDocument= Request.ServerVariables("HTTP_REFERER")
Response.Redirect FromDocument
Response.End
End If
' initierar ADO kontrollen
Set con = server.createobject("ADODB.Connection")
Set rst = server.createobject("ADODB.Recordset")
' Öppnar en anslutning till databasen som är satt i DSN
con.Open "system"
' förbereder SQLsats att göra en insert
' i tabellen kurs med följande värden.
sqlmsg = "INSERT INTO kurs "
sqlmsg = sqlmsg & "( kursnr, betyg, message) "
sqlmsg = sqlmsg & "VALUES "
sqlmsg = sqlmsg & "( " & CLng(class_id) & ", "
sqlmsg = sqlmsg & " " & CLng(choice) & ", "
sqlmsg = sqlmsg & " '" & comments & "') "
' kör SQL scriptet
Rst.Open sqlmsg, con , , , adCmdText
' stänger och tar bort recordset och connection
' från serverns arbetsminne
con.close
set rst=NOTHING
set con=NOTHING
' sätter en cookies på användaren så han inte
' trycker igen. Obs! Inget datum sätts, vilket
' medför att denna cookies dör när användaren
' stänger sin webbrowser/session
Response.Cookies(CookieName) = "Yes"
' återgår till det dokument som kördes sist.
FromDocument= Request.ServerVariables("HTTP_REFERER")
Response.Redirect FromDocument
%>
Alternativt kan man spara resultatet i en textfil
Det finns tillfällen då man inte vill spara informationen i en Access, SQL eller Oracle databas. Då kan man även använda sig av FileSystemObject (FSO). Genom att ansluta denna komponent i IIS kan man arbeta med filer som placeras på webbservern såsom det vore din egen hårddisk. För att initialisera denna kontrollen skriver du följande:
<%
' -----------------------------------------------------------
' program : _betyg.asp
' kallas från : alla ASP kurser
' syfte : betygsättning av kurser
' copyright : (c) 1999, Pelle Johansson, www.pellesoft.se
' -----------------------------------------------------------
Response.Buffer = True
' hämtar ut informationen...
class_id = Request.Form("class_id")
choice_1 = Request.Form("choice1")
choice_2 = Request.Form("choice2")
choice_3 = Request.Form("choice3")
comments = Request.Form("message")
choice = (choice_1 + choice_2 + choice_3)
' bygger en variabel som är [kurs + nummer] för att
' användas till vår temporära cookies.
CookieName = "kurs" & class_id
' har användaren röstat tidigare, i så fall återgår
' vi direkt till det dokument som kördes sist.
If Request.Cookies(CookieName) <> "" Then
FromDocument= Request.ServerVariables("HTTP_REFERER")
Response.Redirect FromDocument
Response.End
End If
' konstanter
Const ForReading = 1
Const ForAppend = 8
Const TristateUseDefault = -1
Const TristateTrue = -1
Const TristateFalse = 0
' sökvägen till filen
CurrentFile = Server.MapPath("betyg.dat")
' Skapar objektet och öppnar filen. Därefter
' skriver vi ner resultatet i filen
Dim Fso, fHandle
Set Fso = CreateObject("Scripting.FileSystemObject")
Set fHandle = Fso.OpenTextFile(CurrentFile,ForAppend,True,TristateFalse)
fHandle.write "KURSNR: " & class_id & chr(13) & chr(10)
fHandle.write "BETYG: " & choice & chr(13) & chr(10)
fHandle.write "MESSAGE: " & comments & chr(13) & chr(10)
fHandle.Close
' frigör objektet från minnet
set fHandle = nothing
set Fso = nothing
' sätter en cookies på användaren så han inte
' trycker igen. Obs! Inget datum sätts, vilket
' medför att denna cookies dör när användaren
' stänger sin webbrowser/session
Response.Cookies(CookieName) = "Yes"
' återgår till det dokument som kördes sist.
FromDocument= Request.ServerVariables("HTTP_REFERER")
Response.Redirect FromDocument
%>
Detta exempel börjar med precis samma sak som tidigare exempel. Informationen hämtas ut från föregående form. En kontroll att användaren inte tryckte på SÄND flera gånger görs mha. cookies. Startar objektet FSO och skriver en textmassa som adderas till föregående text. Om filen inte fanns förrut- skapas denna fil och informationen adderas.
Hur skall man läsa av resultatet?
Genom att skriva ett program som listar alla dessa meddelanden, kan du enkelt ta reda på vad det står i din fil- utan att behöva hämta hem den från din webbserver.
<%
' program : _betyg_reader.asp
' kallas från : manuellt
' syfte : listar betygsättning av kurser
Const adCmdText = 1
Response.Buffer = True
' tar reda på vilken kurs vi vill se
' information om.
class_id = request.querystring("kurs")
If class_id = "" then
response.write "Du måste ange ett kursnummer."
response.end
End If
' initierar ADO kontrollen
Set con = server.createobject("ADODB.Connection")
Set rst = server.createobject("ADODB.Recordset")
' Öppnar en anslutning till databasen som är satt i DSN
con.Open "system"
' förbereder SQLsats att göra en insert
' i tabellen kurs med följande värden.
sqlmsg = "SELECT * FROM kurs "
sqlmsg = sqlmsg & "WHERE kursnr = " & class_id
' kör SQL scriptet
Rst.Open sqlmsg, con , , , adCmdText
Response.Write "Kursresultat för kurs nummer: " & class_id & "
"
Do While NOT Rst.EOF
Response.Write "betyg : " & Rst(1) & " Kommentar : " & Rst(2) & "
"
Rst.MoveNext
Loop
' stänger och tar bort recordset och connection
' från serverns arbetsminne
con.close
set rst=NOTHING
set con=NOTHING
%>
Som du ser så är det inte speciellt stor skillnad på detta programmet. Det är egentligen bara SQL-satsen som är utbytt och cookie-hanteringen som är borttagen. Egentligen så finns dessa programsnuttar i samma script - men eftersom det är mer lättläst på detta sättet så har jag valt att presentera det så.
Avläsning av resultatet i textfilen.
Nu skall vi även ta en titt på hur man läser en textfil också för att få samma resultat.
<%
' program : _betyg_reader.asp
' kallas från : manuellt
' syfte : listar betygsättning av kurser
Response.Buffer = True
' tar reda på vilken kurs vi vill se
' information om.
class_id = request.querystring("kurs")
If class_id = "" then
response.write "Du måste ange ett kursnummer."
response.end
End If
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8
Dim Fso, fHandle, Ts
set fso = server.CreateObject("Scripting.FileSystemObject")
' sökvägen till filen
CurrentFile = Server.MapPath("betyg.dat")
' öppnar filen
Set fhandle = Fso.GetFile(CurrentFile)
' filen skall nu öppnas som en "stream".
set ts = fhandle.OpenAsTextStream(ForReading, -2)
' i denna loop försäkrar vi oss att det är rätt rad för kursen,
' och plockar ut informationen. Varje post är 3 rader, därför
' måste vi även läsa detta 3 gånger som du ser nedan.
Response.Write "Kursresultat för kurs nummer: " & class_id & "
"
Do While not ts.AtEndOfStream
textBuffer = ts.ReadLine
if instr(txtBuffer,"KURSNR") then
if mid(txtBuffer,9,3) = class_id Then ' rätt kursnr
textBuffer = ts.ReadLine ' läs nästa rad
betyg = mid(txtBuffer,7,3)
textBuffer = ts.ReadLine ' läs nästa rad
comment = mid(txtBuffer,9)
Response.Write "betyg : " & betyg & " Kommentar : " & comment & "
"
end if
Loop
ts.Close
set ts=nothing
set fhandle = nothing
set fso = nothing
%>
Du ser även att vi frågar om en inputparameter här: class_id = request.querystring("kurs"). Detta är för att få reda på vilket kursnummer som vi skall lista ut. För att kunna starta detta programmet och exempelvis lista innehållet för de resultat som angivits i kurs nummer 2 måste du starta programmet genom att exempelvis skriva så här i din browser: http://minwebbplats/_betyg_reader.asp?kurs=2
Förhoppningsvis har ni lärt er lite intressanta saker om FSO, cookies och databas hantering som kan vara bra att ha tillhands när ni arbetar med ASP-script
0 Kommentarer