Phân trang là một kỹ thuật quan trọng trong lập trình web giúp hiển thị dữ liệu theo từng trang nhỏ thay vì tải toàn bộ dữ liệu cùng một lúc. Điều này giúp cải thiện hiệu suất và trải nghiệm người dùng. Trong bài viết này, chúng ta sẽ tìm hiểu cách phân trang trong PHP kết hợp với MySQL và thực hiện một ví dụ minh họa.
1. Tại sao cần phân trang?
Khi làm việc với một lượng dữ liệu lớn từ cơ sở dữ liệu, nếu hiển thị tất cả bản ghi trên một trang duy nhất sẽ gây ra các vấn đề:
- Hiệu suất kém: Tải toàn bộ dữ liệu gây chậm trang web.
- Trải nghiệm người dùng kém: Người dùng phải cuộn quá nhiều để tìm thông tin mong muốn.
- Lãng phí tài nguyên server: Gây quá tải truy vấn và tốn nhiều bộ nhớ.
Do đó, phân trang giúp hiển thị dữ liệu theo từng trang nhỏ hơn, giúp tối ưu hiệu suất và cải thiện trải nghiệm.
2. Cách thức hoạt động của phân trang trong PHP và MySQL
Phân trang thường được thực hiện bằng cách sử dụng câu lệnh LIMIT và OFFSET trong MySQL. Cấu trúc chung của truy vấn phân trang như sau:
SELECT * FROM ten_bang LIMIT so_ban_ghi OFFSET vi_tri_bat_dau;Trong đó:
LIMITxác định số bản ghi hiển thị trên một trang.OFFSETchỉ định vị trí bắt đầu của bản ghi cần lấy.
Công thức tính OFFSET:
$offset = ($current_page - 1) * $records_per_page;3. Ví dụ phân trang với PHP và MySQL
a) Tạo cơ sở dữ liệu và bảng mẫu
Chúng ta tạo một bảng products để làm ví dụ:
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
price DECIMAL(10,2) NOT NULL
);Chèn dữ liệu mẫu:
INSERT INTO products (name, price) VALUES
('Sản phẩm 1', 100.00),
('Sản phẩm 2', 150.00),
('Sản phẩm 3', 200.00),
('Sản phẩm 4', 250.00),
('Sản phẩm 5', 300.00);b) Viết mã PHP để hiển thị dữ liệu có phân trang
Kết nối CSDL
$servername = "localhost";
$username = "root";
$password = "";
$database = "pagination_db";
$conn = new mysqli($servername, $username, $password, $database);
if ($conn->connect_error) {
die("Kết nối thất bại: " . $conn->connect_error);
}Lấy dữ liệu theo phân trang
$records_per_page = 2;
$current_page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$offset = ($current_page - 1) * $records_per_page;
$sql = "SELECT * FROM products LIMIT $records_per_page OFFSET $offset";
$result = $conn->query($sql);Hiển thị dữ liệu
while ($row = $result->fetch_assoc()) {
echo "<p>{$row['name']} - Giá: {$row['price']} VND</p>";
}
Tạo liên kết phân trang
$total_records_query = "SELECT COUNT(*) AS total FROM products";
$total_records_result = $conn->query($total_records_query);
$total_records = $total_records_result->fetch_assoc()['total'];
$total_pages = ceil($total_records / $records_per_page);
for ($i = 1; $i <= $total_pages; $i++) {
echo "<a href='?page=$i'>$i</a> ";
}c) Kết quả

Ví dụ trên sẽ hiển thị danh sách sản phẩm với liên kết phân trang. Khi người dùng nhấp vào số trang, trang web sẽ tải dữ liệu tương ứng.

Download ví dụ: pagination-basic.rar
4. Một số cải tiến phân trang
- Thêm nút "Trang trước" và "Trang sau" để dễ dàng di chuyển giữa các trang.
- Sử dụng AJAX để tải dữ liệu mà không cần tải lại trang.
- Tùy chỉnh số lượng bản ghi hiển thị trên mỗi trang bằng cách cho phép người dùng chọn số lượng bản ghi.
- Tạo thanh điều hướng phân trang đẹp hơn bằng CSS hoặc thư viện Bootstrap.
5. Kết luận
Phân trang trong PHP và MySQL là một kỹ thuật quan trọng giúp cải thiện hiệu suất và trải nghiệm người dùng khi làm việc với dữ liệu lớn. Bằng cách sử dụng LIMIT và OFFSET, chúng ta có thể dễ dàng hiển thị dữ liệu theo từng trang nhỏ. Ngoài ra, có nhiều cách để tối ưu phân trang như thêm AJAX hoặc tùy chỉnh hiển thị.
Bài viết này được đăng trên codetuthub.com để giúp bạn hiểu rõ hơn về kỹ thuật phân trang với PHP và MySQL. Hy vọng bạn có thể áp dụng thành công vào dự án của mình!








