Hoe gegevens te pagineren met PHP

Ik kan me jaren geleden herinneren toen ik voor het eerst begon met coderen in PHP en MySQL, hoe opgewonden was ik de eerste keer dat ik informatie uit een database kreeg om in een webbrowser te verschijnen. 

Voor iemand die weinig database- en programmeerkennis had, zag ik die tabelrijen op het scherm verschijnen op basis van de code die ik schreef (oké dus ik kopieerde een voorbeeld uit een boek - laten we geen haartjes splitsen) gaf me een triomfantelijke high. Ik heb misschien toen nog niet alle magie op het werk volledig begrepen, maar dat eerste succes spoorde me aan tot grotere en betere projecten.

Hoewel mijn niveau van uitbundigheid over databases misschien niet hetzelfde is als het ooit was,
sinds mijn eerste 'Hello World' ontmoeting met PHP en MySQL ben ik verslaafd geraakt
over de kracht om dingen eenvoudig en gebruiksvriendelijk te maken. 

Als ontwikkelaar is een probleem waar ik voortdurend mee geconfronteerd ben een grote hoeveelheid informatie te vergaren en het gemakkelijk te verteren. Of het nu gaat om een ​​klantenlijst van een groot bedrijf of een persoonlijke mp3-catalogus, het moet ontmoedigend zijn om rijen en rijen naar rijen te kijken
en frustrerend. Wat kan een goede ontwikkelaar doen? Pagineren!

Op zoek naar een snelle oplossing?

Als u op zoek bent naar een snelle oplossing, is er een grote verzameling scripties en helpers voor paginering bij Envato Market. 

Deze PHP-pagineringklasse is echt handig. Het kan worden geïmplementeerd met elke door PHP ondersteunde database-engine, het is heel gemakkelijk aan te passen en te implementeren, ondersteunt standaard twee schermen, heeft meerkleurige ontwerpschema's en meer.


1. Paginering

Paginering is in wezen het proces van het nemen van een reeks resultaten en verspreiding
ze uit over pagina's om ze gemakkelijker te bekijken.

Ik besefte al vroeg dat als ik 5000 rijen informatie had om niet alleen weer te geven
zou het een hoofdpijn zijn voor iemand om te proberen te lezen, maar de meeste browsers zouden dit wel doen
een internet-eeuwigheid (dat wil zeggen meer dan ongeveer vijf seconden) om het weer te geven. 

Om dit op te lossen zou ik verschillende SQL-statements coderen om stukjes data te verwijderen, en als dat zo was
in een goed humeur zou ik zelfs een paar "volgende" en "vorige" knoppen erin kunnen gooien.
Na een tijdje moet je deze code in elk vergelijkbaar project laten vallen en aanpassen
het passen werd oud. Snel. En zoals elke goede ontwikkelaar weet, kweekt luiheid inventiviteit
of zoiets. Dus op een dag ging ik zitten en besloot om met een simpele te komen,
flexibele en eenvoudig te gebruiken PHP-klasse die automatisch het vuile werk zou doen
me.

Een kort woordje over mij en PHP-lessen. Ik ben geen objectgeoriënteerde sukkel. Sterker nog, ik nauwelijks
ooit de dingen gebruiken. Maar na het lezen van enkele OOP-voorbeelden en tutorials, en sommige
eenvoudige voorbeelden van vallen en opstaan, ik besloot het een werveling te geven en je weet wat?
Het werkt perfect voor paginering. De code die hier wordt gebruikt is geschreven in PHP 4 maar zal
werk in PHP 5.


2. De database

Moet wel van MySQL houden. Geen aanstoot aan de andere database-systemen die er zijn, maar voor
Ik heb alleen MySQL nodig. En een geweldige functie van MySQL is dat ze je wat geven
gratis voorbeelddatabases om mee te spelen op http://dev.mysql.com/doc/#sampledb.

Voor mijn voorbeelden gebruik ik de werelddatabase (~ 90k gecomprimeerd) die over bevat
4000 platen om mee te spelen, maar de schoonheid van het PHP-script dat we zullen creëren is
dat het met elke database kan worden gebruikt. Nu denk ik dat we het er allemaal over eens zijn dat als we besloten hebben
niet om onze resultaten te pagineren dat we uiteindelijk heel lang en onpraktisch zouden eindigen
resultaten zoals de volgende:

(klik voor volledige grootte, belachelijk lang beeld ~ 338k)

Dus laten we het hebben over het opsplitsen van onze gegevens in makkelijk te verteren beten zoals deze:

Mooi toch? Zodra u de pagination-klasse in uw code hebt geplaatst, kunt u dit doen
snel en eenvoudig een enorme set gegevens omzetten in gemakkelijk te navigeren pagina's met
slechts een paar regels code. Werkelijk.


3. Paginator

Dit voorbeeld bestaat uit twee scripts, de herbruikbare paginatorklasse en het indexbestand waarin de tabelitems en bedieningselementen worden weergegeven.

Paginator.class.php

De paginatorklasse heeft slechts twee methoden en de constructor, we zullen deze stapsgewijs opbouwen en elke stap uitleggen wanneer we verder gaan.

 

Deze definitie is alleen de paginator vereiste lidvariabelen, omdat dit een helperklasse is en het is bestemd voor paginering alleen zal het vertrouwen op een geldige verbinding met de MySQL-server en een reeds gedefinieerde vraag dat we de parameters zullen toevoegen die nodig zijn om de resultaten te pagineren. We zullen beginnen met de constructormethode.

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

Heel eenvoudig toch? Deze methode stelt alleen de databaseverbinding van het object en de benodigde query in, waarna het het totale aantal rijen berekent dat door die query is opgehaald zonder enige beperking of parameters overslaan, dit totaal is nodig om de koppelingen voor de paginator te maken.

Merk op dat we voor de eenvoud geen foutcontrole of andere validatie van de gegeven parameters uitvoeren, maar in een toepassing in de echte wereld zijn deze controles noodzakelijk.

Resultaten ophalen

Laten we nu de methode maken die de gegevens daadwerkelijk pagineert en de resultaten retourneert.

_limit = $ limiet; $ this -> _ page = $ pagina; if ($ this -> _ limit == 'all') $ query = $ this -> _ query;  else $ query = $ this -> _ query. " BEGRENZING " . (($ this -> _ page - 1) * $ this -> _ limit). ", $ this -> _ limit";  $ rs = $ this -> _ conn-> query ($ query); while ($ row = $ rs-> fetch_assoc ()) $ results [] = $ row;  $ resultaat = nieuwe stdClass (); $ result-> page = $ this -> _ pagina; $ result-> limit = $ this -> _ limit; $ resultaat-> totaal = $ dit -> _ totaal; $ result-> data = $ resultaten; return $ resultaat;  

Laten we dit stap voor stap analyseren, eerst stellen we de limiet- en paginaparameters in, die standaard respectievelijk de 10 en 1 instellen. Vervolgens controleren we of de gebruiker een bepaald aantal rijen of allemaal nodig heeft, baseer hierop en de paginaparameter die we hebben ingesteld BEGRENZING parameter van de query, houdt de "- 1" van de pagina rekening met het feit dat we de pagina's beginnen in 1 in plaats van 0.

Hierna evalueren we eenvoudig de query en krijgen de resultaten. Als laatste maken we een nieuw resultatenobject met de limiet, pagina en totale parameters van de uitgevoerde query en de gegevens voor elk van de opgehaalde rijen.

Pagineringkoppelingen weergeven

Laten we nu de methode schrijven die wordt gebruikt om de paginakoppelingen te krijgen.

_limit == 'all') return "; $ last = ceil ($ this -> _ total / $ this -> _ limit); $ start = (($ this -> _ page - $ links)> 0)? $ this -> _ pagina - $ links: 1; $ end = (($ this -> _ pagina + $ links) < $last ) ? $this->_page + $ links: $ laatste; $ html = '
    '; $ class = ($ this -> _ page == 1)? "uitgeschakeld": ""; $ html. = '
  • _begrenzing . '& page ='. ($ this -> _ page - 1). '">«
  • '; if ($ start> 1) $ html. = '
  • _begrenzing . '& Page = 1" > 1
  • '; $ html. = '
  • ...
  • '; voor ($ i = $ start; $ i <= $end; $i++ ) $class = ( $this->_page == $ i)? "actief" : ""; $ html. = '
  • _begrenzing . '& page ='. $ i. '">'. $ i. '
  • '; if ($ end < $last ) $html .= '
  • ...
  • '; $ html. = '
  • _begrenzing . '& page ='. $ last. '">'. $ laatste. '
  • '; $ class = ($ this -> _ page == $ last)? "uitgeschakeld": ""; $ html. = '
  • _begrenzing . '& page ='. ($ this -> _ page + 1). '">»
  • '; $ html. = '
'; return $ html;

Dit is een vrij lange methode, zoiets als 34 regels code, dus laten we nu eens uitleggen wat er in deze methode aan de hand is.

  1. Eerst evalueren we of de gebruiker een bepaald aantal links of allemaal nodig heeft, in het tweede geval geven we gewoon een lege string terug omdat er geen paginering vereist is.
  2. Hierna berekenen we de laatste pagina op basis van het totale aantal beschikbare rijen en de items die per pagina zijn vereist.
  3. Vervolgens nemen we de parameter links die het aantal links weergeeft dat onder en boven de huidige pagina moet worden weergegeven, en berekenen we de begin- en eindlink om te maken.
  4. Nu maken we de openingstag voor de lijst en stellen we de klasse daarvan in met de parameter lijstklasse en voegen we de koppeling "vorige pagina" toe, merk op dat we voor deze link controleren of de huidige pagina de eerste is en, zo ja, we instellen de gehandicapte eigenschap van de link.
  5. Op dit punt tonen we een link naar de eerste pagina en een ellips-symbool in het geval dat de startlink niet de eerste is.
  6. Vervolgens voegen we de links toe onder en boven de huidige pagina op basis van de eerder berekende start- en eindparameters, bij elke stap evalueren we de huidige pagina opnieuw de weergegeven koppelingspagina en stelt de actieve klasse dienovereenkomstig in.
  7. Hierna tonen we een ander ellips-symbool en de link naar de laatste pagina in het geval dat de eindlink niet de laatste is.
  8. Ten slotte geven we de link "volgende pagina" weer en stellen de uitgeschakelde status in wanneer de gebruiker de laatste pagina bekijkt, sluit de lijst en retourneert de gegenereerde HTML-tekenreeks.

Dat is alles wat er is met de Paginator.class, natuurlijk kunnen we setters en getters toevoegen voor de databaseverbinding, limiet, pagina, query en totale parameters, maar voor de eenvoud houden we het zo.

4. Index.php

Nu gaan we het bestand maken dat verantwoordelijk is voor het gebruik van de Paginator-klasse en de gegevens weergeven, dus laat me u eerst de HTML-basis laten zien.

  PHP-paginering    

PHP-paginering

stad land Continent Regio

Heel eenvoudig: dit bestand geeft alleen een tabel weer die we vullen met de informatie die uit de database is opgehaald, merk op dat ik in dit voorbeeld bootstrap gebruik voor basispagina-opmaak.

De Paginator gebruiken

gegevens); $ i ++):?>  data [$ i] [ 'Naam']; ?> data [$ i] [ 'Country']; ?> data [$ i] [ 'Continent']; ?> data [$ i] [ 'Region']; ?>   

Gebruik voor het gebruik van onze Paginator-klasse de volgende php-code bovenaan het document.

getData ($ page, $ limit); ?>

Dit script is vrij eenvoudig, we hadden alleen onze Paginator-klasse nodig, merk op dat deze code veronderstelt dat dit bestand zich in dezelfde directory bevindt als de index.php bestand, als dit niet het geval is, moet u het pad dienovereenkomstig bijwerken.

Vervolgens maken we de verbinding met onze database met behulp van de MySQLi-bibliotheek, halen we de paginatorparameters op uit het GET-verzoek en stellen we de vraag in, omdat dit geen artikel op MySQL is of een daarvan zal ik niet in details over de verbinding of de query krijgen hier gebruikt.

Als laatste maken we het Paginator-object en halen we de resultaten voor de huidige pagina op.

De resultaten weergeven

Om de verkregen resultaten weer te geven, voegt u de volgende code toe aan de tabel.

gegevens); $ i ++):?>  data [$ i] [ 'Naam']; ?> data [$ i] [ 'Country']; ?> data [$ i] [ 'Continent']; ?> data [$ i] [ 'Region']; ?>   

Hier zijn we eenvoudig aan het itereren door het resultaatgegevenskenmerk dat de stedenrecords bevat en een tabelrij maakt voor elk daarvan.

Paginering Links

Om de paginator-links weer te geven, voegt u de volgende code onder de tabel toe.

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

Aan de Paginator createLinks-methode geven we het verkregen resultaat door koppelingen parameter en de css-klasse voor de paginatielinks die worden gebruikt vanuit bootstrap. Dit is het resultaat van de gemaakte pagina.

Conclusie

Dit moet u alles bieden wat u moet weten om met behulp van paginering in uw toepassing aan de slag te gaan.

Aarzel niet om vragen, opmerkingen of algemene feedback achter te laten in de feed hieronder!

Nog steeds vast? Neem contact op met een van onze ervaren PHP-ontwikkelaars op Envato Studio.