Slik paginerer du data med PHP

Jeg kan huske år siden da jeg først begynte å kode i PHP og MySQL, hvor spennende jeg var første gang jeg fikk informasjon fra en database for å dukke opp i en nettleser. 

For noen som hadde liten database og programmeringskunnskap, ser de tabellrommene opp på skjermen basert på koden jeg skrev (ok, så jeg kopierte et eksempel fra en bok - la oss ikke dele hår) ga meg en triumferende høy. Jeg har kanskje ikke fullt ut forstått all den magiske på jobben da, men den første suksessen førte meg til større og bedre prosjekter.

Selv om nivået av utroskap over databaser kanskje ikke er det samme som det en gang var,
Helt siden min første 'hallo verden' møte med PHP og MySQL har jeg blitt hekta
på kraften til å gjøre ting enkle og enkle å bruke. 

Som utvikler er et problem jeg stadig står overfor med å ta et stort sett med informasjon og gjør det enkelt å fordøye. Enten det er et stort selskaps kundeliste eller en personlig mp3-katalog, må du sitte og stirre på rader på rader på rader med data, som kan avlede
og frustrerende. Hva kan en god utvikler gjøre? Paginer!

Leter du etter en rask løsning?

Hvis du leter etter en rask løsning, er det en flott samling av paginasjonsskript og hjelpere på Envato Market. 

Denne PHP pagineringskursen er veldig nyttig. Den kan implementeres med en hvilken som helst PHP-støttet databasemotor, det er veldig enkelt å tilpasse og implementere, støtter to skjermer som standard, har flerfarget designordninger og mer.


1. Paginering

Paginering er i hovedsak prosessen med å ta et sett med resultater og spredning
dem ut over sider for å gjøre dem enklere å vise.

Jeg skjønte tidlig om det hvis jeg hadde 5000 rader med informasjon å vise ikke bare
ville det være en hodepine for noen å prøve å lese, men de fleste nettlesere ville ta
en Internett-evighet (dvs. mer enn omtrent fem sekunder) for å vise den. 

For å løse dette ville jeg kode forskjellige SQL-setninger for å trekke ut biter av data, og om jeg var
I et godt humør kan jeg til og med kaste inn et par "neste" og "forrige" knapper.
Etter en stund, måtte du slippe denne koden i alle lignende prosjekter og tilpasse
det å passe ble gammel. Rask. Og som enhver god utvikler vet, raser latskap oppfinnsomhet
eller noe sånt. Så en dag satte jeg seg og bestemte meg for å komme opp med en enkel,
fleksibel og brukervennlig PHP-klasse som automatisk ville gjøre det skitne arbeidet for
meg.

Et raskt ord om meg og PHP-klasser. Jeg er ingen objektorientert whiz. Faktisk, jeg knapt
Bruk alltid tingene. Men etter å ha lest noen OOP-eksempler og opplæringsprogrammer, og noen
Enkle eksempler på prøving og feiling, bestemte meg for å gi det en virvel og du vet hva?
Det fungerer perfekt for paginering. Koden som brukes her er skrevet i PHP 4, men vil
jobbe i PHP 5.


2. Databasen

Må elske MySQL. Ikke fornærmet de andre databasesystemene der ute, men for
Jeg, alt jeg trenger, er MySQL. Og en flott funksjon av MySQL er at de gir deg noe
gratis prøvedatabaser å spille med på http://dev.mysql.com/doc/#sampledb.

For mine eksempler skal jeg bruke verdensdatabasen (~ 90k zip) som inneholder over
4000 poster å spille med, men skjønnheten i PHP-skriptet vi skal skape er
at den kan brukes med hvilken som helst database. Nå tror jeg at vi alle kan være enige om at hvis vi bestemte oss
Ikke å paginere våre resultater at vi ville ende opp med noen veldig lange og uhåndterlige
resultater som følger:

(klikk for full størrelse, latterlig lang bilde ~ 338k)

Så kan vi komme ned for å bryte opp dataene våre til lett å fordøye biter som dette:

Vakre er det ikke? Når du slipper pagineringsklassen i koden du kan
raskt og enkelt forvandle et stort sett med data til enkle å navigere sider med
bare noen få linjer med kode. Egentlig.


3. Paginator

Dette eksemplet vil bli komponert av to skript, den gjenbrukbare paginator-klassen og indeksfilen som viser tabellelementene og kontrollene.

Paginator.class.php

Paginator-klassen har bare to metoder, og konstruktøren, vi skal bygge den, forklarer hvert trinn hvert trinn når vi beveger oss fremover.

 

Denne definisjonen er bare satt til paginatoren påkrevde medlemsvariabler, siden dette er en hjelpeklasse og den er bestemt for paginering, vil den stole på en gyldig forbindelse til MySQL-serveren og en allerede definert spørring som vi vil legge til parametrene som er nødvendige for å paginere resultatene. Vi starter med konstruktormetoden.

_conn = $ conn; $ this -> _ query = $ query; $ rs = $ this -> _ conn-> spørring ($ dette -> _ spørringen); $ dette -> _ totalt = $ rs-> num_rows;  

Ganske enkelt rett? Denne metoden er bare satt til objektets databaseforbindelse og den nødvendige spørringen, etter at den beregner totalt antall rader hentet av den forespørselen uten noen grense eller hoppeparametre, er denne summen nødvendig for å opprette koblingene for paginisten.

Legg merke til at for enkelhets skyld ikke gjør vi feilkontroll eller annen validering av de oppgitte parametrene, men i en ekte verdensapplikasjon vil denne kontrollen være nødvendig.

Henter resultater

La oss nå lage metoden som faktisk vil paginere dataene og returnere resultatene.

_limit = $ limit; $ dette -> _ side = $ side; hvis ($ this -> _ limit == 'all') $ query = $ this -> _ spørringen;  ellers $ query = $ dette -> _ spørringen. " GRENSE " . ((denne $ - _ _ side - 1) * $ dette -> _ grense). ", $ dette -> _ grense";  $ rs = $ dette -> _ conn-> spørring ($ spørring); mens ($ row = $ rs-> fetch_assoc ()) $ results [] = $ row;  $ result = new stdClass (); $ result-> page = $ this -> _ side; $ result-> limit = $ this -> _ limit; $ resultat-> totalt = $ dette -> _ totalt; $ result-> data = $ results; returnere $ resultat;  

La oss analysere dette trinnet om gangen, først fastsetter vi grensen og sideparametrene, som som standard er satt henholdsvis 10 og 1. Deretter sjekker vi om brukeren krever et gitt antall rader eller alle av dem, base på dette og sideparameteren vi setter inn GRENSE parameteren for spørringen, tar «- 1» av siden hensyn til det faktum at vi starter sidene i 1 i stedet for 0.

Etter dette vurderer vi bare spørringen og får resultatene, til slutt lager vi et nytt resultatobjekt som inneholder grensen, siden og totalparametrene for den utførte spørringen, samt dataene for hver av de hentede rader.

Viser pagineringslinker

La oss nå skrive metoden som brukes til å få paginasjonslinkene.

_limit == 'alle') return; $ last = tak ($ ​​dette -> _ totalt / $ dette -> _ grense); $ start = (($ dette -> _ side - $ linker)> 0)? $ dette -> _ side - $ linker: 1; $ end = (($ dette -> _ side + $ linker) < $last ) ? $this->_page + $ links: $ last; $ html = '
    '; $ class = ($ dette -> _ side == 1)? "funksjonshemmet" : ""; $ html. = '
  • _grense . '& page ='. ($ dette -> _ side - 1). '">«
  • '; hvis ($ start> 1) $ html. = '
  • _grense . '& Page = 1" > 1
  • '; $ html. = '
  • ...
  • '; for ($ i = $ start; $ i <= $end; $i++ ) $class = ( $this->_page == $ i)? "aktiv": ""; $ html. = '
  • _grense . '& page ='. $ i. '">'. $ i. '
  • '; hvis ($ ende < $last ) $html .= '
  • ...
  • '; $ html. = '
  • _grense . '& page ='. $ siste. '">'. $ siste. '
  • '; $ class = ($ dette -> _ side == $ siste)? "funksjonshemmet" : ""; $ html. = '
  • _grense . '& page ='. ($ dette -> _ side + 1). '">»
  • '; $ html. = '
'; returner $ html;

Dette er en ganske lang metode, noe som 34 linjer med kode, så nå la oss forklare hva som skjer i denne metoden.

  1. Først vurderer vi om brukeren krever et gitt antall koblinger eller alle av dem, i det andre tilfellet returnerer vi bare en tom streng siden ingen paginering kreves.
  2. Etter dette beregner vi den siste siden basert på totalt antall tilgjengelige rader og elementene som kreves per side.
  3. Deretter tar vi koblingsparameteren som representerer antall koblinger som skal vises under og over den nåværende siden, og beregne start- og sluttlinken for å opprette.
  4. Nå lager vi åpningskoden for listen og setter klassen av den med listeklasseparameteren og legger til linken "forrige side". Merk at for denne lenken, kontrollerer vi om den nåværende siden er den første, og i så fall setter vi inn deaktiverte eiendommen til lenken.
  5. På dette punktet viser vi en lenke til første side og et ellipsis-symbol i tilfelle at startlinken ikke er den første.
  6. Deretter legger vi til koblingene under og over den nåværende siden basert på de tidligere beregnede start- og sluttparametrene. I hvert trinn evaluerer vi gjeldende side igjen, koblingssiden vises og angir den aktive klassen i henhold til dette..
  7. Etter dette viser vi et annet ellipsis-symbol og lenken til den siste siden i tilfelle at sluttlinken ikke er den siste.
  8. Endelig viser vi koblingen "neste side" og angir deaktivert tilstand når brukeren ser på den siste siden, lukker listen og returnerer den genererte HTML-strengen.

Det er alt som er til Paginator.class, selvfølgelig kan vi legge til setters og getters for databasetilkoblingen, grensen, siden, spørringen og totalparametrene, men for enkelhet vil vi holde det på denne måten.

4. Index.php

Nå lager vi filen som har ansvaret for å bruke Paginator-klassen og viser dataene, så la meg først vise deg basen HTML.

  PHP-paginering    

PHP-paginering

By Land Kontinent Region

Ganske enkelt, viser denne filen bare en tabell som vi vil fylle ut med informasjonen hentet fra databasen, merk at i dette eksempelet bruker jeg bootstrap for grunnleggende sidestyling.

Bruke Paginator

data); $ i ++):?>  data [$ i] [ 'navn']; ?> data [$ i] [ 'Land']; ?> data [$ i] [ 'Continent']; ?> data [$ i] [ 'Region']; ?>   

Nå for å gjøre bruk av vår Paginator-klasse legger du til følgende php-kode øverst i dokumentet.

getData ($ side, $ grense); ?>

Dette skriptet er ganske enkelt, vi trenger bare vår Paginator-klasse, merk at denne koden antar at denne filen er i samme katalog som index.php fil, hvis dette ikke er tilfelle, bør du oppdatere banen tilsvarende.

Deretter lager vi tilkoblingen til databasen vår ved hjelp av MySQLi-biblioteket, henter paginatorparametrene fra GET-forespørselen og stiller spørringen, siden dette ikke er en artikkel på MySQL eller noe av det, vil jeg ikke komme inn på detaljer om tilkoblingen eller spørringen brukt her.

Til slutt lager vi Paginator-objektet og henter resultatene for gjeldende side.

Viser resultatene

Nå for å vise de oppnådde resultatene, legg til følgende kode i bordkroppen.

data); $ i ++):?>  data [$ i] [ 'navn']; ?> data [$ i] [ 'Land']; ?> data [$ i] [ 'Continent']; ?> data [$ i] [ 'Region']; ?>   

Her er det enkle å iterere gjennom resultatdataattributtet som inneholder byernes poster og opprette en tabellrad for hver enkelt av dem.

Paginering Lenker

For å vise paginator-koblingene legger du til følgende kode under tabellen.

createLinks ($ links, 'pagination pagination-sm'); ?> 

Til Paginator createLinks-metoden passerer vi den oppnådde lenker parameter og css-klassen for pagineringskoblingene som brukes fra oppstartstrappen. Her er resultatet av den opprettede siden.

Konklusjon

Dette skal gi deg alt du trenger å vite for å komme opp med paginering i søknaden din.

Ikke nøl med å legge igjen spørsmål, kommentarer eller generell tilbakemelding i feedet under!

Fortsatt fast? Prøv å kontakte en av våre erfarne PHP-utviklere på Envato Studio.