10/10/2018, 11:38

Cach phân trang trong PHP

Chào các bạn, tớ xin giới thiệu một cách đơn giản để phân trang trong PHP.
Giả sử ta có một CSDL là test với 1 bảng test bao gồm:
1. Trường id( auto_increment)
2. Trường name (varchar)
3. Trường address (varchar)
Câu lệnh truy vấn để hiển thị từng trang là:
select * from test limit $s,$p;
Trong đó $s là số thứ tự đầu tiên của trang thứ n, còn $p là số bản ghi hiển thị trong mỗi trang. Các bạn chú ý là số thứ tự bản ghi bắt đầu từ 0 (chứ không phải là 1)
Ví dụ: để view trang thứ 1 với số bản ghi là 5 thì câu lệnh là:
select * from test limit 0,5;
Đây là code phân trang. Có gì các bạn góp ý cho tớ.
PHP Code:
<?php
  
//connect den server va co so du lieu
  
mysql_connect("localhost","admin","admin") or die(mysql_error());
  
mysql_select_db("test") or die(mysql_error());
  
//-------------------------------------------------
  
$qr=mysql_query("select * from test");//query den bang co ten la: test trong CSDL
  
$n_record=mysql_num_rows($qr);//so ban ghi cua bang
  
$p=5;//so bang ghi trong 1 trang can hien thi
  
  //-------Ham tinh so trang-------------------------
  
function num_page()
  {
    global 
$n_record;//lay bien toan cuc
    
global $p;
    if(
$n_record%$p==0)
    {
      
$n_page=$n_record/$p;
      return 
$n_page;
    }
    else
    {
      
$n_page=($n_record-($n_record%$p))/$p+1;
      return 
$n_page;
    }
  }
  
//-------------------------------------------------
  
function view_page()
  {
    global 
$n_record;
    for(
$i=1;$i<=num_page();$i++)
    {
      echo 
"<a href='pages.php?n=".$i."'>".$i."</a><";
    }
    echo 
"<a href='pages.php?n=all'>All</a>";
  }
  
//-------------------------------------------------
  
echo "<br>";
  
$n=$HTTP_GET_VARS***91;'n'***93;;//lay bien n tren trinh duyet
  
$s=($n-1)*$p//thu tu cua bang ghi tai trang thu n
  
if ($n!='all')
  {
    
$qr1=mysql_query("select * from test limit $s,$p") or die (mysql_error());
  }
  else
  {
    
$qr1=mysql_query("select * from test");
  }
  
//--------Hien thi bang-----------------------------
  
view_page();
  echo 
"<table border=1 width=100%>";
  while(
$row=mysql_fetch_array($qr1))
  {
    echo 
"<tr>";
      echo 
"<td>".$row***91;'id'***93;."</td>";
      echo 
"<td>".$row***91;'name'***93;."</td>";
      echo 
"<td>".$row***91;'address'***93;."</td>";
    echo 
"</tr>";
  }
  echo 
"</table>";
  
view_page();
?>
QueenRock viết 13:39 ngày 10/10/2018
có phép chia thì kết quả có thể là float, nên chuyển sang integer thì hay hơn
PHP Code:
function num_page() {
   global 
$n_record;//lay bien toan cuc
   
global $p;
   
$n_page = ($n_record%$p) ? ($n_record/$p 1) : ($n_record/$p);
   
$n_page = (int) ($n_page);
   return 
$n_page;

cathangtu viết 13:41 ngày 10/10/2018
Không bao giờ là float bạn ạ. Xem kỹ lại đi
PHP Code:
if($n_record%$p==0)
{
$n_page=$n_record/$p;
return 
$n_page;
}
//nếu $n_record chi hết cho $p thì: chia
-> kết quả là nguyên(vì chia hết)
else
{
$n_page=($n_record-($n_record%$p))/$p+1;
return 
$n_page;

//nếu không thì lấy $n_record trừ đi phần dư của $n_record khi chia cho $p. Kết quả trả về phải chia hết cho $p-> khi chia cho $p kết quả sẽ là nguyên.
pfiev viết 13:41 ngày 10/10/2018
$n_page = floor(($n_record+$p-1)/$p);
cần gì viết nguyên 1 hàm
nobita611 viết 13:42 ngày 10/10/2018
dùng ceil làm tròn cũng đc mà, mà bài trên bạn làm thế có vẻ hơi phức tạp, đơn gian 1 chút đi.
nvcnvn viết 13:41 ngày 10/10/2018
À, em có một câu hỏi liên quan mong mọi người chỉ giúp!
Ví dụ ỡ trường hợp ta có 100 kết quả trả về, ta muốn mổi trang chỉ hiễn thị 20 kết quả vị chi ta có 5 trang!
Trong mổi trang, tương ứng với mổi kết quả ta có một check box hay một nút radio.
Câu hỏi ở đây đặt ra rà nếu người dùng đầu thoạt đầu đả chọn một số kết quả rồi qua những trang khác chọn tiếp, chọn xong thì quay lại xem, xem xong thì đi chọn tiếp, chừng nào chán thì nhấn submit... Bằng cách nào em lưu trữ được tất cả kết quả mà người ta đả chọn!?
Giúp em với nha!
uoon viết 13:52 ngày 10/10/2018
Được gửi bởi nvcnvn
À, em có một câu hỏi liên quan mong mọi người chỉ giúp!
Ví dụ ỡ trường hợp ta có 100 kết quả trả về, ta muốn mổi trang chỉ hiễn thị 20 kết quả vị chi ta có 5 trang!
Trong mổi trang, tương ứng với mổi kết quả ta có một check box hay một nút radio.
Câu hỏi ở đây đặt ra rà nếu người dùng đầu thoạt đầu đả chọn một số kết quả rồi qua những trang khác chọn tiếp, chọn xong thì quay lại xem, xem xong thì đi chọn tiếp, chừng nào chán thì nhấn submit... Bằng cách nào em lưu trữ được tất cả kết quả mà người ta đã chọn!?
Giúp em với nha!
Bạn dùng cookie nhé, kết hợp với javascript nữa.

http://www.google.com.vn/search?q=ja...ient=firefox-a
hp911 viết 13:43 ngày 10/10/2018
Code của bạn có lỗi gì kô mà sao mình chạy nó cứ báo lỗi hoài
nvcnvn viết 13:50 ngày 10/10/2018
Được gửi bởi uoon
Bạn dùng cookie nhé, kết hợp với javascript nữa.

http://www.google.com.vn/search?q=ja...ient=firefox-a
Cám ơn bạn lắm, nhưng cho mình hỏi thêm, có cách nào khác như là dùng session(phòng trường hợp người dùng không cho phép để lại cookies).
Nếu có ai bik thì trình bày thuật toán bằng lời giùm mình ha!
fotech_nd viết 13:39 ngày 10/10/2018
Được gửi bởi cathangtu
Chào các bạn, tớ xin giới thiệu một cách đơn giản để phân trang trong PHP.
Giả sử ta có một CSDL là test với 1 bảng test bao gồm:
1. Trường id( auto_increment)
2. Trường name (varchar)
3. Trường address (varchar)
Câu lệnh truy vấn để hiển thị từng trang là:
select * from test limit $s,$p;
Trong đó $s là số thứ tự đầu tiên của trang thứ n, còn $p là số bản ghi hiển thị trong mỗi trang. Các bạn chú ý là số thứ tự bản ghi bắt đầu từ 0 (chứ không phải là 1)
Ví dụ: để view trang thứ 1 với số bản ghi là 5 thì câu lệnh là:
select * from test limit 0,5;
Đây là code phân trang. Có gì các bạn góp ý cho tớ.
PHP Code:
<?php
  
//connect den server va co so du lieu
  
mysql_connect("localhost","admin","admin") or die(mysql_error());
  
mysql_select_db("test") or die(mysql_error());
  
//-------------------------------------------------
  
$qr=mysql_query("select * from test");//query den bang co ten la: test trong CSDL
  
$n_record=mysql_num_rows($qr);//so ban ghi cua bang
  
$p=5;//so bang ghi trong 1 trang can hien thi
  
  //-------Ham tinh so trang-------------------------
  
function num_page()
  {
    global 
$n_record;//lay bien toan cuc
    
global $p;
    if(
$n_record%$p==0)
    {
      
$n_page=$n_record/$p;
      return 
$n_page;
    }
    else
    {
      
$n_page=($n_record-($n_record%$p))/$p+1;
      return 
$n_page;
    }
  }
  
//-------------------------------------------------
  
function view_page()
  {
    global 
$n_record;
    for(
$i=1;$i<=num_page();$i++)
    {
      echo 
"<a href='pages.php?n=".$i."'>".$i."</a><";
    }
    echo 
"<a href='pages.php?n=all'>All</a>";
  }
  
//-------------------------------------------------
  
echo "<br>";
  
$n=$HTTP_GET_VARS***91;'n'***93;;//lay bien n tren trinh duyet
  
$s=($n-1)*$p//thu tu cua bang ghi tai trang thu n
  
if ($n!='all')
  {
    
$qr1=mysql_query("select * from test limit $s,$p") or die (mysql_error());
  }
  else
  {
    
$qr1=mysql_query("select * from test");
  }
  
//--------Hien thi bang-----------------------------
  
view_page();
  echo 
"<table border=1 width=100%>";
  while(
$row=mysql_fetch_array($qr1))
  {
    echo 
"<tr>";
      echo 
"<td>".$row***91;'id'***93;."</td>";
      echo 
"<td>".$row***91;'name'***93;."</td>";
      echo 
"<td>".$row***91;'address'***93;."</td>";
    echo 
"</tr>";
  }
  echo 
"</table>";
  
view_page();
?>
Có quá nhiều góp ý cho bạn hiền đây:

- Biến $n_record phải dùng câu query "select count(*) from test" (như bạn @vothanhtamit đã nói)

- Hàm num_page viết phức tạp quá, chỉ cần dùng $n_page = ceil(count($n_record)/$p) là đủ

- Việc dùng global $n_record là không ổn, vì trong trường hợp một trang của mình có hai chỗ cần phân trang thì code của bạn không dùng được.

- Code cần tổ chức lại để dễ nhìn và có tính sử dụng lại.

- ... vẫn còn nhiều vấn đề khác nữa
Bài liên quan
0