Så här paginerar du data med PHP

Jag kan komma ihåg år sedan när jag först började koda i PHP och MySQL, hur upphetsad var jag första gången jag fick information från en databas för att dyka upp i en webbläsare. 

För någon som hade lite databas och programmeringskunskap såg de här tabellraderna upp på skärmen baserat på koden jag skrev (okej så jag kopierade ett exempel från en bok - låt oss inte dela hår) gav mig en triumferande hög. Jag har kanske inte helt förstått all magi på jobbet då, men den första framgången ledde mig till större och bättre projekt.

Medan min nivå av överflöd över databaser kanske inte är densamma som den en gång var,
Sedan min första "hej värld" möte med PHP och MySQL har jag blivit knuten
på kraften att göra saker enkelt och enkelt att använda. 

Som utvecklare är ett problem som jag ständigt konfronteras med att ta en stor uppsättning information och gör det lätt att smälta. Oavsett om det är ett stort företags kundlista eller en personlig mp3-katalog som måste sitta och stirra i rader på rader på rader av data kan vara avskräckande
och frustrerande. Vad kan en bra utvecklare göra? Paginera!

Letar efter en snabb lösning?

Om du letar efter en snabb lösning finns det en bra samling av paginationsskript och hjälpare över på Envato Market. 

Denna PHP-paginationsklass är verkligen användbar. Det kan implementeras med alla PHP-stödda databasmotorer, det är väldigt lätt att anpassa och implementera, stöder två skärmar som standard, har flerfärgade designscheman och mer.


1. Pagination

Pagination är i huvudsak processen att ta en uppsättning resultat och spridning
dem ut över sidor för att göra dem enklare att visa.

Jag insåg det tidigt om jag hade 5000 rader information att visa inte bara
skulle det vara en huvudvärk för någon att försöka läsa, men de flesta webbläsare skulle ta
en Internet-evighet (dvs mer än ungefär fem sekunder) för att visa den. 

För att lösa detta skulle jag koda olika SQL-satser för att dra ut bitar av data, och om jag var
I ett gott humör kan jag till och med slänga in ett par "nästa" och "tidigare" knappar.
Efter ett tag måste du släppa den här koden i alla liknande projekt och anpassa
den passade blev gammal. Snabb. Och som alla goda utvecklare vet känner lathet rasande uppfinningsrikedom
eller något sådant. Så en dag satt jag ner och bestämde mig för att komma upp med en enkel,
flexibel och lätt att använda PHP-klass som automatiskt skulle göra det smutsiga arbetet för
mig.

Ett snabbt ord om mig och PHP klasser. Jag är ingen objektorienterad whiz. Faktum är att jag knappast
Använd någonsin sakerna. Men efter att ha läst några OOP-exempel och tutorials, och några
Enkla exempel på prov och fel, jag bestämde mig för att ge det en virvel och du vet vad?
Det fungerar perfekt för pagination. Koden som används här är skriven i PHP 4 men kommer att
jobba i PHP 5.


2. Databasen

Måste älska MySQL. Inget brott mot de andra databassystemen där ute, men för
mig, allt jag behöver är MySQL. Och en bra funktion i MySQL är att de ger dig lite
gratis provdatabaser att spela med på http://dev.mysql.com/doc/#sampledb.

För mina exempel använder jag världsdatabasen (~ 90k zipped) som innehåller över
4000 poster att spela med, men skönheten i PHP-skriptet vi ska skapa är
att den kan användas med vilken databas som helst. Nu tror jag att vi alla kan vara överens om att om vi bestämde oss
att inte paginera våra resultat att vi skulle hamna med en mycket lång och ojämn
resultat som följande:

(klicka för full storlek, löjligt lång bild ~ 338k)

Så det går lätt att bryta upp våra data så att de lätt kan smälta biter så här:

Vackert är det inte? När du har släppt paginationsklassen i din kod kan du
snabbt och enkelt omvandla en stor uppsättning data till lätt att navigera sidor med
bara några rader av kod. Verkligen.


3. Paginator

Det här exemplet kommer att bestå av två skript, den återanvändbara paginator klassen och indexfilen som visar tabellobjekten och kontrollerna.

Paginator.class.php

Paginator-klassen har bara två metoder och konstruktören, vi kommer att bygga den, förklarar gradvis varje steg när vi går framåt.

 

Den här definitionen är bara en paginator som kräver medlemsvariabler, eftersom det här är en hjälparklass och den är avsedd för pagination, kommer den att förlita sig på en giltig anslutning till MySQL-servern och en redan definierad fråga som vi kommer att lägga till parametrarna som behövs för att paginera resultaten. Vi börjar med konstruktormetoden.

_conn = $ conn; $ this -> _ query = $ query; $ rs = $ this -> _ conn-> fråga ($ this -> _ query); $ this -> _ total = $ rs-> num_rows;  

Ganska enkelt rätt? Den här metoden anger bara objektets databasanslutning och den nödvändiga frågan. Efter det beräknar det totala antalet rader som hämtas av den frågan utan någon gräns eller hoppa över parametrar, är denna summa nödvändig för att skapa länkarna för paginorn.

Observera att för enkelhet gör vi inte felkontroll eller någon annan validering av de angivna parametrarna, men i en verklig applikation måste dessa kontroller vara nödvändiga.

Hämtar resultat

Låt oss nu skapa den metod som faktiskt kommer att paginera data och returnera resultaten.

_limit = $ limit; $ this -> _ page = $ page; om ($ this -> _ limit == 'all') $ query = $ this -> _ query;  annars $ query = $ this -> _ query. "LIMIT". (($ this -> _ page - 1) * $ this -> _ limit). ", $ this -> _ limit";  $ rs = $ this -> _ conn-> fråga ($ query); medan ($ row = $ rs-> fetch_assoc ()) $ results [] = $ row;  $ result = new stdClass (); $ result-> page = $ this -> _ page; $ result-> limit = $ this -> _ limit; $ result-> total = $ this -> _ total; $ result-> data = $ results; returnera $ resultat;  

Låt oss analysera det här steget i taget, först ställer vi gränsen och sidparametrarna, som som standard är inställda 10 respektive 1. Då kontrollerar vi om användaren kräver ett visst antal rader eller alla av dem, baseras på den här och sidparametern vi ställer in BEGRÄNSA parametern för frågan tar "- 1" av sidan hänsyn till det faktum att vi börjar sidorna i 1 istället för 0.

Därefter utvärderar vi enkelt frågan och får resultaten, slutligen skapar vi ett nytt resultatobjekt som innehåller gränsen, sidan och totalparametrarna för den exekverade frågan samt uppgifterna för var och en av de hämtade raderna.

Visar paginationslänkar

Låt oss nu skriva metoden som används för att få paginationslänkarna.

_limit == 'alla') return '; $ last = maximum ($ this -> _ total / $ this -> _ limit); $ start = (($ detta -> _sidan - $ länkar)> 0)? $ this -> _ sida - $ länkar: 1; $ end = (($ detta -> _ sida + $ länkar) < $last ) ? $this->_page + $ länkar: $ last; $ html = '
    '; $ class = ($ this -> _ page == 1)? "Inaktiverad" : ""; $ html. = '
  • _limit. '& page ='. ($ detta -> _ sida - 1). '">«
  • '; om ($ start> 1) $ html. = '
  • _limit. '& Page = 1" > 1
  • '; $ html. = '
  • ...
  • '; för ($ i = $ start; $ i <= $end; $i++ ) $class = ( $this->_page == $ i)? "aktiva" : ""; $ html. = '
  • _limit. '& page ='. $ i. '">'. $ i. '
  • '; om ($ slut < $last ) $html .= '
  • ...
  • '; $ html. = '
  • _limit. '& page ='. $ sista. '">'. $ sista. '
  • '; $ class = ($ this -> _ page == $ last)? "Inaktiverad" : ""; $ html. = '
  • _limit. '& page ='. ($ detta -> _ sida + 1). '">»
  • '; $ html. = '
'; returnera $ html;

Det här är en ganska lång metod, något som 34 linjer kod, så nu låt oss förklara vad som händer i den här metoden.

  1. Först utvärderar vi om användaren kräver ett visst antal länkar eller alla, i det andra fallet returnerar vi helt enkelt en tom sträng eftersom ingen pagination krävs.
  2. Efter detta beräknar vi den sista sidan baserat på det totala antalet tillgängliga rader och de objekt som krävs per sida.
  3. Då tar vi länkarparametern som representerar antalet länkar som ska visas under och över den aktuella sidan och beräkna start- och slutlänken för att skapa.
  4. Nu skapar vi öppningsetiketten för listan och ställer klassen av den med listklassparametern och lägger till länken "föregående sida". Observera att för den här länken kontrollerar vi om den aktuella sidan är den första och i så fall ställer vi in länkens funktionshinder.
  5. Vid denna tidpunkt visar vi en länk till första sidan och en ellipsis-symbol om startlänken inte är den första.
  6. Därefter lägger vi till länkarna nedan och över den aktuella sidan baserat på de tidigare beräknade start- och slutparametrarna, i varje steg utvärderar vi nuvarande sida igen länksidan som visas och ställer den aktiva klassen i enlighet därmed.
  7. Därefter visas en annan ellipsisymbol och länken till den sista sidan om ändlänken inte är den sista.
  8. Slutligen visar vi länken "nästa sida" och anger inaktiverat tillstånd när användaren tittar på den sista sidan, stänger listan och returnerar den genererade HTML-strängen.

Det är allt som finns till Paginator.class, vi kan naturligtvis lägga till setters och getters för databasanslutning, gräns, sida, fråga och totala parametrar, men för enkelhet kommer vi att behålla det här sättet.

4. Index.php

Nu skapar vi filen som ansvarar för att använda Paginator-klassen och visar data, så först låt mig visa dig basen HTML.

  PHP-paginering    

PHP-paginering

Stad Land Kontinent Område

Helt enkelt, denna fil visar bara ett bord som vi kommer att fylla i med informationen som hämtas från databasen, notera att för det här exemplet använder jag bootstrap för grundläggande sidstyling.

Använda Paginator

data); $ i ++):?>  uppgifter [$ i] [ 'Namn']; ?> uppgifter [$ i] [ 'land']; ?> uppgifter [$ i] [ 'kontinenten']; ?> uppgifter [$ i] [ 'Region']; ?>   

Nu för att använda vår Paginator-klass lägger du till följande php-kod längst upp i dokumentet.

getData ($ sida, $ limit); ?>

Det här skriptet är ganska enkelt, vi behövde bara vår Paginator-klass, notera att den här koden förutsätter att den här filen är i samma katalog som index.php fil, om så inte är fallet bör du uppdatera sökvägen i enlighet med detta.

Då skapar vi anslutningen till vår databas med MySQLi-biblioteket, hämtar paginatorparametrarna från GET-förfrågan och ställer in frågan, eftersom det här inte är en artikel på MySQL eller någon av det kommer jag inte in i detaljer om anslutningen eller frågan används här.

Slutligen skapar vi Paginator-objektet och hämtar resultaten för den aktuella sidan.

Visar resultaten

Nu för att visa de erhållna resultaten lägger du till följande kod i tabellen.

data); $ i ++):?>  uppgifter [$ i] [ 'Namn']; ?> uppgifter [$ i] [ 'land']; ?> uppgifter [$ i] [ 'kontinenten']; ?> uppgifter [$ i] [ 'Region']; ?>   

Här är det enkla att iterera genom resultatdatatributet som innehåller stadens poster och skapar en tabellrad för var och en av dem.

Pagination Länkar

För att visa paginorns länkar lägger du till följande kod under tabellen.

createLinks ($ länkar, 'pagination pagination-sm'); ?> 

Till Paginator createLinks-metoden passerar vi den erhållna länkar parameter och css-klassen för paginationslänkarna som används från bootstrap. Här är resultatet av den skapade sidan.

Slutsats

Detta bör ge dig allt du behöver veta för att komma igång med pagination i din ansökan.

Tveka inte att lämna frågor, kommentarer eller allmän feedback i foderet nedan!

Fortfarande fast? Prova att kontakta en av våra erfarna PHP-utvecklare på Envato Studio.