24. juli 2003 - 21:13Der er
15 kommentarer og 2 løsninger
Paging i ASP - MySQL db
Hejsa
Jeg har et lille problem med at få paging til at virke i min kode. Jeg har brug for noget input. Her er koden der skal flyttes paging ind i: -------- <% ' Her henter vi alle indlæg
strQuery = "SELECT * FROM forum order by AutoNr DESC LIMIT 1000;" Set RS = adoDataConn.Execute(strQuery)
<html> <head> <title>Untitled Document</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <link href="../CSS/Standard.css" rel="stylesheet" type="text/css"> <% dim sideNummer sideNummer = request.QueryString("sidenummer") if sideNummer = "" then sideNummer = 1 end if
Set Conn = Server.CreateObject("ADODB.Connection") 'sConnection = "Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\inetpub\db\frederikshavn.mdb;" sConnection = "Driver={Microsoft Access Driver (*.mdb)};DBQ=d:\home\longshanksdk\db\frederikshavn.mdb;" Conn.Open(sConnection) strSQL = "Select * from personer order by ID DESC" Set rs = server.CreateObject("adodb.recordset") rs.pageSize = 10 rs.open strSQL, Conn, 1 rs.absolutePage = sideNummer
%> </head> <body onLoad="MM_preloadImages('../Billeder/include/skrivBeskedNed.gif')"> <div align="center"> <!--#include file="header.asp" --> <a href="skrivbog.asp" onMouseOver="MM_swapImage('Image1','','../Billeder/include/skrivBeskedNed.gif',1)" onMouseOut="MM_swapImgRestore()"><img src="../Billeder/include/skrivBeskedOp.gif" name="Image1" width="134" height="59" border="0" id="Image1"></a> <% response.write "<center>" for t = 1 to rs.PageCount if t = cint(sideNummer) then Response.Write " " else Response.write "<a href='laesbog.asp?sidenummer="&t&"'>"&t&"</a> " end if Next response.write "</center>"
Response.write "<br><br>"
dim count count = 0
while not rs.eof and count<10 Response.write "<table bgColor='#517654' width='450' align='center' class='tableborder'>" count = count+1 Response.Write "<tr><td align='center'><font size='2'><b><u>Skrevet d. " & rs("Dato") & " af " & rs("Fornavn") & " " & rs("Efternavn") & "<u><b></font></td></tr>" Response.write "<tr><td><font size='2'>" & rs("Besked") & "</font></td></tr>" rs.moveNext Response.Write "</table>" Response.write "<br>" wend
rs.close Conn.close Set rs = nothing Set Conn = nothing %> <!--#include file="footer.asp" --> </div> </body> </html>
jeg tror dit problem er at du vælger "LIMIT 1000" fjern den og køre en gang: strQuery = "SELECT * FROM forum order by AutoNr DESC;" Set RS = adoDataConn.Execute(strQuery)
->>longhanks Så får jeg denne fejl: ADODB.Recordset error '800a0e79' Operation is not allowed when the object is open.
/indlaeg_alle1.asp, line 220 ------- koden: ------- <% ' Her henter vi alle indlæg 'paging dim sideNummer sideNummer = request.QueryString("sidenummer") if sideNummer = "" then sideNummer = 1 end if 'Set Conn = Server.CreateObject("ADODB.Connection") 'sConnection = "Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\inetpub\db\frederikshavn.mdb;" 'sConnection = "Driver={Microsoft Access Driver(*.mdb)};DBQ=d:\home\longshanksdk\db\frederikshavn.mdb;" 'Conn.Open(sConnection) 'strSQL = "Select * from personer order by ID DESC" strQuery = "SELECT * FROM forum order by AutoNr DESC LIMIT 1000;" Set RS = adoDataConn.Execute(strQuery) 'Set rs = server.CreateObject("adodb.recordset") rs.pageSize = 10 rs.open strSQL, Conn, 1 <<<-----Line 220----->>> rs.absolutePage = sideNummer
'response.write "<center>" for t = 1 to rs.PageCount if t = cint(sideNummer) then Response.Write " " else Response.write "<a href='indlaeg_vis1.asp?sidenummer="&t&"'>"&t&"</a> " end if Next 'response.write "</center>" 'Response.write "<br><br>"
Skal måske lige nævne, at jeg har en database.inc, der ser sådan ud: <% strConnection = "driver={MySQL};server=minserver;uid=bruger;pwd=pword;database=min db" Set adoDataConn = Server.CreateObject("ADODB.Connection") adoDataConn.Open strConnection %>
Den måde som longshanks viser, er til en *.mdb (msAccess), MySQL driveren understøtter ikke "client side cursors". (Hurrah Micro$oft!) Men du kan kode dig ud af det.
"Client side cursors" kan bestemt også drille i ASP, meget ofte får man fejlen "ADODB.Recordset error '800a0cb3'. Current Recordset does not support bookmarks".
En workaround kan være at læse hele eller dele af database udtrækket ind i et array og udføre paging på arrayet i stedet. Jeg fandt engang et eksempel på ActiveDeveloper, men har desværre glemt ophavsmanden. Prøv at se, om du kan flette det ind med dit SQL kald.
/Cjep
<% Const cTopicPrPage = 15 'Antal Threats/Topics/Emner pr. side, når man lister i forum. Const cMaxIndex = 9 'Antal Sider i index. Dim ii, LavLimit, HojLimit, LavPunktum, HojPunktum
'Index over Paging START If intPageCount > cMaxIndex Then If intPage >= (cMaxIndex\2) Then HojLimit = intPage + (cMaxIndex\2) LavLimit = intPage - (cMaxIndex\2) End If If intPage < (cMaxIndex\2) Then HojLimit = intPage + (cMaxIndex\2) LavLimit = intPage - (cMaxIndex\2) End If If LavLimit < 1 Then LavLimit = 1 HojLimit = cMaxIndex + 1 HojPunktum = "... " End If If HojLimit > intPageCount Then HojLimit = intPageCount LavLimit = HojLimit - cMaxIndex LavPunktum = "... " End If Else LavLimit = 1 HojLimit = intPageCount End If Response.Write "<table>" Response.Write "<tr><td> Sider: (" & intPageCount & ") " Response.Write "<a href=""?side=1""><</a> " Response.Write LavPunktum For ii = (LavLimit) to HojLimit If cInt(intPage) = cInt(ii) Then Response.Write "<b>[" & ii & "]</b> " Else Response.Write "<a href=?side=" & ii & ">" & ii & "</a> " End If Next Response.Write HojPunktum Response.Write "<a href=""?side=" & intPageCount & """>></a>" Response.Write "</td></tr></table>" 'Index over Paging SLUT %>
hvis man skal lave paging vha en mysql database må man slet slet ikke bare tænke i access-retning - løsningen til access kan slet ikke bruges og desuden findes en meget lettere løsning i mysql.
I mysql kan løsning laves vha LIMIT - fx;
SELECT * FROM tabel LIMIT 0, 11 'loop igennem 10 gange 'lav frem og tilbage knapper
når man så skal til side 2 vil sql'en bare se sådan ud; SELECT * FROM tabel LIMIT 10, 11 'loop igennem 10 gange 'lav frem og tilbage knapper
grunden til at jeg udvælger 11 i stedet for de 10 der måske skal vises er, at jeg ellers risikerer på sidste side at få en fejl...
Tilpas til din egen side, du skal bare sætte knapperne frem og tilbage:
<% Response.Buffer = True Const RecsPage = 40 'Antal record pr side Dim CurPage 'Current Page Dim TotalPages 'Total Antal side Dim count Dim lrecs Dim CurrOffset Dim minFelt Dim RecLow Dim RecHigh Dim iTempPageCount,iTempRecCount
SQL = "Select * FROM minTabel WHERE minFelt LIKE '" & ("%") & minFelt1 & ("%") & "'"
'***********Tilfoej og brgraens cause og offset SQLrecs = "SELECT count(*) FROM minTabel" 'det er det samme tabel SET aRS = Conn.Execute (SQLrecs) lrecs = aRS("Count(*)") aRS.Close
iTempPageCount = lrecs MOD RecsPage iTempRecCount = RecsPage / 2
IF iTempCount = iTempRecCount THEN TotalPages = Round(lrecs/RecsPage) ELSEIF iTempCount < iTempRecCount THEN TotalPages = Round(lrecs/RecsPage) + 1 ELSE TotalPages = Round(lrecs/RecsPage) END IF IF isNumeric(CurPage) THEN CurPage = CLng(CurPage) CurrOffset = CINT(CurPage*RecsPage) - RecsPage END IF IF CurPage = "" OR CurPage = "0" THEN CurPage = 1 CurrOffset = 0 END IF
RecLow = CurrOffset IF CurPage = TotalPages THEN RecHigh = lrecs ELSE RecHigh = CurrOffset + RecsPage END IF IF RecLow = 0 THEN RecLow = 1 SQL = SQL & " LIMIT " & CurrOffset & ", " & RecsPage & ""
'*****Lav recordset og koer set RS = Conn.Execute(SQL)
->>hossein Den kan jeg ikke greje, men jeg har fundet et eksempel på activedeveloper.dk, som er rettet til. Det minder en del om dit eksempel, og om det Keysersoze prøvede at spore mig ind på tror jeg. Her er problemet bare, at koden kun henter 24 poster ud af min DB, og der ligger ca. 150, så hvis der er nogen der kan se fejlen.
--- <% ' Her henter vi alle indlæg 'paging
'Dim Conn 'Conn =
'Først skal vi have antallet af poster Set objRs = adoDataConn.Execute("SELECT AutoNr AS records FROM forum;") intRecords = int(objRs("records")) objRs.Close Set objRs = Nothing
'Variabler til query´et intPage = Request.QueryString("page") if intPage = "" OR not isNumeric(intPage) then intPage = int(1) else intPage = int(intPage) end if intPageSize = int(10) intStart = intPage*intPageSize intStart = intStart-intPageSize intPages = int(intRecords/intPageSize)+1
'ekstra indsat intValue = (intRecords - intStart) If intPageSize > intValue Then intPageSize = intValue end if 'ekstra indsat slut
Set objRs = adoDataConn.Execute("SELECT * FROM forum Order By AutoNr DESC _ LIMIT " & intStart & ", " & intPageSize & ";")
if objRs.EOF or objRs.BOF then Response.Write "Ingen poster" else 'Response.Write "<table border=""1"" cellpadding=""3"">" 'Response.Write "<tr>" 'Response.Write "<td><b>id</b></td>" 'Response.Write "<td><b>Site</b></td>" 'Response.Write "</tr>"
</TABLE> <% Response.Write "<HR>" Response.Write("<TABLE align='right'>") Response.Write("<tr>") Response.Write("<td>") 'Udskriver en "sideliste" For i = 1 to intPages if i = intPage then Response.Write "<b>" & i & "</b> " 'Response.Write("</td>") 'Response.Write("</tr>") 'Response.Write("</table>") else Response.Write "<a href=""indlaeg_alle1.asp?page=" & i & """>" 'Response.Write "<a href=""paging.asp?page=" & i & """>" Response.Write i Response.Write "</a> " 'Response.Write("</td>") 'Response.Write("</tr>") 'Response.Write("</table>") End if next Response.Write("</td>") Response.Write("</tr>") Response.Write("</table>")
Glimrende for dig.. - Når man nu finder en løsning på et problem, som man selv stod og havde og oprettede et indlæg, kunne det så ikke være sejt at poste løsningen ? :D
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.