Uvod
Paginacija je važan koncept u izgradnji aplikacija vođenih podacima. Prilikom dohvaćanja zapisa iz baze podataka, može se dohvatiti veliki broj zapisa. Na primjer, kada se pokrene upit za aktivne korisnike ili korisnike koji pripadaju nekoj određenoj lokaciji, može se vratiti veliki broj korisnika u stotinama ili čak tisućama. Prikazivanje ovog ogromnog broja zapisa na jednoj web stranici nije rješenje prilagođeno korisniku jer može preopteretiti korisnika, kao i narušiti glatkoću korisničkog iskustva.
Stoga je bolja opcija ograničiti broj zapisa. To je koncept paginacije. Drugim riječima, broj zapisa dijelimo na stranice i zatim prikazujemo stranicu. Jedna stranica može imati deset ili čak petnaest ili bilo koju drugu količinu izvedivih zapisa koji se mogu prikazati na korisničkom sučelju.
Iako paginacija može poboljšati cjelokupno korisničko iskustvo aplikacije, ona također može ubrzati aplikaciju jer možemo dohvatiti smanjeni broj zapisa. Stoga se manje podataka prenosi mrežom između klijenta i poslužitelja, smanjujući vrijeme latencije.
U ovom vodiču ćemo graditi PHP kod koji se povezuje s bazom podataka i implementirati paginaciju pomoću MySQL baze podataka i njezine LIMIT klauzule.
Preduvjeti
Kako biste pratili ovaj vodič, trebat će vam:
-
Najnovija verzija Ubuntua, instalirana i pokrenuta. Slijedite vodič Kako postaviti svoj Ubuntu poslužitelj ako vam je potrebna pomoć.
-
Također ćete morati imati instalirane PHP i MySQL. Za postavljanje PHP-a i MySQL-a imamo vodič: Postavljanje LAMP stoga – Linux Apache MySQL PHP.
Korak 1 — Postavljanje korisnika baze podataka i testne baze podataka
U ovom vodiču uspostavit ćemo vezu s MySQL bazom podataka i dohvatiti zapise. Ovi zapisi bit će prikazani na HTML stranici s elementom tablice. Za uspostavljanje veze i prikaz zapisa koristit ćemo PHP skriptu. Kada budemo spremni s vezom s bazom podataka, testirat ćemo našu aplikaciju s paginacijom i bez paginacije. Testiranje na ovaj način omogućit će nam da shvatimo kako paginacija funkcionira u praksi.
Za povezivanje s MySQL bazom podataka trebat će nam uzorak MySQL baze podataka i autentifikacijski podaci korisnika za povezivanje s MySQL bazom podataka. U ovom koraku stvorit ćete korisnika koji nije root za svoju MySQL bazu podataka, uzorak baze podataka i tablicu za testiranje PHP skripte.
Prvo se prijavite na svoj poslužitelj. Zatim se prijavite na MySQL poslužitelj pomoću donje naredbe:
|
1 |
mysql> sudo mysql -u root -p |
Od vas će se tražiti lozinka za root korisnika. Unesite lozinku i pritisnite Enter za nastavak. Zatim stvorite uzorak baze podataka pod nazivom test_db, koju ćemo koristiti u našem vodiču. Za stvaranje nove baze podataka pokrenite donju naredbu:
|
1 |
mysql> Create database test_db; |
Vidjet ćete izlaz iz MySQL poslužitelja da je zahvaćen jedan redak. Zatim ćemo morati stvoriti novog korisnika za ovu bazu podataka. Dodijelit ćemo ovom korisniku sve privilegije. Međutim, kada radite s praktičnim aplikacijama, svakako ograničite privilegije. Našeg korisnika nazvat ćemo test_user. U donjoj naredbi zamijenite PASSWORD jakom lozinkom:
|
1 |
mysql> GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD'; |
Nakon što je korisnik stvoren, osvježite privilegije:
|
1 |
mysql> FLUSH PRIVILEGES; |
Sada kada su i test_user i test_db spremni, upotrijebite test_db za izradu tablica. Za prebacivanje na test_db, pokrenite donju naredbu:
|
1 |
mysql> Use test_db; |
Nakon što vidimo da je baza podataka promijenjena u izlazu, spremni smo za izradu naše tablice. Stvorit ćemo novu tablicu pod nazivom Products za pohranu proizvoda. Za naše potrebe trebat će nam samo dva stupca u ovoj tablici: product_id i product_name. Postavit ćemo product_id na AUTO_INCREMENT, tako da će se povećavati svaki put kada dodamo novi proizvod. Drugi stupac pod nazivom product_name koristit će se za pohranu naziva proizvoda. Stupac product_name koristit će se za razlikovanje svakog proizvoda po nazivu:
|
1 |
mysql> Create table products (product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50) NOT NULL ) Engine = InnoDB; |
Sada ćemo dodati neke proizvode u ovu novostvorenu tablicu. Za to pokrenite naredbe u nastavku:
|
1 2 3 4 5 6 7 8 9 10 |
mysql> Insert into products(product_name) values ('WIRELESS MOUSE'); mysql> Insert into products(product_name) values ('BLUETOOTH SPEAKER'); mysql> Insert into products(product_name) values ('GAMING KEYBOARD'); mysql> Insert into products(product_name) values ('320GB FAST SSD'); mysql> Insert into products(product_name) values ('17 INCHES TFT'); mysql> Insert into products(product_name) values ('SPECIAL HEADPHONES'); mysql> Insert into products(product_name) values ('HD GRAPHIC CARD'); mysql> Insert into products(product_name) values ('80MM THERMAL PRINTER'); mysql> Insert into products(product_name) values ('HDMI TO VGA CONVERTER'); mysql> Insert into products(product_name) values ('FINGERPRINT SCANNER'); |
Da biste provjerili jesu li ovi proizvodi uneseni u tablicu, pokrenite naredbu u nastavku:
|
1 |
mysql> select * from products; |
Ako vidite proizvode koje ste prethodno unijeli, spremni ste za nastavak. Izađite iz MySQL baze podataka pomoću naredbe u nastavku:
|
1 |
mysql> quit; |
Sada kada smo postavili MySQL bazu podataka i unijeli testne podatke, spremni smo za pisanje PHP skripte za povezivanje s ovom bazom podataka i dohvaćanje zapisa.
Korak 2 – Dohvaćanje i prikazivanje zapisa bez paginacije
Kao što je gore opisano, prvo ćemo prikazati zapise bez paginacije. Izgradit ćemo PHP skriptu koja se povezuje s MySQL bazom podataka i dohvaća zapise. Povezat ćemo se na test_db koju smo gore stvorili pomoću test_user i dohvatiti zapise.
Naša tablica products trenutno ima samo deset zapisa. Mnogim korisnicima možda neće biti očito je li paginacija potrebna ili nije. Međutim, testiranje aplikacije bez paginacije detaljnije će prikazati kako ona pomaže u cjelokupnom iskustvu korištenja aplikacije. Također ćemo razumjeti kako podjela podataka pomaže u stvaranju boljeg korisničkog iskustva i smanjuje opterećenje poslužitelja.
Na svom PHP poslužitelju, u korijenskom direktoriju dokumenata mape web stranice, pokrenite naredbu u nastavku:
sudo nano /var/www/html/pagination_test.php
Sada u ovu datoteku dodajte sadržaj u nastavku. Svakako zamijenite PASSWORD s vrijednošću lozinke vašeg test_user:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php try { $pdo = new PDO("mysql:host=localhost;dbname=test_db", "test_user", "PASSWORD"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); $sql = "select * from products"; $stmt = $pdo->prepare($sql); $stmt -> execute(); echo "<table border='1' align='center'>"; while (($row = $stmt -> fetch(PDO::FETCH_ASSOC)) !== false) { echo "<tr>"; echo "<td>".$row['product_id']."</td>"; echo "<td>".$row['product_name']."</td>"; echo "</tr>"; } echo "</table>"; } catch(PDOException $e) { echo $e->getMessage(); } ?> |
Spremite datoteku. Prije nego što krenemo dalje, sažet ćemo ono što smo gore učinili:
-
Najprije smo se povezali s MySQL bazom podataka, a za to smo koristili PHP Data Object (PDO) knjižnicu. Koristili smo vjerodajnice MySQL korisnika koje smo prethodno upotrijebili za povezivanje s MySQL bazom podataka. PDO je iznimno korisna knjižnica koja se koristi za povezivanje s bazom podataka. Čini sloj za pristup podacima jednostavnim za kodiranje i omogućuje povezivanje s različitim bazama podataka bez potrebe za opsežnim refaktoriranjem aplikacije. PDO koristi pripremljene upite što osigurava da sigurnost ne bude ugrožena. Stoga se upiti izvršavaju sigurno.
-
Zatim smo koristili PDO API za izvršavanje select * from products naredbe. $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false) osigurava da su tipovi podataka u PHP-u isti kao i u bazi podataka. Stoga se product_id i product_name pojavljuju kao cijeli broj, odnosno niz znakova.
-
Naredba $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); govori PDO-u da baci iznimku ako dođe do pogreške. Na taj način možemo lako uhvatiti iznimku u try … catch bloku i obraditi je po potrebi.
Sada kada nam je skripta spremna, moramo je pokrenuti. Da biste to učinili, otvorite svoj preglednik i posjetite URL: /var/www/html/pagination_test.php. Obavezno dodajte IP adresu svog poslužitelja u URL. Ako pokrećete lokalno, vaš će URL postati http://localhost/var/www/html/pagination_test.php.
Vidjet ćete sljedeći izlaz:

Ovdje su naši proizvodi vraćeni i prikazani na stranici. Sada zamislite da imamo stotine proizvoda. To bi rezultiralo dugom petljom za dohvaćanje podataka i njihov prikaz na stranici. To će povećati vrijeme učitavanja stranice.
U sljedećem odjeljku modificirat ćemo PHP skriptu i uključiti MySQL LIMIT klauzulu. To će riješiti problem prikazivanja velikog broja zapisa. Dodat ćemo poveznice za paginaciju kako bi se korisnik mogao kretati kroz stranice.
Korak 3 – Postavljanje paginacije pomoću PHP-a
U ovom koraku postavit ćemo paginaciju pomoću PHP-a za prikaz podataka pomoću više tablica. Kako bismo omogućili paginaciju, modificirat ćemo skriptu koju smo kodirali u prethodnom koraku.
Koristit ćemo LIMIT klauzulu MySQL baze podataka. Prije nego što je dodamo u skriptu, pogledajmo primjer MySQL LIMIT sintakse:
|
1 |
mysql> Select [column1, column2, column n...] from [table name] LIMIT offset, records; |
U gornjoj izjavi možemo vidjeti da LIMIT klauzula ima offset i records argumente. offset govori koliko zapisa treba preskočiti, a records govori maksimalan broj zapisa za prikaz po stranici ili dohvaćanje iz baze podataka.
Sada kada znamo kako paginacija radi, pogledajmo kako ćemo je implementirati. Prikazat ćemo tri zapisa po stranici. Dakle, ako imamo deset zapisa u našoj bazi podataka, imat ćemo četiri stranice dijeljenjem ukupnog broja zapisa s brojem zapisa po stranici. Budući da rezultat možda neće biti cijeli broj, koristit ćemo PHP Ceil funkciju za zaokruživanje na najbliži cijeli broj kako bismo dobili rezultat u obliku cijelog broja. Ispod je jednostavan isječak koda koji prikazuje Ceil funkciju:
|
1 |
$total_pages=ceil($total_records/$per_page); |
Sada ćemo dodati kod za paginaciju. Da biste omogućili paginaciju i dodali navigacijske poveznice, otvorite datoteku /var/www/html/pagination_test.php pomoću naredbe u nastavku:
|
1 |
$ sudo nano /var/www/html/pagination_test.php |
Zatim zamijenite sadržaj ove datoteke s kodom u nastavku:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
<?php try { $pdo = new PDO("mysql:host=localhost;dbname=test_db", "test_user", "PASSWORD"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); /* Početak informacija o straničenju */ $page = 1; if (isset($_GET['page'])) { $page = filter_var($_GET['page'], FILTER_SANITIZE_NUMBER_INT); } $per_page = 3; $sqlcount = "select count(*) as total_records from products"; $stmt = $pdo->prepare($sqlcount); $stmt->execute(); $row = $stmt->fetch(); $total_records = $row['total_records']; $total_pages = ceil($total_records / $per_page); $offset = ($page-1) * $per_page; /* Kraj informacija o straničenju */ $sql = "select * from products limit :offset, :per_page"; $stmt = $pdo->prepare($sql); $stmt->execute(['offset'=>$offset, 'per_page'=>$per_page]); echo "<table border='1' align='center'>"; while ( ($row = $stmt->fetch(PDO::FETCH_ASSOC) ) !== false) { echo "<tr>"; echo "<td>".$row['product_id']."</td>"; echo "<td>".$row['product_name']."</td>"; echo "</tr>"; } echo "</table>"; /* Početak navigacije */ echo "<table border='1' align='center'>"; echo "<tr>"; if ($page-1 >= 1) { echo "<td><a href=".$_SERVER['PHP_SELF']."?page=".($page - 1).">Prethodna</a></td>"; } if ($page+1 <= $total_pages) { echo "<td><a href=".$_SERVER['PHP_SELF']."?page=".($page + 1).">Sljedeća</a></td>"; } echo "</tr>"; echo "</table>"; /* Kraj navigacije */ } catch(PDOException $e) { echo $e->getMessage(); } ?> |
Evo sažetka ovog koda:
-
Moramo čuvati informacije o stranici na kojoj se trenutno nalazimo. Za to koristimo $page varijablu. $page varijabla se koristi za izdvajanje stranice na kojoj se trenutno nalazimo pomoću $_GET[‘page’] varijable.
-
Zatim moramo odrediti koliko stavki prikazujemo na stranici. Za to koristimo $per_page varijabla. Ovdje prikazujemo samo tri proizvoda po stranici.
-
Kao što je gore opisano, moramo imati ukupan broj zapisa koji postoje u bazi podataka. To je potrebno kako bismo mogli odrediti ukupan broj stranica. $total_records varijabla sadrži ove informacije.
-
Naposljetku, moramo znati koliko zapisa treba preskočiti. Na primjer, ako smo na drugoj stranici, moramo preskočiti prva tri zapisa u bazi podataka. Koristimo $offset varijablu za pohranu ovih informacija. Ove informacije izračunavamo pri svakom učitavanju stranice pomoću formule $offset=($page-1)*$per_page. Ako trebate prikazati bilo koji drugi broj stavki, možete odrediti vrijednost u $per_page varijabli.
-
Za prikaz navigacijskih gumba koristimo donji kod:
|
1 2 3 4 5 6 7 8 9 10 |
. . . if( $page-1>=1) { echo "<td><a href=".$_SERVER['PHP_SELF']."?page=".($page-1).">Prethodno</a></td>"; } if( $page+1<=$total_pages) { echo "<td><a href=".$_SERVER['PHP_SELF']."?page=".($page+1).">Sljedeće</a></td>"; } . . . |
Logika je da se $page koristi za pohranu trenutne stranice. Ako želimo prikazati prethodnu opciju na stranici, skripta će oduzeti jedan od vrijednosti $page varijable. Ako je rezultat veći ili jednak jedan, na stranici se prikazuje prethodna opcija.
Slično tome, za prikaz sljedeće opcije, dodajemo jedan $page varijabli. Ovdje osiguravamo da rezultat zbrajanja ne smije premašiti ukupan broj stranica u $total_pages varijabli.
Nakon toga, vrijeme je za provjeru stranice. Otvorite preglednik i idite na stranicu pomoću URL-a koji ste prethodno koristili:
|
1 |
http://your_server_ip/pagination_test.php |
Vidjet ćete izlaz kao u nastavku:



Ovdje ste konačno implementirali paginaciju pomoću LIMIT klauzule MySQL-a u PHP skripti. Implementacijom paginacije u svojoj aplikaciji imat ćete bolji način navigacije kroz više zapisa.
Zaključak
U ovom smo vodiču pogledali kako implementirati paginaciju pomoću PHP-a i MySQL-a na Ubuntuu. Koristeći ove korake, možete izgraditi aplikacije koje mogu adekvatno prikazati veliki broj zapisa, podijeljenih po stranicama radi učinkovite manipulacije.
Osim toga, imamo još korisnih vodiča o PHP-u i MySQL-u na Ubuntuu:
- Instalacija i osiguravanje phpMyAdmin-a na Ubuntuu 18.04
- Kako resetirati root lozinku za MariaDB ili MySQL
- CloudSigma vodič: Kako postaviti MySQL na poslužitelj i osnove MySQL-a
Sretno s radom!
Komentari
Još nema komentara. Budite prvi.