Bevezetés
Lapozás egy fontos fogalom az adatvezérelt alkalmazások építésében. Amikor rekordokat kérdezünk le az adatbázisból, nagy számú rekordot kaphatunk vissza. Például, ha aktív felhasználókra vagy egy adott helyhez tartozó felhasználókra futtatunk le egy lekérdezést, akár több száz vagy több ezer felhasználó is visszatérhet. Ennek a hatalmas mennyiségű rekordnak a megjelenítése egyetlen weboldalon nem felhasználóbarát megoldás, mivel túlterhelheti a felhasználót, valamint tönkreteheti a felhasználói élmény gördülékenységét.
Ezért előnyösebb megoldás a rekordok számának korlátozása. Ez a lapozás fogalma. Más szóval, a rekordok számát oldalakra osztjuk, majd megjelenítjük az oldalt. Egyetlen oldalon tíz, tizenöt vagy bármilyen más ésszerű mennyiségű rekord szerepelhet, amely megjeleníthető a felhasználói felületen.
Bár a lapozás javíthatja az alkalmazás általános felhasználói élményét, gyorsabbá is teheti az alkalmazást, mivel kevesebb rekordot kell lekérnünk. Ezáltal kevesebb adat továbbítódik a hálózaton a kliens és a szerver között, ami csökkenti a késleltetési időt.
Ebben az útmutatóban egy olyan PHP kódot fogunk készíteni, amely csatlakozik az adatbázishoz, és megvalósítjuk a lapozást a MySQL adatbázis és annak LIMIT záradéka segítségével.
Előfeltételek
Az útmutató követéséhez a következőkre lesz szüksége:
-
Az Ubuntu legújabb verziója, telepítve és futva. Kövesse a Hogyan állítsa be Ubuntu szerverét útmutatót ha segítségre van szüksége.
-
Szüksége lesz a PHP és a MySQL telepítésére is. A PHP és a MySQL beállításához van egy útmutatónk: LAMP Stack setup – Linux Apache MySQL PHP.
1. lépés — Adatbázis-felhasználó és tesztadatbázis beállítása
Ebben az útmutatóban létrehozzuk az adatbázis-kapcsolatot a MySQL adatbázissal, és lekérjük a rekordokat. Ezek a rekordok egy HTML oldalon fognak megjelenni egy táblázat (table) elemben. A kapcsolat létrehozásához és a rekordok megjelenítéséhez egy PHP szkriptet fogunk használni. Amint készen vagyunk az adatbázis-kapcsolattal, tesztelni fogjuk az alkalmazásunkat lapozással és lapozás nélkül is. Az így történő tesztelés lehetővé teszi számunkra, hogy megértsük, hogyan működik a lapozás a gyakorlatban.
A MySQL adatbázishoz való csatlakozáshoz szükségünk lesz egy minta MySQL adatbázisra és a felhasználó hitelesítési adataira a MySQL adatbázishoz való csatlakozáshoz. Ebben a lépésben létrehoz egy nem-root felhasználót a MySQL adatbázisához, egy mintaadatbázist és egy táblát a PHP szkript teszteléséhez.
Először jelentkezzen be a szerverére. Ezután jelentkezzen be a MySQL szerverre az alábbi paranccsal:
|
1 |
mysql> sudo mysql -u root -p |
A rendszer kérni fogja a root felhasználó jelszavát. Írja be a jelszót, majd nyomja meg az Enter billentyűt a továbblépéshez. Ezután hozzon létre egy mintaadatbázist, melynek neve test_db, amelyet az útmutatóban fogunk használni. Új adatbázis létrehozásához futtassa az alábbi parancsot:
|
1 |
mysql> Create database test_db; |
A MySQL szerver kimenetén látható lesz, hogy egy sor módosult. Ezután létre kell hoznunk egy új felhasználót ehhez az adatbázishoz. Ennek a felhasználónak minden jogosultságot megadunk. Gyakorlati alkalmazásoknál azonban ügyeljen a jogosultságok korlátozására. A felhasználónkat test_user-nek fogjuk hívni. Az alábbi parancsban cserélje ki a PASSWORD részt egy erős jelszóra:
|
1 |
mysql> GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD'; |
Miután a felhasználó létrejött, frissítse a jogosultságokat:
|
1 |
mysql> FLUSH PRIVILEGES; |
Most, hogy mind a(z) test_user, mind a(z) test_db készen áll, használja a test_db adatbázist táblák létrehozásához. A(z) test_db adatbázisra való váltáshoz futtassa az alábbi parancsot:
|
1 |
mysql> Use test_db; |
Amint a kimenetben látjuk, hogy az adatbázis megváltozott, készen állunk a táblánk létrehozására. Létrehozunk egy új táblát Products néven a termékek tárolására. Céljainknak megfelelően ebben a táblában csak két oszlopra lesz szükségünk: product_id és product_name. A product_id-t AUTO_INCREMENT-re állítjuk, így az értéke minden alkalommal növekedni fog, amikor új terméket adunk hozzá. A másik, product_name nevű oszlop a termék nevének tárolására szolgál majd. A product_name oszlop segítségével különböztetjük meg az egyes termékeket név alapján:
|
1 |
mysql> Create table products (product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50) NOT NULL ) Engine = InnoDB; |
Most hozzáadunk néhány terméket ehhez az újonnan létrehozott táblához. Ehhez futtassa az alábbi parancsokat:
|
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'); |
Annak ellenőrzésére, hogy ezek a termékek bekerültek-e a táblába, futtassa az alábbi parancsot:
|
1 |
mysql> select * from products; |
Ha látja a fent megadott termékeket, készen áll a továbblépésre. Lépjen ki a MySQL adatbázisból az alábbi paranccsal:
|
1 |
mysql> quit; |
Most, hogy beállítottuk a MySQL adatbázist és megadtuk a tesztadatokat, készen állunk a PHP szkript megírására, amely csatlakozik ehhez az adatbázishoz és lekéri a rekordokat.
2. lépés – Rekordok lekérése és megjelenítése lapozás nélkül
Ahogy fentebb megbeszéltük, először lapozás nélkül jelenítjük meg a rekordokat. Készítünk egy PHP szkriptet, amely csatlakozik a MySQL adatbázishoz és lekéri a rekordokat. Csatlakozni fogunk a fent létrehozott test_db adatbázishoz a test_user felhasználóval, és lekérjük a rekordokat.
A products táblánkban jelenleg mindössze tíz rekord található. Sok felhasználó számára talán nem nyilvánvaló, hogy szükség van-e a lapozásra vagy sem. Az alkalmazás lapozás nélküli tesztelése azonban rávilágít arra, hogyan segíti az az alkalmazás általános élményét. Azt is megértjük majd, hogyan segít az adatok felosztása a jobb felhasználói élmény kialakításában, és hogyan csökkenti a szerver terhelését.
A PHP szerverén, a webhely mappájának dokumentumgyökerében futtassa az alábbi parancsot:
sudo nano /var/www/html/pagination_test.php
Most adja hozzá az alábbi tartalmat ehhez a fájlhoz. Ügyeljen arra, hogy a PASSWORD részt helyettesítse a következő felhasználó jelszavával: 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(); } ?> |
Mentse el a fájlt. Mielőtt továbblépnénk, összefoglaljuk, mit csináltunk fent:
-
Először csatlakoztunk a MySQL adatbázishoz, és ehhez a PHP Data Object (PDO) könyvtárat használtuk. A MySQL adatbázishoz való csatlakozáshoz a fent használt MySQL felhasználó hitelesítő adatait használtuk. A PDO egy rendkívül hasznos könyvtár, amelyet az adatbázishoz való csatlakozásra használnak. Megkönnyíti az adathozzáférési réteg kódolását, és lehetővé teszi a különböző adatbázisokhoz való csatlakozást az alkalmazás jelentős átírása nélkül. A PDO előkészített utasításokat használ, ami biztosítja, hogy a biztonság ne sérüljön. Így a lekérdezések végrehajtása biztonságosan történik.
-
Ezután a PDO API-t használtuk a select * from products utasítás végrehajtásához. A $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false) biztosítja, hogy a PHP-ban lévő adattípusok megegyezzenek az adatbázisban lévőkkel. Így a product_id és a product_name rendre egész számként és karakterláncként jelennek meg.
-
A $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); arra utasítja a PDO-t, hogy hiba esetén kivételt dobjon. Ezáltal könnyen elkaphatjuk a kivételt a try … catch blokkban, és szükség szerint kezelhetjük azt.
Most, hogy a szkriptünk készen áll, futtatnunk kell azt. Ehhez nyissa meg a böngészőjét, és látogasson el a következő URL-re: /var/www/html/pagination_test.php. Győződjön meg róla, hogy az URL-hez hozzáfűzi a szervere IP-címét. Ha helyben futtatja, az URL a következő lesz: http://localhost/var/www/html/pagination_test.php.
A következő kimenetet fogja látni:

Itt a termékeink lekérésre kerülnek és megjelennek az oldalon. Most képzelje el, ha több száz termékünk lenne. Ez egy hosszú ciklust eredményezne az adatok lekéréséhez és az oldalon való megjelenítéséhez. Ez növelné az oldal betöltési idejét.
A következő részben módosítani fogjuk a PHP szkriptet, és beillesztjük a MySQL LIMIT záradékot. Ez megoldja a nagy számú rekord megjelenítésének problémáját. Hozzáadjuk az oldalszámozási linkeket, hogy a felhasználó navigálhasson az oldalak között.
3. lépés – Oldalszámozás beállítása PHP használatával
Ebben a lépésben beállítjuk az oldalszámozást PHP használatával, hogy az adatokat több táblázat segítségével jelenítsük meg. Az oldalszámozás megvalósításához módosítani fogjuk az előző lépésben megírt szkriptet.
A MySQL adatbázis LIMIT záradékát fogjuk használni. Mielőtt ezt hozzáadnánk a szkripthez, lássunk egy példát a MySQL LIMIT szintaxisára:
|
1 |
mysql> Select [column1, column2, column n...] from [table name] LIMIT offset, records; |
A fenti utasításban láthatjuk, hogy a LIMIT záradéknak offset és records argumentumai vannak. offset megadja, hogy hány rekordot kell kihagyni, és a records megadja az oldalonként megjelenítendő vagy az adatbázisból lekérdezendő rekordok maximális számát.
Most, hogy már tudjuk, hogyan működik az oldalszámozás, nézzük meg, hogyan fogjuk megvalósítani. Oldalanként három rekordot fogunk megjeleníteni. Tehát, ha tíz rekord van az adatbázisunkban, akkor négy oldalunk lesz, ha a rekordok teljes számát elosztjuk az oldalankénti rekordok számával. Mivel az eredmény nem biztos, hogy egész szám lesz, a PHP Ceil függvényét fogjuk használni, hogy a legközelebbi egész számra kerekítsünk az egész számú eredmény eléréséhez. Alább látható egy egyszerű kódrészlet a Ceil függvény bemutatására:
|
1 |
$total_pages=ceil($total_records/$per_page); |
Most hozzáadjuk az oldalszámozáshoz szükséges kódot. Az oldalszámozás engedélyezéséhez és a navigációs linkek hozzáadásához nyissa meg a /var/www/html/pagination_test.php fájlt az alábbi paranccsal:
|
1 |
$ sudo nano /var/www/html/pagination_test.php |
Ezután cserélje ki a fájl tartalmát az alábbi kódra:
|
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", "JELSZÓ"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); /* Lapozási információk kezdete */ $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; /* Lapozási információk vége */ $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>"; /* Navigáció kezdete */ echo "<table border='1' align='center'>"; echo "<tr>"; if ($page-1 >= 1) { echo "<td><a href=".$_SERVER['PHP_SELF']."?page=".($page - 1).">Előző</a></td>"; } if ($page+1 <= $total_pages) { echo "<td><a href=".$_SERVER['PHP_SELF']."?page=".($page + 1).">Következő</a></td>"; } echo "</tr>"; echo "</table>"; /* Navigáció vége */ } catch(PDOException $e) { echo $e->getMessage(); } ?> |
Íme a kód összefoglalása:
-
Tárolnunk kell az információt arról az oldalról, amelyen éppen állunk. Ehhez a $page változót használjuk. A $page változót használjuk arra, hogy kinyerjük az aktuális oldalt a $_GET[‘page’] változó segítségével.
-
Ezután meg kell határoznunk, hogy hány elemet jelenítünk meg egy oldalon. Ehhez a $per_page változó. Itt oldalanként csak három terméket jelenítünk meg.
-
Ahogy fentebb megbeszéltük, szükségünk van az adatbázisban lévő rekordok teljes számára. Ez azért szükséges, hogy meg tudjuk határozni az oldalak teljes számát. A $total_records változó tárolja ezt az információt.
-
Végül tudnunk kell, hány rekordot kell kihagyni. Például, ha a második oldalon vagyunk, ki kell hagynunk az adatbázis első három rekordját. Az $offset változót használjuk ennek az információnak a tárolására. Ezt az információt minden oldalbetöltéskor kiszámítottuk a következő képlet segítségével: $offset=($page-1)*$per_page. Ha bármilyen más számú elemet szeretne megjeleníteni, megadhatja az értéket a $per_page változóban.
-
A navigációs gombok megjelenítéséhez az alábbi kódot használjuk:
|
1 2 3 4 5 6 7 8 9 10 |
. . . if( $page-1>=1) { echo "<td><a href=".$_SERVER['PHP_SELF']."?page=".($page-1).">Előző</a></td>"; } if( $page+1<=$total_pages) { echo "<td><a href=".$_SERVER['PHP_SELF']."?page=".($page+1).">Következő</a></td>"; } . . . |
A logika az, hogy a $page az aktuális oldal tárolására szolgál. Ha meg akarjuk jeleníteni az előző opciót az oldalon, a szkript kivon egyet a $page változó értékéből. Ha az eredmény nagyobb vagy egyenlő, mint egy, az előző opció megjelenik az oldalon.
Hasonlóképpen, a következő opció megjelenítéséhez hozzáadunk egyet a $page változóhoz. Itt biztosítjuk, hogy az összeadás eredménye ne haladja meg az oldalak teljes számát a $total_pages változóban.
Ezután ideje ellenőrizni az oldalt. Nyissa meg a böngészőt, és keresse fel az oldalt a korábban használt URL-címmel:
|
1 |
http://your_server_ip/pagination_test.php |
Az alábbi kimenetet fogja látni:



Itt végre implementálta a lapozást a PHP szkriptben a MySQL LIMIT záradékának használatával. A lapozás alkalmazásában történő megvalósításával jobb módot kap a több rekord közötti navigálásra.
Összegzés
Ebben az útmutatóban megvizsgáltuk, hogyan lehet lapozást megvalósítani PHP és MySQL használatával Ubuntu rendszeren. Ezen lépések segítségével olyan alkalmazásokat építhet, amelyek megfelelően képesek megjeleníteni nagy számú rekordot, oldalakra osztva a hatékony kezelés érdekében.
Ezenkívül további hasznos útmutatóink is vannak a PHP és MySQL használatáról Ubuntu rendszeren:
- A phpMyAdmin telepítése és biztosítása Ubuntu 18.04 rendszeren
- Hogyan állítsuk vissza a MariaDB vagy MySQL root jelszót
- CloudSigma útmutató: Hogyan állítsuk be a MySQL-t egy szerveren és a MySQL alapjai
Kellemes számítógéphasználatot!
Hozzászólások
Még nincsenek hozzászólások. Legyen Ön az első.