Bài 18 – Phân trang với PHP và PDO

I. Pagination

Phân trang (pagination) là gì?

Đầu tiên tôi sẽ đưa ra một ví dụ: Nếu bạn có một bảng cơ sở dữ liệu hiển thị cho người dùng xem theo hàng, bạn sẽ làm gì nếu bảng có hàng trăm thậm chí hàng ngàn hàng? Hiển thị tất cả các hàng không phải là một ý tưởng tốt thay vào đó bạn nên chia ra thành nhiều  phần cơ sở dữ liệu hoặc các trang để dễ dàng quản lý hơn. Có 2 việc phải làm là:

  • Quyết định số lượng hàng hiển thị trong mỗi trang.
  • Cung cấp các liên kết để người dùng có thể chọn các trang khác nhau để xem nội dung.

Như vậy phân trang chỉ đơn giản là chia tách các kết quả từ cơ sở dữ liệu thành các trang riêng biệt và hiển thị các liên kết đến tất cả các trang.

 

 II. Làm sao để phân trang?

Giả sử tôi có danh sách gồm 100 món ăn, để cho thoáng mắt tôi chỉ muốn xem 15 món ăn một lúc thôi, vì vậy tôi sẽ chia nhỏ 100 món ăn này vào các trang :

  • Trang 1 có 15 món từ món 0-> món 14
  • Trang 2 có 15 món từ món 15 -> món 29
  • …..
  • Trang 6 có 15 món từ món 75->món 89
  • Trang 7 có 10 món từ món 90->món 100

Như vậy với 100 món tương đương 100 hàng sẽ được hiển thị trong 7 trang.

Để tính được 15 món ăn tương ứng với từng trang hay chính là bắt đầu của một trang là món ăn nào và kết thúc là món ăn nào tôi dùng câu lệnh MySQL :

truy vấn trên có nghĩa là tôi lấy ra 15 món ăn bắt đầu từ vi_tri.

Trong đó vi_tri tính bởi công thức vi_tri = (trang hiện tại – 1) * 15

Ví dụ: Ở trang thứ 6: vi_tri = (6 – 1)*15= 75

Đến đây coi như xong phần thuật toán tiếp đến các bước để áp dụng vào phân trang trong PHP

Bước 1: Cấu hình và kết nối cơ sở dữ liệu

Database: datatable

Table: ‘monan‘ 

Tôi sẽ tạo 1 file config.php có nội dung :

Ở đây tôi sử dụng PDO (PHP Data Objects) do PDO hỗ trợ việc tương tác với nhiều hệ quản trị CSDL (hơn 12 loại).

 PDO có hỗ trợ PDO exception để xử lý các lỗi nên để các câu lệnh được đặt trong khối try/catch.

Tham khảo về PDO tại đây.

Hết bước 1.

Tôi tạo tiếp file pagination.php bao gồm nội dung từ bước 2 đến hết bước 6

Đừng quên include(‘config.php’) vào file pagination.php;

Bước 2: Cài đặt cấu hình lát dùng để phân trang

 

Bước 3:  Giờ đi tính tổng số hàng trong bảng dữ liệu (tương đương với việc tôi có 100 món ăn ở trên)

Bước 4: Lấy trang hiện tại từ URL qua phương thức $_GET[‘page’]

Bước 5: Tìm vị trí món ăn bắt đầu của một trang trong câu truy vấn có từ khóa LIMIT và tổng số trang được tạo ra.

 

Bước 6: Tính các trang bắt đầu và kết thúc của link phân trang ($start, $end)

Trang bắt đầu: Nếu trang hiện tại > số link muốn hiển thị thì $start = trang hiện tại – (số link hiển thị – 1)), ngược lại  thì trang bắt đầu vẫn là 1

Trang kết thúc: Nếu trang hiện tại + số link hiển thị nhỏ hơn tổng số trang thì

trang kết thúc = (trang hiện tại + số link hiển thị), ngược lại trang kết thúc sẽ có giá trị = tổng số trang.

 

Xong file pagination.php rồi.

 Bước 7: Trang index.php, hiển thị các món ăn trong bảng

Bước 8: Hiển thị link phân trang

Thêm CSS:

Sản phẩm cuối cùng:

Phân trang với PHP và PDO

 ~~~~~Hết :)~~~~~

You may also like...

5 Responses

  1. dangchithao says:

    Cho em hỏi chút? có khoảng 200 trang thì dàn trang chư thế nào? chẳng nhẽ hiển thị hết 200 trang?

    • long says:

      Em có thể hiển thị 2 trang trước và 2 trang sau trang hiện tại của em.
      Có 1 ô input cho phép nhập số trang và đi thẳng đến trang đó
      Có 1 link về trang đầu tiên và 1 link về trang cuối cùng

      < < < 1 2 3 4 5 > >> Đi đến ….

  2. hocphp says:

    cho hỏi bien $num_links ở đau ra vậy

  3. long says:

    $num_links = 5; // Số link muốn hiển thị (2 link bên trái và 2 link bên phải của trang hiện tại)

    đoạn đầu có nói rồi còn gì bạn

  1. July 20, 2015

    […] phân trang tôi đã đề cập ở bài 18 , ở bài này tôi sẽ nói đến vấn đề tìm kiếm trong PHP, kết quả có phân […]

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">