Slumpa poster ur en databas
Introduktion
Ibland vill man kanske slumpa fram en post bland flera ur en databas och exempelvis presentera den på sin startsida eller liknande. Man kanske vill slumpa fram ett citat ur en citatdatabas, ett användarnamn från en medlemsdatabas etc. Då ställs man inför det faktumet att man inte kan slumpa fram någon post för man har ingen som helst aning om hur man gör det. I denna lektion går jag igenom hur man slumpar fram en specifik post ur en databas, dels med GetRows(), dels på "vanligt" vis.
Slumpa med GetRows()
Jag har i två tidigare lektioner förklarat en del om GetRows() och hur man använder metoden. Om du inte läst någon av lektionerna rekommenderar jag att du gör det. I alla fall - hur slumpar man fram en post ur en databas med hjälp av GetRows()? Jo, det är faktiskt ganska enkelt. Man använder GetRows() tillsammans med Randomize och funktionen Rnd(). Jag visar koden:
<%
Dim Cn, Rs, recArr, Rand_nr, Id, Namn, Land
Set Cn = Server.CreateObject("ADODB.Connection")
Cn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("db_random.mdb")
Set Rs = Cn.Execute("Select Id, Namn, Land From tbl_random")
If Rs.EOF Then
Response.Write "Inga poster i databasen än.."
Rs.Close : Set Rs = Nothing
Cn.Close : Set Cn = Nothing
Else
recArr = Rs.GetRows()
Rs.Close : Set Rs = Nothing
Cn.Close : Set Cn = Nothing
Randomize
Number = Round(Rnd*UBound(recArr,2))
Id = recArr(0,Number)
Namn = recArr(1,Number)
Land = recArr(2,Number)
Response.Write Id & ". " & Namn & ", " & Land
End If %>
Vi har först och främst en databas med namnet db_random och tabellen tbl_random. I databasen har vi tre fält - Id, Namn och Land. Vi vill sedan slumpa fram ett tal som står för ett id-nummer som finns i databasen och sedan skriva ut all info ur databasen för just den post med det id-numret som slumpades.
Som vanligt ansluter vi först till databasen och exekverar sedan en SQL-sats. Om det inte fanns någon post i databasen så får man ett meddelande "Inga poster i databasen än..", och stänger öppna objekt. Om det fanns poster i databasen använder vi nu variabeln recArr med metoden GetRows() för att ta reda på hur många poster det finns i databasen.
Sedan använder vi Randomize, som på svenska betyder slumpa, och slumpar fram ett nummer mellan 0 och det högsta id-numret i databasen-1. Vi använder oss av funktionen Rnd() för att avrunda det slumpade talet till närmsta heltal då det ju inte finns något id-nummer i databasen som heter 1,374 eller dylikt.
I och med att vi använder arrayer så räknas 0 som en post och man startar med elementet 0, alltså inte med 1. Så om talet 0 slumpas ut visas post 1 ur databasen, talet 4 ger post 5 ur databasen etc. Mer om arrayer kan du läsa här: arrayer.
Sedan låter vi variablerna Id, Namn och Land få värdena för posten med id-numret som slumpades ut. Beroende på om man enbart vill ha enstaka poster ur databasen och inte alla får man anpassa SQL-satsen efter det samt ta bort/lägga till fler variabler och öka elementen, recArr(2,Number, med +1 för varje nytt fält man vill ha fram ur sin databas. Slutligen skriver vi ut respektive fält som vi vill ha utskrivna på sidan..
Slumpa vanligt
Koden nedan visar hur man slumpar fram poster på "vanligt" vis - utan GetRows(). Prestandaskillnaden är minimal mellan GetRows() och denna metod utan GetRows() men om du har en massa fält i databasen som du vill ska slumpas ut, kanske över 10-15 fält så används GetRows() med mer nytta.
Här kommer koden för vanlig slumpning utan GetRows():
<% Dim Cn, Rs, Antal, Rand_nr
Set Cn = Server.CreateObject("ADODB.Connection")
Cn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("db_random.mdb")
Set Rs = Cn.Execute("Select Id, Namn, Land From tbl_random")
If Rs.EOF Then
Response.Write "Inga poster att slumpa än.."
Rs.Close : Set Rs = Nothing
Cn.Close : Set Cn = Nothing
Else
With Rs
.Close
.Cursortype=3
.Open
End With
Antal = Rs.RecordCount
Randomize
Rand_nr = Int(Rnd * Antal)
Rs.Move Rand_nr
Response.Write Rs("Id") & ". " & Rs("Namn") & ", " & Rs("Land")
Rs.Close : Set Rs = Nothing
Cn.Close : Set Cn = Nothing
End If %>
Vad händer här då? Jo, vi använder oss av en speciell konstant som kallas adOpenStatic (3) för att vi över huvud taget ska kunna slumpa fram en post. adOpenStatic tillåter att man hoppar fram och tillbaka mellan posterna i databasen vilket vi ju kommer göra.
Vidare har vi variabeln Antal som får samma värde som det finns antalet poster i databasen (Rs.RecordCount).
Sedan använder vi återigen Randomize och låter variabeln Rand_nr få ett värde mellan 0 och Antal. Sedan flyttar vi med Rs.Move till den aktuella posten och skriver ut dess värden. Slutligen stänger vi ner objekten..