Hướng dẫn xây dựng lớp phân trang trong PHP

Hướng dẫn xây dựng lớp phân trang trong PHP

Hướng dẫn xây dựng lớp phân trang trong PHP

Phân trang là một phần quan trọng của bất kỳ ngôn ngữ lập trình web động nào, đây cũng là phần gây nhiều khó khăn cho những ai mới làm quen với ngôn ngữ lập trình web. Phân trang trong PHP cũng có nhiều cách làm. Trong bài này tôi xin hướng dẫn xây dựng một lớp phân trang đơn giản trong PHP, điều cốt yếu để tạo được một lớp phân trang là bạn phải hiểu được giải thuật của bài toán phân trang nhưng cốt yếu lại bạn chỉ cần ghi nhớ những vấn đề như:

Nếu ta qui ước một số biến để tính toán như sau.

  1. $pages : Tổng số trang
  2. $limit : Số mẫu tin trên một trang
  3. $start : Vị trí mẫu tin bắt đầu trên trang
  4. $curpage : Vị trí trang hiện tại
$pages = (tổng số mẫu tin / $limit)
nếu kết quả chia lẻ thì số trang phải được làm tròn lên
$start = ($curpage - 1) * $limit
Từ trên giễ dàng suy ra
$curpage = ($start/$limit)+1;

Từ những giải thuật trên bằng cách dùng for lặp qua tổng số trang để tạo ra các liên kết đến trang và ta sẽ dùng phương thức truyền biến GET để lấy các giá trị về số trang hiện tại hay tổng số trang.

Cụ thể hóa vấn đề sau đây sẽ là đoạn code dùng cho lớp phân trang.

class Paging{
protected $_total;
protected $_pages;

// Phương thức tìm tổng số mẫu tin
public function findTotal($db, $table){
  if(isset($_GET['total'])){
   $this->_total = $_GET['total'];
  }else{
   $sql= 'SELECT COUNT(*) FROM '.$table;
   $result = $db->query($sql);
   $row = $db->fetch_array($result);
   $this ->_total = $row[0];
  }
}

// Phương thức tính số trang
public function findPages($limit){
  $this->_pages = ceil($this->_total / $limit);
}

// Phương thức tính vị trí mẫu tin bắt đầu từ vị trí trang
function rowStart($limit){
  return (!isset($_GET['page'])) ? 0 :  ($_GET['page']-1) * $limit;
}

public function pagesList($curpage){
  $total = $this->_total;
  $pages = $this->_pages;
  if($pages <=1){return '';}
  $page_list="";

  // Tạo liên kết tới trang đầu và trang trang trước
  if($curpage!=1){
   $page_list .= '<a href="'.$_SERVER['PHP_SELF'].'?page=1&total='.$total.'" title="trang đầu">First </a>';
  }
  if($curpage  > 1){
   $page_list .= '<a href="'.$_SERVER['PHP_SELF'] .'?page='.($curpage-1).'&total='.$total.'" title="trang trước">< </a>';
  }

  // Tạo liên kết tới các trang
  for($i=1; $i<=$pages; $i++){
   if($i == $curpage){
    $page_list .= "<b>".$i."</b>";
   }
   else{
    $page_list .= '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'&total='.$total.'" title="Trang '.$i.'">'.$i.'</a>';
   }
   $page_list .= " ";
  }

  // Tạo liên kết tới trang sau và trang cuối
  if(($curpage+1)<=$pages){
   $page_list .= '<a href="'.$_SERVER['PHP_SELF'].'?page='.($curpage+1).'&total='.$total.'" title="Đến trang sau"> > </a>';
  }
  if(($curpage != $pages) && ($pages != 0)){
   $page_list .= '<a href="'.$_SERVER['PHP_SELF'].'?page='.$pages.'&total='.$total.'" title="trang cuối"> Last</a>';
  }
  return $page_list;
}// end pagesList
}// end class

Sau khi tạo xong lớp phân trang bây giờ chúng ta chỉ việc thưởng thức thành quả đã tạo ra.

$paging = new Paging;
$limit =10;
// Tổng số mẫu tin
$paging->findTotal($db,'shops');
// Tổng số trang
$paging->findPages($limit);
// Bắt đầu từ mẫu tin
$start =$paging->rowStart($limit);
// Trang hiện tại
$curpage = ($start/$limit)+1;

// Xuất dữ liệu với truy vấn
$sql ='SELECT * FROM shops LIMIT '.$start.','.$limit;
------------------

// Xuất phân trang
echo $paging->pagesList($curpage); 

Để thử nghiệm bạn nhớ tạo csdl nhiều nhiều dữ liệu chút để test. Bài toán chỉ khó ở giải thuật nhưng biết rồi thì thấy giễ, với việc xây dựng bằng lớp trong hướng đối tượng việc áp dụng sẽ vô cùng đơn giản. Tất nhiên đây không phải là cách tối ưu nhất bạn có thể biến tấu tùy theo ý của bạn để phân trang chuyên nghiệp hơn.

Bạn thấy bài viết này như thế nào?: 
Average: 10 (1 vote)
Ảnh của Khanh Hoang

Khanh Hoang - Kenn

Kenn is a user experience designer and front end developer who enjoys creating beautiful and usable web and mobile experiences.

Advertisement

 

jobsora

Dich vu khu trung tphcm

Dich vu diet chuot tphcm

Dich vu diet con trung

Quảng Cáo Bài Viết

 
Elie Nahas với danh nghĩa chủ công ty người mẫu chụp ảnh với người mẫu năm 2002

Trao đổi thân xác ở Cannes - Đường dây mại dâm hạng sang (phần 2)

Một trong những sự kiện là vụ 'tú ông' Elie Nahas cầm đầu đường dây cung cấp gái bao quốc tế

David Baker chia sẻ 11 suy nghĩ cần thiết cho Drupal team

There was an article by David Baker that caught my attention. David is a long-time consultant for the web agency marketplace who offers blunt

Canh dong lua bac thang

Formosa: Hàng nghìn tấn chất thải có nồng độ pH vượt ngưỡng nguy hại

Hàng nghìn tấn chất thải có nồng độ pH vượt ngưỡng nguy hại theo quy chuẩn của Bộ TN-MT của Formosa được chuyển từ Hà Tĩnh ra Thái Nguyên theo dạng hàng hóa để tái chế.

Công ty diệt chuột T&C

 

Diet con trung