webForumDet fria alternativet

Paging script för MySQL

5 svar · 435 visningar · startad av Brainbug

BrainbugMedlem sedan sep. 200129 inlägg
#1

En bra funktion i MySql är funktionen "LIMIT".
Här är ett bra exempel på hur det kan utnyttjas och på köpet får man också en rejäl prestanda vinst iom att man slipper hämta alla posterna från tabellen på varje sida.. = mindre belastning på databasen.

Detta script innehåller en del luckor, tex så kan någon ange ett felaktigt sidnummer i url:n vilket resulterar i ett sql-fel men detta löser ni säkert själva.

Kom gärna med förslag på förbättringar.

<%
'Variabler
Dim objCon, sSql, Rs, iRecords, iPageSize, iPages, iPage, iStart, myArray, i

'Öppna databasen
Set objCon = Server.CreateObject("ADODB.Connection")
objCon.Open "DRIVER=MySQL;server=localhost;uid=;pwd=;database="

'Räkna antalet poster
sSql = "SELECT COUNT(*) AS recordCount "
sSql = sSql & "FROM tabell "

Set Rs = objCon.Execute(sSql)
iRecords = Rs("recordCount")

Rs.Close
Set Rs = Nothing

'Antal poster/sida
iPageSize = 20

'Hur många sidor totalt
iPages = int(iRecords / iPageSize) +1

'Kontrollera vilken sida vi är på
iPage = Request.QueryString("pg")
If iPage = "" Or Not isNumeric(iPage) Then
	 iPage = 1
Else
	 iPage = int(iPage)
End If

'Offset, ex: iStart = 20 = hämta data från 
'tabellrad 20 och 20* rader neråt (*iPageSize)
iStart = iPage * iPageSize
iStart = iStart - iPageSize

'SQL-frågan
'OBS! Om du vill använda tex en "WHERE"-sats, så
'glöm inte att lägga till "WHERE"-satsen i den övre frågan!
sSql = "SELECT fält1, fält2, fält3 "
sSql = sSql & "FROM tabell "
sSql = sSql & "LIMIT " & iStart & " ," & iPageSize & " "

Set Rs = objCon.Execute(sSql)

'Överför resultatet till en array
myArray = Rs.GetRows()

Rs.Close
Set Rs = Nothing

'Stäng databasen
objCon.Close
Set Objcon = Nothing

'Skriv ut data't
For i = 0 To UBound(myArray,2)
	Response.Write(0,i & "<BR>")
	Response.Write(1,i & "<BR>")
	Response.Write(2,i & "<BR>")
Next

'Skriv ut sid-länkar
If iPages > 1 Then
	Response.Write("<HR>")
	Response.Write("<B>Sidor: </B>")
	If iPage > 1 Then Response.Write("<A href=""?pg=" & iPage - 1 & """>Föregående</A>&nbsp;")
	For i = 1 To iPages
		 If i = iPage Then
			  Response.Write("<B>" & i & "</B> ")
		 Else
			  Response.Write("<A href=""?pg=" & i & """>")
			  Response.Write(i)
			  Response.Write("</A> ")
		 End If
	next
	If iPage < iPages Then Response.Write("<A href=""?pg=" & iPage + 1 & """>Nästa</A>")
End If
%>
CmartMedlem sedan feb. 200269 inlägg
#2

jag får det inte at funka får 500 error. Måste det vara 3 fält i databsen eller kan man ha flera och bara välja ut 3?

@ndersMedlem sedan juni 200032 969 inlägg
#3

Till att börja med: stäng av friendly error messages / egna http-felmeddelanden i IE, så får vi hoppas att du får ett bättre felmeddelande.

mvh

CmartMedlem sedan feb. 200269 inlägg
#4

Microsoft VBScript compilation

Cannot use parentheses when calling a Sub

Line: 62

Det är raden där det står:

Response.Write(0,i & "<BR>")

@ndersMedlem sedan juni 200032 969 inlägg
#5

På de raderna ska det nog stå så här:

For i = 0 To UBound(myArray,2)
	Response.Write([b]myArray(0,i)[/b] & "<BR>")
	Response.Write([b]myArray(1,i)[/b] & "<BR>")
	Response.Write([b]myArray(2,i)[/b] & "<BR>")
Next

mvh,

CmartMedlem sedan feb. 200269 inlägg
#6

OK. nu får jag:

Microsoft VBScript runtime

An exception occurred: 'Execute'

Line: 47

Det är:

Set Rs = objCon.Execute(sSql)

Dessutom dör hela webservern och jag måste starta om den:

A trappable error (C0000005) occurred in an external object. The script cannot continue running.

130 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)