webForumDet fria alternativet

problem med pageing system

39 svar · 1 555 visningar · startad av Vinnaren

VinnarenMedlem sedan sep. 2005833 inlägg
#1

Hej

Jag har ett pageing system som fungerar i Access, men nu när jag ska gå över till MySQL funkar den inte.
Har koden:

intPageSize = 50 
intPage = Request.QueryString("page")
If intPage = "" Then intPage = 1

strSQL ="SELECT spelare.playID, spelare.lagID, spelare.landID AS spelare_landID, spelare.playFnamn, spelare.playEnamn, spelare.playFodd, spelare.playFodelseort, spelare.playPosition, spelare.playSkott, spelare.playAktiv, land.landID AS land_landID, land.land, land.flagga, klubbar.lagNamn FROM ((land INNER JOIN spelare ON land.landID = spelare.landID)LEFT JOIN klubbar ON spelare.lagID = klubbar.lagID) WHERE playAktiv = 1 ORDER BY "&order_spelare&""

Set objRS = Server.CreateObject("ADODB.Recordset")
With objRS
	.ActiveConnection = objConn
	.Source = strSQL
	.PageSize = intPageSize
	.CursorType = 3
	.LockType = 1
	.Open
End With

 '## -- visa rätt sida i recordsetet --
objRS.AbsolutePage = intPage
            
'## -- hur många sidor består recordsetet av --
intTotalPages = objRS.PageCount
            
'## -- loopa igenom recordsetet och visa posterna för besökaren/användaren --
Do Until objRS.EOF OR intCounter >= intPageSize
intCounter = intCounter + 1

Call PageNavigationPlayers(intPage, intTotalPages)
Sub PageNavigationPlayers(ByVal Page, TotalPages)
    Dim strScriptName

    '## -- denna sidas namn --
    	strScriptName = "index.asp?do=players"
	
	
	
    '## -- länk till föregående sida --
    '## -- kontrollera att det inte är första sidan som visas --
    If CInt(Page) > 1 Then
         '## -- inte första sidan som visas så gör en länk --
        Response.Write "<a href=""" & strScriptName & "&amp;page=" & Page - 1 & """>&lt;&lt; Föregående</a> "
    End If

    '## -- bygg upp själva pagebaren, dvs varje sidnummer ska ha en länk
    '## -- så att besökaren snabbt kan ta sig till rätt sida --
    For N = 1 To CInt(TotalPages)
        If N <> CInt(Page) Then
            '## -- ej aktuell sida, länka --
            Response.Write "<a href=""" & strScriptName &"&amp;page=" & N & """>" & N & "</a> "
        Else
            '## -- aktuell sida, länka ej -- 
            Response.Write "<b>" & N & "</b> "
        End If
    Next

    '## -- länk till nästa sida. om vi står på sista sidan ska den ej vara länkad --
    If CInt(Page) < CInt(TotalPages) Then
        '## -- vi är inte på sista sidan --
        Response.Write "<a href="""&strScriptName&"&amp;page=" & Page + 1 & """>Nästa >></a>"
    End If

End Sub

Hur får jag igång den även i MySQL??

Tacksam för all hjälp :stud

voigtann1Medlem sedan juni 20019 519 inlägg
#2

Som jag ser det är det egentligen bara en sql fråga

SELECT
	spelare.playID,
	spelare.lagID,
	spelare.landID AS spelare_landID,
	spelare.playFnamn,
	spelare.playEnamn,
	spelare.playFodd,
	spelare.playFodelseort,
	spelare.playPosition,
	spelare.playSkott,
	spelare.playAktiv,
	land.landID AS land_landID,
	land.land,
	land.flagga,
	klubbar.lagNamn
FROM
	land
	INNER JOIN spelare on land.LandId = spelare.landId
	LEFT JOIN Klubbar ON spelare.lagId = klubbar.LagId
WHERE
	playAktiv = 1 Order By " & order_Spelare

har inte direkt gjort några större ändringar (tagit bort () + rensat lite & "" i slutet ).

VinnarenMedlem sedan sep. 2005833 inlägg
#3

tack, men tyvärr så hjälpte det inte. Sidnavigeringen vill inte komma fram, när jag hade Access så syntes den längst ner, men nu e den borta. De 50 första posterna kommer fram, men inte navigeringen

Vad kan det vara för fel? :r

VinnarenMedlem sedan sep. 2005833 inlägg
#4

ingen som vet vad det kan vara för fel? Funkar ju med Access :q :OO

voigtann1Medlem sedan juni 20019 519 inlägg
#5

får du ut något ifrån ditt Recordset alls?

VinnarenMedlem sedan sep. 2005833 inlägg
#6

jag får ju ut de 50 första posterna. Men sidnavigeringen är som bortblåst :(

voigtann1Medlem sedan juni 20019 519 inlägg
#7

vad är intPage och intTotalPages för värde?

VinnarenMedlem sedan sep. 2005833 inlägg
#8

intPage har 1
intTotalPages har -1

i access har intTotalPages 15

SaschMedlem sedan nov. 2002830 inlägg
#9

Kan man inte helt enkelt göra en Count(ID) och göra en snabb beräkning på det där?

VinnarenMedlem sedan sep. 2005833 inlägg
#10

vet inte redigt hur/vart man skulle ha den räkningen.

Har tagit reda på att det är på:

'## -- hur många sidor består recordsetet av --
intTotalPages = objRS.PageCount

som intTotalPages får värdet -1

skriver jag manuellt dit intTotalPages = 15 så kommer sidnavigeringen fram, men när man navigerar så är det samma poster som kommer fram.

VinnarenMedlem sedan sep. 2005833 inlägg
#11

försöker mig på att skriva om uträkningen. har följande:

posterPerSida = 50
			
		
Set objRS = objConn.Execute("SELECT COUNT(*) as AntalPoster FROM spelare WHERE playAktiv = 1")
		
antalPoster = objRS("antalPoster")
		
objRS.Close
set objRS = nothing
			
aktuellSida = CLng(Request.QueryString("sida"))
		
min = 0
max = posterPerSida	
				
if aktuellSida = "" or aktuellSida = 0 then
	aktuellSida = 1	
end if
					
if aktuellSida = 1 then
	min = 0
	max = posterPerSida	
else
	min = posterPerSida * aktuellSida
	max = min + posterPerSida
end if
			
antalSidor = (antalPoster -(antalPoster mod posterPerSida))/posterPerSida
				
				
				
		
Set objRS = objConn.Execute("SELECT spelare.playID, spelare.lagID, spelare.landID AS spelare_landID, spelare.playFnamn, spelare.playEnamn, spelare.playFodd, spelare.playFodelseort, spelare.playPosition, spelare.playSkott, spelare.playAktiv, 
land.landID AS land_landID, land.land, land.flagga, klubbar.lagNamn FROM land INNER JOIN spelare ON land.landID = spelare.landID LEFT JOIN klubbar ON spelare.lagID = klubbar.lagID 

WHERE playAktiv = 1 ORDER BY "&order_spelare&" LIMIT "& min & "," & max&"")

Problemen är följande:
antalSidor blir tom, den innehåller inte uträkningen.
när man kommer in på sidan börjar den på A. men när man har gått fram och sedan ska gå tillbaka till första sidan så hamnar man på B, sida i QueryString måste alltså vara 0 för att komma tillbaka på A.

Hur löser jag detta?

SaschMedlem sedan nov. 2002830 inlägg
#12

Vad skulle kunna göra (eftersom det låter som att du inte längre använder Access) använda Offset för att ta reda på var du är. Samt göra en Count(ID) vid varje, bökigt jovisst.

MySQL använder offset för att starta från valt nummer (Räknar till vad man satt offset till och sedan spottar ut posterna).

'## 
TotaltAntalPoster = 365 '# Räkna, men i detta fallet ett dummytal

PosterPerSida = 15

AktuellPlats = cInt(Request.QueryString("offset"))
AktuellSida = Round(AktuellPlats/PosterPerSida)

'Response.Write (AktuellPlats &"<br />")
'Response.Write (AktuellSida &"<br />")

TotaltAntalSidor = Round(TotaltAntalPoster/PosterPerSida)

 min = AktuellPlats
 max = aktuellplats + PosterPerSida

'Set objRS = objConn.Execute("SELECT spelare.playID, spelare.lagID, spelare.landID AS spelare_landID, spelare.playFnamn, spelare.playEnamn, spelare.playFodd, spelare.playFodelseort, spelare.playPosition, spelare.playSkott, spelare.playAktiv, 
'land.landID AS land_landID, land.land, land.flagga, klubbar.lagNamn FROM land INNER JOIN spelare ON land.landID = spelare.landID LEFT JOIN klubbar ON spelare.lagID = klubbar.lagID 

'WHERE playAktiv = 1 ORDER BY "&order_spelare&" LIMIT "& min & "," & max &"")

 ' # Loopa ut alla poster här enligt principen nedan.
 For J = min To max - 1
   IF J <= TotaltAntalPoster Then
      Response.Write ( J &"<br />"& vbCrlf)
   End IF
 Next

' # Visar textfunktionaliteten
IF AktuellSida > 1 Then
     Response.Write ("<a href='visaposter.asp?offset="& AktuellPlats - PosterPerSida &"'>Tidigare</a>")
Else
     Response.Write ("Tidigare")	
End IF

 Response.Write (" || ")

 For i = 1 To TotaltAntalSidor
   IF I = AktuellSida Then
     Response.Write ( i &" ")
   Else
     Response.Write(" <a href='visaposter.asp?offset="& I*PosterPerSida &"'>"& I &"</a> ")
   End IF
 Next

IF AktuellSida < TotaltAntalSidor Then
     Response.Write ("<a href='visaposter.asp?offset="& AktuellPlats + PosterPerSida &"'>Nästa</a>")
Else
     Response.Write ("Nästa")
End IF

Koden ovan bör fungera, smällde ihop på ett par minuter ;) Ändra bara så att du får med din count och så du loopar ut dina poster...

Dessutom har du gjort fel med antalSidor, ska se ut enligt nedan, men nu behövs det inte efter min fix :moose :

antalSidor = (antalPoster -(antalPoster mod posterPerSida)/posterPerSida)

/r grammatik och lite rättstavning.

VinnarenMedlem sedan sep. 2005833 inlägg
#13

tack, men den funkade inte så bra. Den hämtar ut samma post 50 gånger, samt sidnavigeringen kommer inte fram :r

SaschMedlem sedan nov. 2002830 inlägg
#14

Jag har inga problem med detta. Nu har jag testat med en skarp databas dessutom... Hur ser din kod ut nu?

VinnarenMedlem sedan sep. 2005833 inlägg
#15

ok, har följande:

			TotaltAntalPoster = 365 '# Räkna, men i detta fallet ett dummytal
			
			PosterPerSida = 15
			
			AktuellPlats = cInt(Request.QueryString("sida"))
			AktuellSida = Round(AktuellPlats/PosterPerSida)
			
			'Response.Write (AktuellPlats &"<br />")
			'Response.Write (AktuellSida &"<br />")
			
			TotaltAntalSidor = Round(TotaltAntalPoster/PosterPerSida)
			
			 min = AktuellPlats
			 max = aktuellplats + PosterPerSida

			
		
			Set objRS = objConn.Execute("SELECT spelare.playID, spelare.lagID, spelare.landID AS spelare_landID, spelare.playFnamn, spelare.playEnamn, spelare.playFodd, spelare.playFodelseort, spelare.playPosition, spelare.playSkott, spelare.playAktiv, land.landID AS land_landID, land.land, land.flagga, klubbar.lagNamn FROM land INNER JOIN spelare ON land.landID = spelare.landID LEFT JOIN klubbar ON spelare.lagID = klubbar.lagID WHERE playAktiv = 1 ORDER BY "&order_spelare&" LIMIT "& min & "," & max&"")

          IF objRS.EOF THEN
          		Response.Write "<tr><td id=""resultat_saknas"" colspan=""8"">Det finns inga spelare att visa</td></tr>"
          ELSE    
					
			
			For J = min To max - 1
			   IF J <= TotaltAntalPoster Then

          %>
              <tr class="spelare_tabell_brodtext spelare_tabell_varannan">

                
                <td class="spelare_tabell_lank">
                    <a title="Visa spelarinfo" href="index.asp?do=players&amp;play=player&amp;ID=<%=objRS("playID")%>">
                        <%response.Write ""&objRS("playEnamn")&", "&objRS("playFnamn")&""%>
                    </a>
                </td>

              </tr>
          <%
		  end if
		  
          Next
          end if 
          objRS.Close 
          Set objRS = nothing
          %>

            <%
            '## Sidnavigeringen ##'
            response.Write "<div class=""spelare_sidNavigering"">"
				'Response.Write intPage
				'Response.Write "<br />"
				'Response.Write intTotalPages
			
			
				IF AktuellSida > 1 Then
					 Response.Write ("<a href='index.asp?do=players&offset="& AktuellPlats - PosterPerSida &"'>Tidigare</a>")
				Else
					 Response.Write ("Tidigare")	
				End IF
				
				 Response.Write (" || ")
				
				 For i = 1 To TotaltAntalSidor
				   IF I = AktuellSida Then
					 Response.Write ( i &" ")
				   Else
					 Response.Write(" <a href='index.asp?do=players&sida="& I*PosterPerSida &"'>"& I &"</a> ")
				   End IF
				 Next
				
				IF AktuellSida < TotaltAntalSidor Then
					 Response.Write ("<a href='index.asp?do=players&sida="& AktuellPlats + PosterPerSida &"'>Nästa</a>")
				Else
					 Response.Write ("Nästa")
				End IF
            response.Write "</div>"

sidnumreringen funkar inte så bra?
index.asp?do=players&sida=30
blir den på sida 2 :S

SaschMedlem sedan nov. 2002830 inlägg
#16

SET rsCount = Server.CreateObject("ADODB.RecordSet")
SET rsCount = objConn.Execute ("SELECT Count(ID) As AntalPoster FROM din tabell WHERE playAktiv = 1 ")

 TotaltAntalPoster = cInt(rsCount("AntalPoster")) ' ## kollar antalet poster för att göra rätt beräkningar

rsCount.Close
SET rsCount = Nothing

'TotaltAntalPoster = 365 '# Räkna, men i detta fallet ett dummytal

PosterPerSida = 15

AktuellPlats = cInt(Request.QueryString("offset"))
AktuellSida = Round(AktuellPlats/PosterPerSida)

'Response.Write (AktuellPlats &"<br />")
'Response.Write (AktuellSida &"<br />")

IF Request.QueryString("offset") = "" Then
 AktuellPlats = 0
 AktuellSida = 1
End IF

TotaltAntalSidor = Round(TotaltAntalPoster/PosterPerSida)

 min = AktuellPlats
 max = aktuellplats + PosterPerSida
 
 Set objRS = objConn.Execute("SELECT spelare.playID, spelare.lagID, spelare.landID AS spelare_landID, spelare.playFnamn, spelare.playEnamn, spelare.playFodd, spelare.playFodelseort, spelare.playPosition, spelare.playSkott, spelare.playAktiv, land.landID AS land_landID, land.land, land.flagga, klubbar.lagNamn FROM land INNER JOIN spelare ON land.landID = spelare.landID LEFT JOIN klubbar ON spelare.lagID = klubbar.lagID WHERE playAktiv = 1 ORDER BY "&order_spelare&" LIMIT "& min & "," & max&"")

 ' # Kontroll  ser till att du får rätt antal poster per sida.
 Kontroll = min
 Do until objRS.EOF OR Kontroll = Max - 1
%>
             <tr class="spelare_tabell_brodtext spelare_tabell_varannan">

                <td class="spelare_tabell_lank">
                    <a title="Visa spelarinfo" href="index.asp?do=players&amp;play=player&amp;ID=<%=objRS("playID")%>">
                        <%response.Write ""&objRS("playEnamn")&", "&objRS("playFnamn")&""%>
                    </a>
                </td>

              </tr>
%>
  Kontroll = Kontroll + 1
 objRS.MoveNext
 Loop

' # Loopa ut alla poster här enligt principen nedan.
' For J = min To max - 1
'   IF J <= TotaltAntalPoster Then
'      Response.Write ( J &"<br />"& vbCrlf)
'   End IF
' Next

objRS.Close
SET objRS = Nothing
%>

<%
' # Visar Tidigare, Antal sidor, samt Nästa sida - allt för navigeringens skull ;-)
' Några få ändringar sedan sist, men bugfixar och liknande

 response.Write "<div class=""spelare_sidNavigering"">"
IF AktuellSida > 0 Then
     Response.Write ("<a href='index.asp?do=players&sida="& AktuellPlats - PosterPerSida &"'>Tidigare</a>")
Else
     Response.Write ("Tidigare")	
End IF

 Response.Write (" || ")

 z = 1
 For i = 0 To TotaltAntalSidor

   IF I = AktuellSida Then
     Response.Write ( z &" ")
   Else
     Response.Write(" <a href='index.asp?do=players&sida="& I*PosterPerSida &"'>"& z &"</a> ")
   End IF
  z = z + 1
 Next

 Response.Write (" || ")

IF AktuellSida < TotaltAntalSidor Then
     Response.Write ("<a href='index.asp?do=players&sida="& AktuellPlats + PosterPerSida &"'>Nästa</a>")
Else
     Response.Write ("Nästa")
End IF
            response.Write "</div>"

Jag har moddat mitt "skript" så att det bör fungera för dig nu - vill du kan du ju göra egna utträkningar för att få "sida" till att vara sida och inte offset - som det fungerar nu för övrigt. Du bör dock kika igenom första anropet (där man räknar ut totalt antal poster för totala sammanräkningen) då du ska skriva in ditt tabellnamn där.

Även gjort mindre bugfixningar i navigeringen så att det ska stämma lite bättre. Lycka till nu då för nu är det tekniskt sett bara att klippa och klistra över ditt förra skriveri.

VinnarenMedlem sedan sep. 2005833 inlägg
#17

ok tack, nu kommer det inte fram samma poster. men navigeringen funkar inte. det står bara 1.
när man trycker på tillbaka så blir det:
index.asp?do=players&sida=-50

framåt går inte klicka på :r

SaschMedlem sedan nov. 2002830 inlägg
#18

Vinnaren skrev:

ok tack, nu kommer det inte fram samma poster. men navigeringen funkar inte. det står bara 1.
när man trycker på tillbaka så blir det:
index.asp?do=players&sida=-50

framåt går inte klicka på :r

Suck. Ändra alla Request.QueryString("offset") till Request.QueryString("sida"). Klart det inte navigeringen fungerar då. :OO

Tydligen missat ett par.

/R:
Du får göra en egen fix så att man inte kan gå minus på pagingsystemet. ;)
IF Summan av = aktuellsida - antalposterpersida < 0 Then
aktuellsida = 0
End IF

eller nåt sånt nere vid "tidigare"-navigationen. Se igenom och så. Det klarar du väl själv?

VinnarenMedlem sedan sep. 2005833 inlägg
#19

fixat, men problemet är att det bara kommer fram en etta, rätt "svar" ska vara 1 tom 15. Går trycka tillbaka, blir då
index.asp?do=players&sida=-50
sen framåt
index.asp?do=players&sida=0

sen går det inte navigera mer :r

SaschMedlem sedan nov. 2002830 inlägg
#20

Du ska egentligen få error på -50 egentligen. Men den grejjen ska väl gå och lösa på egen hand om du går igenom hur det hela fungerar. Se http://www.webforum.nu/showthread.php?p=1353685#post1353685 (redigerade avsnittet).

/r igen: Du kan flytta den kollen till toppen nästan egentligen.

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