[BÀI 24] CHỨC NĂNG PHÂN TRANG TRONG PHP

Tổng quan về phân trang:

Với các trang web có lượng dữ liệu lớn, cùng một lúc không thể select hết dữ liệu ra hiển thị được. Việc select tất cả ra làm cho trang web sẽ nặng nề,thậm chí bị sập. Do vậy kỹ thuật phân trang ra đời nhằm giải quyết vấn đề này. Tại một thời điểm,trên trang chỉ hiển thị một lượng bản ghi nhất định và được lập trình sẵn. Mỗi trang sẽ hiển thị các nội dung khác nhau, và người dùng dễ dàng nhấn chọn trang mà mình mong muốn, đến được trang có nội dung mà mình cần, rất nhanh chóng, dễ dàng và chính xác.

Chức năng phân trang được sử dụng rất phổ biến, điển hình dễ nhận ra nhất là các trang tin. Thuật toán sau sẽ mô tả và hướng dẫn các bạn phân trang để select nội dung ra một cách thuận lợi và đẹp mắt.

Ý tưởng của thuật toán phân trang:

Thuật toán phân trang được bắt nguồn từ lệnh limit trong sql nói chung (hay mysql nói riêng), khi dùng từ khóa limit trong câu truy vấn, tại một thời điểm trang web chỉ select tối đa số bản ghi không vượt quá limit (giới hạn được định sẵn).

Ví dụ: tôi có lệnh sql sau:

SELECT * FROM devpro.edu.vn limit 0,10

Lệnh này sẽ lấy các bản ghi, bản ghi bắt đầu là bản ghi số 0 và lấy tối đa 10 bản ghi.

Chẳng hạn trong bảng devpro.edu.vn của bạn có 50 bản ghi, và bạn muốn mỗi trang hiển thị 1o bản ghi.

Như vậy tương ứng bạn có 10 lệnh select sau:

SELECT * FROM devpro.edu.vn LIMIT 0,10

SELECT * FROM devpro.edu.vn LIMIT 10,10

SELECT * FROM devpro.edu.vn LIMIT 20,10

SELECT * FROM devpro.edu.vn LIMIT 30,10

SELECT * FROM devpro.edu.vn LIMIT 40,10

Bạn không thể viết hết 5 lệnh truy vấn một lúc được, có một phương pháp, bạn sẽ truyền biến “chọn trang” ($_GET[“trang”]) lên URL và sau đó kiểm tra giá trị của biến này bằng bao nhiêu và select dữ liệu cho hợp lý.

Chẳng hạn biến $_GET[“trang”] = 2; bạn sẽ thực thi truy vấn SELECT * FROM devpro.edu.vn LIMIT 10,10.

Cú pháp cơ bản của kỹ thuật phân trang:

SELECT * FROM devpro.edu.vn LIMIT $start,$limit

Cú pháp này sẽ lấy ra $limit bản ghi từ vị trí $start

Việc của bạn là xử lý 2 biến này một cách tự động, để không phải viết nhiều lần một lệnh select có cú pháp tương tự nhau.

Bắt đầu kỹ thuật phân trang:

Bước 1: Tạo database.

Giả sử tôi có một database có tên devpro, và trong bảng devpro có 1 bảng tên là khóa học để lưu danh sách các khóa học mà devpro đào tạo:

Tôi tiến hành tạo database devpro, trong database này tạo bảng devpro.edu.vn, và tạo 2 trường id (khóa chính, tự động tăng), Khóa học (kiểu varchar(50)). Kết quả tạo bảng sẽ tạo được bảng sau:

db-phan-trang-php-mysql

Tạo xong tôi tiến hành insert vào bảng “khoahoc” các dữ liệu như hình sau:

du-lieu-phan-trang-php-mysql

Sau đó tôi thực hiện việc kết nối đến database này, ngoài ra tôi có link thư viện css của bootstrap vào để tạo giao diện bắt mắt hơn:

 

Bước 2: Xác định trang hiện tại là trang bao nhiêu.

  • mặc định bạn nên khởi tạo trang ban đầu là trang 1, và sau này biến trang hiện tại sẽ thay đổi dựa vào biến $_GET[“trang”] mà bạn đã truyền lên URL. Đặt tên biến này là: $current_page.

Bước 3: Xác định mỗi trang hiển thị bao nhiêu bản ghi, gán biến này tên là $limit (giới hạn).

Bước 4: tính tổng số bản ghi:

  • Bạn phải tính được số bản ghi có trong bảng, và để tính được bạn có thể dùng hàm mysqli_num_row($câu_lệnh_truy_vấn); sau đó để cho dễ nhớ, bạn đặt biến $total_record là tổng số bản ghi có trong bảng.

Bước 5: Tính toán xem phải chia ra bao nhiêu trang.

  • Ví dụ bạn có 50 bản ghi và mỗi trang 10 bản ghi là 10 trang thì hiển nhiên bạn phải chia ra thành 5 trang, nhưng nếu bạn có 41 bản ghi mỗi trang cũng 10 bản ghi thì bạn cũng cần 5 trang, vì mỗi trang tối đa chỉ 10 bản ghi, trang thứ 5 mặc dù chỉ có 1 bản ghi nhưng vẫn chiếm hết 1 trang.
  • Công thức tính tổng số trang, bạn gán $total_page = ceil($total_records / $limit), tức là tổng số trang bằng tổng số bản ghi chia cho số bản ghi trên 1 trang. Nếu chia lẻ thì làm tròn lên. Ví dụ 50:10=5, nhưng 41:10 cũng phải bằng 5.

Bước 6: Xử lý biến $_GET[“trang”] (trang hiện tại), nếu trang hiện tại <1 hoặc trang hiện tại lớn hơn tổng số trang, thì không hợp lệ. Tôi xử lý lỗi này bằng cách nếu trang hiện tại nhỏ hơn 1 thì tôi gán bằng 1, và nếu trang hiện tại lớn hơn tổng số trang mà tôi đã chia thì tôi sẽ gán trang hiện tại bằng trang cuối cùng.

Bước 7: thế các biến trên vào câu lệnh: SELECT * FROM devpro.edu.vn LIMIT $start,$limit

Bước 8: tạo trang giao diện, sẽ select dữ liệu ra và có nút phân trang.

Bước 9: hưởng thụ thành quả.

Bắt tay vào việc phân trang:

Bước 3,4,5,6,7:

 

Ở đây tôi có biến $start = ($page -1)*$limit;

Như các bạn thấy ở trên nếu bạn có 50 bản ghi và mỗi trang 1o bạn ghi, bạn muốn đến trang thứ 3 thì lệnh select sẽ là:

SELECT * FROM devpro.edu.vn LIMIT 20,10

$start = 20 , chính bằng (trang hiện tại = 3) (trừ 1) (nhân) (giới hạn, $limit = 10).

vậy $start = ($page -1)*$limit; chính là phương pháp để tính bản ghi bắt đầu lấy.

Như ở trên tôi có giới hạn 1 trang được hiển thị tối đa 2 bản ghi, và tổng số bản ghi bằng 7.

Bước 8: tạo trang giao diện hiển thị và tạo nút phân trang:

Vậy đã hoàn tất kỹ thuật phân trang.

Video chi tiết hướng dẫn phân trang với PHP và mysql: