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

 
Ngày 6 nền tảng mềm mã nguồn mở Apache Hadoop

Ngày 6 nền tảng mềm mã nguồn mở Apache Hadoop

Apache Hadoop là 1 nền tảng mềm mã nguồn mở, miễn phí, dựa trên Java, cung cấp 1 nền tảng phân tán mạnh để lưu trữ và quản lý big data. 

Thêm 1 block region vào theme trong Drupal 7

Thêm 1 block region vào theme trong Drupal 7

In this tutorial, I will walk through the steps for adding a region to Drupal's Bartik theme. There are a couple ways you can do this.

LG Prada 3.0 start selling in UK on february

LG Prada 3.0 start selling in UK on february

We’ve already talked about the LG Prada 3.0‘s quest to the UK. The sexy device has already been announced by few phone retailers, which will offer it either unlocked or with a carrier contract.

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

 

Diet con trung