Phân trang trong PHP là gì? 4 bước code phân trang PHP đơn giản 2021

By 06/07/2021Tháng Bảy 17th, 2021KIẾN THỨC LẬP TRÌNH, PHP

PHP chủ yếu được sử dụng để lưu trữ và hiển thị dữ liệu từ cơ sở dữ liệu. Việc phân trang PHP giúp phân chia danh sách thành nhiều trang.

Điều này giúp cho giao diện web trở nên gọn gàng và dễ nhìn hơn. Hãy cùng tôi tìm hiểu kỹ hơn về phân trang PHP (Pagination PHP) thông qua các ví dụ minh họa nhé.

1. Phân trang PHP là gì?

Phân trang là việc hiển thị dữ liệu trên nhiều trang thay vì đặt tất cả chúng lên một trang duy nhất.

Phân trang còn giúp phân chia các bản ghi thành nhiều trang. Nhờ đó, người dùng sẽ dễ đọc và dễ hiểu các dữ liệu trên website.

Phân trang PHP là công việc của các developer PHP.  Các developer thực hiện công việc phân trang bằng cách sử dụng mệnh đề LIMIT trong MySQL. Mệnh đề này có hai đối số.

Đối số đầu tiên là OFFSET và đối số thứ hai là số bản ghi sẽ được trả về từ cơ sở dữ liệu.

2. 4 bước phân trang bằng PHP và MySQL

Để thực hiện phân trang trong PHP, bạn cần phải có một Dataset (tập dữ liệu). Chính vì thế, trước tiên, bạn cần tạo ra một cơ sở dữ liệu và bảng.

Tiếp theo, thêm các bản ghi vào bảng này và bắt đầu viết code để thực hiện phân trang. Để dữ liệu được nạp từ cơ sở dữ liệu có thể được chia thành nhiều trang.

Trong bài viết này, tôi sẽ giới thiệu 2 ví dụ về phân trang PHP Pagination.

Ví dụ đầu tiên khá cơ bản và đơn giản, phân trang mà không cần CSS (Cascading Style Sheet – tập tin định kiểu theo tầng).

Trong khi đó, ở ví dụ thứ 2, tôi sẽ sử dụng CSS và bootstrap để tạo phân trang.

Dưới đây là trình tự 4 bước để thực hiện phân trang trong PHP:

  1. Tạo cơ sở dữ liệu và bảng. Thêm danh sách các bản ghi vào bảng.
  2. Kết nối với cơ sở dữ liệu MySQL.
  3. Tạo liên kết phân trang để chia nhỏ dữ liệu trên nhiều trang và thêm chúng vào cuối bảng.
  4. Nạp dữ liệu từ cơ sở dữ liệu và hiển thị nó trên nhiều trang.

3. Ví dụ 1 về phân trang trong PHP

Đoạn mã dưới đây là một ví dụ khá đơn giản về code phân trang PHP với sự hỗ trợ của cơ sở dữ liệu MySQL.

Nó chia nhỏ dữ liệu được nạp từ cơ sở dữ liệu thành nhiều trang. Trong ví dụ này, tôi đã tạo phân trang cho bảng chữ cái để chúng hiển thị trên nhiều trang.

Tạo cơ sở dữ liệu

Trước tiên, tôi tạo một cơ sở dữ liệu được đặt tên pagination và một bảng bên trong nó có tên alphabet. Tạo thuộc tính theo tên idalphabet, đồng thời cung cấp dữ liệu vào bảng.

Tạo cơ sở dữ liệu

Kết nối cơ sở dữ liệu

Bước tiếp theo là kết nối tệp PHP với cơ sở dữ liệu. Nhờ đó, dữ liệu được lưu trữ trong cơ sở dữ liệu sẽ được hiển thị lên trang web. Kết nối cơ sở dữ liệu trong tệp PHP để hiển thị dữ liệu lên trang web.

Bạn có thể viết mã kết nối cơ sở dữ liệu trong tệp đó hoặc để nó riêng biệt trong tệp khác và đưa nó vào tệp PHP được yêu cầu của bạn.

Mã kết nối cơ sở dữ liệu:

$conn = mysqli_connect(‘localhost’, ‘root’, ”);

if (! $conn) {

die(“Connection failed” . mysqli_connect_error());

}

else {

mysqli_select_db($conn, ‘pagination’);

}

Trong bài viết này, tôi sử dụng tiện ích mở rộng mysqli. Do đó, tất cả các truy vấn đều được viết theo định dạng mysqli.

Lấy số trang hiện tại

Đoạn code dưới đây xác định số thứ tự trang mà người dùng hiện đang truy cập. Đặc biệt, nếu nó không được hiển thị thì theo mặc định, số trang sẽ được cài đặt là 1.

if (!isset ($_GET[‘page’]) ) {

$page = 1;

} else {

$page = $_GET[‘page’];

}

Công thức phân trang

Để phân trang, bạn cần đặt giới hạn số bản ghi được hiển thị trên một trang. Ở đây, tôi cài đặt giới hạn kết quả trên mỗi trang là 10, và kết quả được hiển thị trên mỗi trang như sau:

Trang1 – A đến J (1-10)

Trang 2 – K đến T (11-20)

Trang3 – U đến Z (21-26)

$results_per_page = 10;

$page_first_result = ($page-1) * $results_per_page;

Nhận tổng số trang

$query = “select *from alphabet”;

$result = mysqli_query($conn, $query);

$number_of_result = mysqli_num_rows($result);

//determine the total number of pages available

$number_of_page = ceil ($number_of_result / $results_per_page);

Lấy dữ liệu và hiển thị trên trang web

Đoạn code dưới đây được sử dụng để truy xuất dữ liệu từ cơ sở dữ liệu và hiển thị lên trang web đã được phân chia tương ứng.

$query = “SELECT *FROM alphabet LIMIT ” . $page_first_result . ‘,’ . $results_per_page;

$result = mysqli_query($conn, $query);

//display the retrieved result on the webpage

while ($row = mysqli_fetch_array($result)) {

echo $row[‘id’] . ‘ ‘ . $row[‘alphabet’] . ‘</br>’;

}

Hiển thị liên kết của các trang trong URL

Sử dụng mã code này, URL của trang web sẽ thay đổi theo từng trang.

for($page = 1; $page<= $number_of_page; $page++) {

echo ‘<a href = “index2.php?page=’ . $page . ‘”>’ . $page . ‘ </a>’;

Thành quả

Và bước cuối cùng chính là để tất cả các đoạn code trên vào trong một tệp duy nhất.

Tệp: Index2.php

<html>

<head>

<title> Pagination </title>

</head>

<body>

<?php

//database connection

$conn = mysqli_connect(‘localhost’, ‘root’, ”);

if (! $conn) {

die(“Connection failed” . mysqli_connect_error());

}

else {

mysqli_select_db($conn, ‘pagination’);

}

//define total number of results you want per page

$results_per_page = 10;

//find the total number of results stored in the database

$query = “select *from alphabet”;

$result = mysqli_query($conn, $query);

$number_of_result = mysqli_num_rows($result);

//determine the total number of pages available

$number_of_page = ceil ($number_of_result / $results_per_page);

//determine which page number visitor is currently on

if (!isset ($_GET[‘page’]) ) {

$page = 1;

} else {

$page = $_GET[‘page’];

}

//determine the sql LIMIT starting number for the results on the displaying page

$page_first_result = ($page-1) * $results_per_page;

//retrieve the selected results from database

$query = “SELECT *FROM alphabet LIMIT ” . $page_first_result . ‘,’ . $results_per_page;

$result = mysqli_query($conn, $query);

//display the retrieved result on the webpage

while ($row = mysqli_fetch_array($result)) {

echo $row[‘id’] . ‘ ‘ . $row[‘alphabet’] . ‘</br>’;

}

//display the link of the pages in URL

for($page = 1; $page<= $number_of_page; $page++) {

echo ‘<a href = “index2.php?page=’ . $page . ‘”>’ . $page . ‘ </a>’;

}

?>

</body>

</html>

Kết quả:

Dưới đây chính là kết quả của ví dụ phân trang ở trên

php pagination

Kết quả sau khi phân trang trong PHP

4. Ví dụ 2 về code phân trang PHP

Dưới đây là một ví dụ khác về việc phân trang. Tuy nhiên, ở đây, tôi sử dụng CSS cùng với HTML để làm cho chế độ xem trang web trở nên thu hút hơn. CSS làm cho trang web trở nên sống động và hấp dẫn hơn.

Mặt khác, MySQL lưu trữ dữ liệu trong cơ sở dữ liệu. Chính vì thế, thông qua ví dụ này, bạn có thể học thêm được nhiều kiến thức hơn, ngoài phân trang PHP.

Tôi sẽ viết toàn bộ đoạn code trong một tệp duy nhất ngoại trừ kết nối cơ sở dữ liệu. Chính vì thế, tôi sẽ tạo 2 tệp, một tệp là connection.php và tệp còn lại là index1.php. Lưu cả 2 tệp này trong phần trong phần mở rộng .php.

Thông qua ví dụ này, bạn sẽ học được cách tạo phân trang trở nên sáng tạo và hấp dẫn hơn.

  • php: Được tạo để kết nối cơ sở dữ liệu
  • php: Được tạo để phân trang

Tệp: connection.php

<?php

$conn = mysqli_connect(‘localhost’, ‘root’, ”);

if (! $conn) {

die(“Connection failed” . mysqli_connect_error());

}

else {

mysqli_select_db($conn, ‘pagination’);

}

?>

Tệp: index1.php

<html>

<head>

<title>Pagination</title>

<link rel=”stylesheet”

href=”https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css”>

<style>

table {

border-collapse: collapse;

}

.inline{

display: inline-block;

float: right;

margin: 20px 0px;

}

input, button{

height: 34px;

}

.pagination {

display: inline-block;

}

.pagination a {

font-weight:bold;

font-size:18px;

color: black;

float: left;

padding: 8px 16px;

text-decoration: none;

border:1px solid black;

}

.pagination a.active {

background-color: pink;

}

.pagination a:hover:not(.active) {

background-color: skyblue;

}

</style>

</head>

<body>

<center>

<?php

// Import the file where we defined the connection to Database.

require_once “connection.php”;

$per_page_record = 4;  // Number of entries to show in a page.

// Look for a GET variable page if not found default is 1.

if (isset($_GET[“page”])) {

$page  = $_GET[“page”];

}

else {

$page=1;

}

$start_from = ($page-1) * $per_page_record;

$query = “SELECT * FROM student LIMIT $start_from, $per_page_record”;

$rs_result = mysqli_query ($conn, $query);

?>

<div class=”container”>

<br>

<div>

<h1>Pagination Simple Example</h1>

<p>This page demonstrates the basic

Pagination using PHP and MySQL.

</p>

<table class=”table table-striped table-condensed

table-bordered”>

<thead>

<tr>

<th width=”10%”>ID</th>

<th>Name</th>

<th>College</th>

<th>Score</th>

</tr>

</thead>

<tbody>

<?php

while ($row = mysqli_fetch_array($rs_result)) {

// Display each field of the records.

?>

<tr>

<td><?php echo $row[“Rank”]; ?></td>

<td><?php echo $row[“Name”]; ?></td>

<td><?php echo $row[“College”]; ?></td>

<td><?php echo $row[“Score”]; ?></td>

</tr>

<?php

};

?>

</tbody>

</table>

<div class=”pagination”>

<?php

$query = “SELECT COUNT(*) FROM student”;

$rs_result = mysqli_query($conn, $query);

$row = mysqli_fetch_row($rs_result);

$total_records = $row[0];

echo “</br>”;

// Number of pages required.

$total_pages = ceil($total_records / $per_page_record);

$pagLink = “”;

if($page>=2){

echo “<a href=’index1.php?page=”.($page-1).”‘>  Prev </a>”;

}

for ($i=1; $i<=$total_pages; $i++) {

if ($i == $page) {

$pagLink .= “<a class = ‘active’ href=’index1.php?page=”

.$i.”‘>”.$i.” </a>”;

}

else  {

$pagLink .= “<a href=’index1.php?page=”.$i.”‘>

“.$i.” </a>”;

}

};

echo $pagLink;

if($page<$total_pages){

echo “<a href=’index1.php?page=”.($page+1).”‘>  Next </a>”;

}

?>

</div>

<div class=”inline”>

<input id=”page” type=”number” min=”1″ max=”<?php echo $total_pages?>”

placeholder=”<?php echo $page.”/”.$total_pages; ?>” required>

<button onClick=”go2Page();”>Go</button>

</div>

</div>

</div>

</center>

<script>

function go2Page()

{

var page = document.getElementById(“page”).value;

page = ((page><?php echo $total_pages; ?>)?<?php echo $total_pages; ?>:((page<1)?1:page));

window.location.href = ‘index1.php?page=’+page;

}

</script>

</body>

</html>

Kết quả:

Dưới đây là kết quả của ví dụ phân trang này:

pagination php

Kết quả sau khi phân trang Pagination PHP

Lưu ý, đoạn code được viết trong thẻ <style> được sử dụng để tạo kiểu và giúp giao diện trở nên hấp dẫn hơn cho bảng và phân trang hiển thị trong trang web đó. Tôi cũng đã từng sử dụng bootstrap để thực hiện điều này.

Giải thích mã

Và bây giờ, tôi sẽ giải thích chi tiết các đoạn code được sử dụng trong ví dụ này để tạo phân trang.

Tạo cơ sở dữ liệu

Trước tiên, tạo một cơ sở dữ liệu có tên là pagination và một bảng bên trong nó có tên là student. Tạo thuộc tính có tên là Rank, Name, College, và Score và cung cấp ít nhất 25 bản ghi vào bảng.

code phân trang php

Kết quả PHP Pagination

Kết nối cơ sở dữ liệu

Nhiệm vụ tiếp theo chính là kết nối tệp PHP với cơ sở dữ liệu. Trong ví dụ này, tôi đã sử dụng tiện ích mở rộng mysqli. Do đó, tất cả các truy vấn đều được viết theo định dạng mysqli.

Bạn có thể viết đoạn mã kết nối cơ sở dữ liệu trong tệp đó hoặc viết trong một tệp khác và đưa nó vào tệp PHP được yêu cầu.

Đoạn mã để kết nối cơ sở dữ liệu.

$conn = mysqli_connect(‘localhost’, ‘root’, ”);

if (! $conn) {

die(“Connection failed” . mysqli_connect_error());

}

else {

mysqli_select_db($conn, ‘pagination’);

}

Tìm nạp dữ liệu và hiển thị trên trang web

Khi đã tạo xong dataset, tôi cần nạp và hiển thị nó trên nhiều trang web. Đoạn code dưới đây được sử dụng để lấy dữ liệu từ cơ sở dữ liệu và hiển thị lên các trang web được phân chia tương ứng.

Tìm nạp dữ liệu

Sau khi thiết lập kết nối dữ liệu trong tệp “connection.php”, tôi cần nhập nó vào đoạn code bằng cách sử dụng từ khóa request_once. Tôi sẽ xác định rõ ràng số lượng bản ghi hiển thị trên mỗi trang.

require_once “connection.php”;

$per_page_record = 4;  // Number of entries to show in a page.

// Look for a GET variable page if not found default is 1.

if (isset($_GET[“page”])) {

$page  = $_GET[“page”];

}

else {

$page=1;

}

//determine the sql LIMIT starting number for the results on the displaying page

$start_from = ($page-1) * $per_page_record;

$query = “SELECT * FROM student LIMIT $start_from, $per_page_record”;

$rs_result = mysqli_query ($conn, $query);

Hiển thị dữ liệu

Tôi sử dụng vòng lặp trong các bản ghi mà tôi đã tìm nạp và hiển thị mỗi bản ghi được lưu trữ trong các cột trong bảng.

<?php

while ($row = mysqli_fetch_array($rs_result)) {

// Display each field of the records.

?>

<tr>

<td><?php echo $row[“Rank”]; ?></td>

<td><?php echo $row[“Name”]; ?></td>

<td><?php echo $row[“College”]; ?></td>

<td><?php echo $row[“Score”]; ?></td>

</tr>

<?php

};

?>

Tạo liên kết phân trang

Đoạn mã quan trọng nhất chính là tạo liên kết phân trang. Do đó, tôi sẽ tạo ra Previous, Next, và các liên kết số và thêm chúng vào cuối bảng.

if($page>=2) {

echo “<a href=’index1.php?page=”.($page-1).”‘>  Prev </a>”;

}

for ($i=1; $i<=$total_pages; $i++) {

if ($i == $page) {

$pagLink .= “<a class = ‘active’ href=’index1.php?page=”

.$i.”‘>”.$i.” </a>”;

}

else  {

$pagLink .= “<a href=’index1.php?page=”.$i.”‘>

“.$i.” </a>”;

}

};

echo $pagLink;

if($page<$total_pages){

echo “<a href=’index1.php?page=”.($page+1).”‘>  Next </a>”;

}

Nếu không sử dụng CSS, kết quả của việc phân trang PHP sẽ tương tự như hình dưới đây (ở ví dụ 1)

kết quả của việc phân trang PHP

Kết quả của việc phân trang PHP

Sau khi đưa mã CSS vào tập index1.php, kết quả của việc phân trang trong PHP sẽ tương tự như hình dưới đây.  Trong ví dụ 1, tôi đã tạo phân trang đơn giản và đúng về mặt lý thuyết, nhưng nhìn không hấp dẫn lắm.

code phân trang trong php

Kết quả của PHP pagination sau khi thêm mã CSS

5. Ưu điểm của Phân trang PHP

Dưới đây là 3 ưu điểm lớn nhất của PHP pagination:

  • Phân trang mang lại nhiều lợi ích cho các dự án có quy mô lớn. Bởi vì, nó làm cho website trở nên chuyên nghiệp hơn. Bên cạnh đó, còn giúp website làm việc nhanh, chính xác và hiệu quả hơn
  • Nhờ phân trang, bạn có thể cải thiện tốc độ tải của một trang bằng cách chia dữ liệu ra thành nhiều trang. Bởi vì, website của bạn không cần phải tải quá nhiều thông tin cùng một lúc.

Ví dụ, nếu trang của bạn có 1000 hình ảnh thì tất nhiên thời gian tải sẽ lâu hơn khi chỉ chứa 50 hình ảnh. Bởi vì hàng ngàn hình ảnh thì sẽ cần hàng ngàn HTTP requests, thậm chí, điều này sẽ khiến trang của bạn không phản hồi.

Sự cố này sẽ được giải quyết bằng cách giới hạn số lượng dữ liệu. Để làm được điều này, bạn cần sử dụng mệnh đề LIMIT khi thực hiện phân trang.

  • Sử dụng phân trang giúp cải thiện trải nghiệm người dùng, doanh thu quảng cáo và tăng tốc độ tải trang.

6. Nhược điểm của Phân trang trong PHP

Mặc dù phân trang PHP mang lại những ưu điểm nhất định nhưng nhiều developer vẫn tránh sử dụng nó. Bởi nó còn tồn tại một số hạn chế như sau:

  • Một trong những nhược điểm lớn nhất của phân trang trong PHP chính là bản thân các trang được phân trang phải “cạnh tranh lẫn nhau”. Bởi vì chúng đều có chung các đặc điểm bên ngoài như cấu trúc, kiểu trình bày và logic. Do đó, có thể xảy ra trường hợp một tập dữ liệu nhỏ có thể bị bỏ qua.
  • Phân trang có thể làm giảm thứ hạng của trang trên công cụ tìm kiếm. Bởi vì khi một trang càng ở xa trang chủ thì người dùng cần nhấp chuột nhiều lần mới có thể truy cập vào nó. Những trang như vậy thường không được xếp hạng cao.
  • Phân trang cũng làm giới hạn số lượng liên kết, lượt chia sẻ trên các trang mạng xã hội, tổng số kết quả hiển thị trên trang web, anchor text mà trang nhận được khi thông tin bị chia nhỏ ra thành nhiều trang.

Kết luận

Hy vọng qua 2 ví dụ minh họa trên đây, bạn đã có thể hiểu hơn về phân trang PHP cũng như những ưu, nhược điểm của nó.

Nếu bạn muốn tìm hiểu thêm về phân trang PHP, hãy đăng ký ngay 1 khóa học PHP online Ironhack Việt Nam để được hướng dẫn chi tiết cũng như được trực tiếp thực hành nhé!

Để lại một câu trả lời