Phân trang trong PHP 2007-07-12 12:04:24


Đây là 1 hàm phân trang chia thành từng đoạn, TG đang sử dụng và post lên đây, anh em nào có nhu cầu phân trang thì sử dụng:
<?php
function divPage($total = 0,$currentPage = 0,$div = 5,$rows = 10){
if(!
$total || !$rows || !$div || $total<=$rows) return false;
$nPage = floor($total/$rows) + (($total%$rows)?1:0);
$nDiv = floor($nPage/$div) + (($nPage%$div)?1:0);
$currentDiv = floor($currentPage/$div) ;
$sPage = '';
if(
$currentDiv) {
$sPage .= '<a href="./?p=0"><<</a> ';
$sPage .= '<a href="./?p='.($currentDiv*$div - 1).'"><</a> ';
}
$count =($nPage<=($currentDiv+1)*$div)?($nPage-$currentDiv*$div):$div;
for(
$i=0;$i<$count;$i++){
$page = ($currentDiv*$div + $i);
$sPage .= '<a href="./?p='.($currentDiv*$div + $i ).'" '.(($page==$currentPage)?'class="current"':'').'>'.($page+1).'</a> ';
}
if(
$currentDiv < $nDiv - 1){

$sPage .= '<a href="./?p='.(($currentDiv+1)*$div + 1 ).'">></a> ';
$sPage .= '<a href="./?p='.(($nDiv-1)*$div + 1 ).'">>></a>';
}

?>

Giải thích các thông số:
$total: tổng số mẫu tin
$currentPage: trang hiện hành
$div: số trang trong 1 đoạn
$rows: số dòng trên 1 trang
Cách dùng:

<?php
$p
= $_GET['p'];// currentPage
$rows = 10; // số record trên mỗi trang
$div = 5; // số trang trên 1 phân đoạn

$sql = "SELECT COUNT(*) AS total FROM <table> WHERE <dieu_kine>";
//fetch dữ liệu lấy giá trị của total, tổng số record với điều kiện là <dieu_kien>, ta được biến $total;

//lấy dữ liệu cho trang $p
$start = $p*$rows;
$sql = "SELECT * FROM <table> WHERE <dieu_kine> LIMIT $start,$rows";
// hiển thị dữ liệu

// in phân trang
print divPage($total,$p,$div,$rows)
?>

Chúc thành công!

Tra loi 28 comment(s) TG 2007-07-12 12:04:24

toiyeuphp 2007-07-12 12:28:11

Cái này hình như bị lỗi và chưa hợp lý. Nếu bấm vào >> thì chỉ nhảy tới trang 6 (7) trong khi có tổng là 9 trang. Nếu bấm trang 5 thì ít ra nó cũng phải bỏ 1,2 và hiện 6,7 nhưng đây lại không.

@toiyeuphp

kirk 2007-07-13 13:38:04



<?
function page_div($link, $offset, $numofpages, $page) {
$numofpages = ceil($numofpages);
$pagesstart = ceil($page-$offset);
$pagesend = ceil($page+$offset);
if (
$page != "1" && ceil($numofpages) != "0")
{
echo
str_replace('%d_pg', ceil($page-1), "<a href="$link"><b>Pre</b></a>&nbsp;");
}
for(
$i = 1; $i <= $numofpages; $i++)
{
if (
$pagesstart <= $i && $pagesend >= $i)
{
if (
$i == $page)
{
echo
"<b>[$i]</b>&nbsp;";
}
else
{
echo
str_replace('%d_pg', "$i", '<a href="'.$link.'"><b>'.$i.'</b></a>&nbsp; ');
}
}
}
if (
ceil($numofpages) == "0")
{
echo
"[$i]";
}
if (
$page != ceil($numofpages) && ceil($numofpages) != "0")
{
echo
str_replace('%d_pg', ceil($page+1), '<a href="'.$link.'"><b>Next</b></a>');
}
}

?>

Cách dùng:

<?
$pp
= "10";
$p_now=$_GET['p'];
$total = mysql_result(mysql_query("SELECT COUNT(id) FROM <table>"),0);
$numofpages = $total / $pp;
if (!
$p_now) {$page = 1;}
else {
$page = $p_now;}
$limitvalue = $page * $pp - ($pp);
//lấy dữ liệu cho trang
$sql="SELECT * FROM <table> WHERE <dieu_kine> LIMIT $limitvalue, $pp";
// hiển thị dữ liệu

// in phân trang
echo 'Pages: '.ceil($numofpages).'<br>';
page_div("?action=donow&p=%d_pg", "10", ceil($numofpages), $page);
?>


Thử hàm này xem sao.

@kirk

Mydream 2007-12-26 02:49:38

Hi TG,
Tớ chạy đoạn mã code theo hàm divpage() nhưng khi hiển thị trên trang sản phẩm của tớ, thì kết quả là trang hiển thị list tất cả các sản phẩm trên 1 trang màn hình, ý tớ là nếu tứ cvó 50 sản phẩm thì nó hiển thị hết 50 sản phẩm trên cùng một trang TG ạ

@Mydream

Mydream 2007-12-26 03:48:08

Gui toiyeuphp,
Khi tớ chạy hàmg phân trang của bạn như đã posted, trình duyệt báo lỗi ở dòng lênh đầu tiên của function:  echo str_replace('%d_pg', ceil($page-1), "<a href="$link"><b>Pre</b></a>&nbsp;");

Lỗi Warning: Biến không được định nghĩa trong hàm str_replace() ?. Vậy phải gán các tham số hàm như thế nào thì đúng ?.

@Mydream

TG 2007-12-26 04:36:28

Đã gọi là phân trang thì khi có nhiều sản phẩm nó phải phân ra làm nhiều trang, chứ nếu chỉ hiển thị trên 1 trang thì phân trang làm gì

@TG

NguoiMoi 2008-01-01 02:33:05

Mình sử dụng hàm của bạn "kirk" chạy tốt chỉ có điều nó hiện kỳ quá:
vd:Nếu trang hiện tại là 1 thì nó hiện như vầy
[1]
2 3 4 Next

vd:Nếu trang hiện tại là 2 thì nó hiện như vầy
1 [2]
3 4 Next

vd:Nếu trang hiện tại là 2 thì nó hiện như vầy
1 2 [3]
4 Next
.....
sao nó không nằm trên 1 hàng mà lại xuống hàng???
===> không được đẹp:D

@NguoiMoi

GnuhNguyen 2008-01-01 03:02:50

Phân trang của TG khá hay nhưng ví dụ mỗi lần hiển thị kiểu:
1 2 3 4 5 nên muốn sang trang 6, 7 , 8 thì bắt buộc phải vào trang 5. Tớ thì hay để dạng select đổ xuống ^^

@GnuhNguyen

web20vn.com 2008-01-02 09:25:15

Đổ xuống thì có trong PhpMyAdmin, rất pro :D

@web20vn.com

GnuhNguyen 2008-02-17 09:06:14

UH tớ toàn làm thế, muốn chuyển trang, đổ xuống chọn trang là xong ^^

@GnuhNguyen

gaulucky92 2008-02-21 10:59:31

Mình đang dùng đoạn code sau:
// [START] Code for showing page numbers
  $limit = 0;
  $new_post_per_page = "10"; //Số records trên 1 trang
  $qr = mysql_query("SELECT * FROM tag WHERE tag = \"$tag\"") or die (mysql_error());
  $check = mysql_num_rows($qr);
  $split = $check/$new_post_per_page;
  $countpg = ceil($split);
  if (isset($_GET['page']) && $_GET['page'] > '1'){
      $page = $_GET['page'];
      $limit = ($page-1)*$new_post_per_page;
      $new_post_per_page <= $new_post_per_page+$new_post_per_page;}
  else{$page = 1;}
// Show!!
$b = 1;  
$pages = array();
    for ($i=$page-$page+1;$i<=$page-1;$i++)
    {$pages[$b] = "[<A href=\"index.php?act=default&page=$i\">$i</a>] ";$b++; } // Previous Page(s)
    $pages[$b] = "<B>$page</B> ";$b++; // Current Page
    if ($countpg > $page)  // Next Page(s)
    {for ($a=$page+1;$a<=$countpg;$a++) {$pages[$b] = "[<A href=\"index.php?act=default&page=$a\">$a</a>] ";$b++; }}
$pages[] = '';
// [END] Code for showing page numbers

Cũng phân số trang, nhưng hơi bất tiện là dù chỉ có 1 trang nhưng nó vẫn hiện số trang ra ("Trang 1" - giống như phpBB:"Trang x trên tổng số y trang"), và số trang cứ thế tăng dần ko rút gọn lại như forum được (VD có 100 trang thì nó hiện ra đủ... 100 số T_T), có ai biết cách sửa chỉ mình với!

@gaulucky92

GnuhNguyen 2008-02-23 04:10:14

Hehe, thì đấy, tớ bảo rồi, cho nó thành menu đổ đi ^^ thay <A> bằng <select>
ví dụ:
<form action=index.php>
<input type=hidden name=act value=default>
<select name=page>
//////
<option value='$i'>
nếu là Current Page thì thêm selected cho cái option này
//////
</select>
<input type=submit class=button value='GO'>
</form>
Tớ chỉ nói cách viết thôi, còn viết thế nào, tùy vào code bạn mà sửa lại ^^.

@GnuhNguyen

gaulucky92 2008-02-23 09:13:50

Hic xài menu xổ thì thấy ko đẹp :P Thường chỉ dùng menu xổ xuống cho các tùy chọn như số bài trên 1 trang thôi... Để bắt chước Xtremedia thử:
2 số trang trước đó+số trang hiện tại+2 số trang tiếp theo

@gaulucky92

Ngọc Minh 2008-02-28 11:02:10

Anh cho in ra như vậy,khi em dùng Templete Engin thì làm sao hả anh?

@Ngọc Minh

gaulucky92 2008-02-29 11:49:04

Tui xài Smarty, theo hướng dẫn bên quanphp.net: http://quanphp.net/forum/viewtopic.php?t=97
Work 100% ^^

@gaulucky92

Ngọc Minh 2008-03-01 04:16:38

Hì,cái đó em sợ nặng lắm!em tháy phpbb là sài dể hiểu nhất!
Em đang tập sài nó,và tập code luôn!Chứ không kịp theo mấy anh luôn đó :)

@Ngọc Minh

liukang 2008-12-24 11:22:58


Mình thử test code của TG, sao nó báo lổi này hoài ta?
Parse error: syntax error, unexpected $end in C:\xampp\htdocs\lib\test.php on line 41


Đây là code test.php
<?php
function divPage($total = 0,$currentPage = 0,$div = 5,$rows = 10){
if(!
$total || !$rows || !$div || $total<=$rows) return false;
$nPage = floor($total/$rows) + (($total%$rows)?1:0);
$nDiv = floor($nPage/$div) + (($nPage%$div)?1:0);
$currentDiv = floor($currentPage/$div) ;
$sPage = '';
if(
$currentDiv) {
$sPage .= '<a href="./?p=0"><<</a> ';
$sPage .= '<a href="./?p='.($currentDiv*$div - 1).'"><</a> ';
}
$count =($nPage<=($currentDiv+1)*$div)?($nPage-$currentDiv*$div):$div;
for(
$i=0;$i<$count;$i++){
$page = ($currentDiv*$div + $i);
$sPage .= '<a href="./?p='.($currentDiv*$div + $i ).'" '.(($page==$currentPage)?'class="current"':'').'>'.($page+1).'</a> ';
}
if(
$currentDiv < $nDiv - 1){

$sPage .= '<a href="./?p='.(($currentDiv+1)*$div + 1 ).'">></a> ';
$sPage .= '<a href="./?p='.(($nDiv-1)*$div + 1 ).'">>></a>';
}



if(isset(
$_GET['p']))
{
$p = $_GET['p'];// currentPage
}
else
{
$p=0;
}
$rows = 3; // số record trên mỗi trang
$div = 5; // số trang trên 1 phân đoạn
$total=100; // vi du total record lay ve la 100

echo "Test hien thi du lieu";

//$start = $p * $rows;

print divPage($total,$p,$div,$rows);

?>

@liukang

gaulucky92 2008-12-24 11:56:58

Mình thử test code của TG, sao nó báo lổi này hoài ta?

hàm divPage() chưa có dấu } kết thúc

@gaulucky92

easyphuoc 2008-12-30 06:40:22

Xin bạn cho mình 1 demo và 1 vidụ cụ thể nào đó, xin cảm ơn bạn nhiều.

@easyphuoc

NữThần 2008-12-30 06:49:23

Các bạn, đã vào phpbasic thì đừng hỏi mấy engine khác, đã gọi là BASIC thì sao trả lời mấy cái đó.
Mấy bạn nên học những cái cơ bản nhất và làm sao sử dụng chúng một cách linh động thì hay hơn là học các FW hay TL.

@NữThần

Linh 2009-03-04 01:36:16

mình muốn viết trang tìm kiếm,mà kết quả hiện ngay trên trang tìm kiếm  có phân trang.Bạn nào co code share cho mình với.

@Linh

downloadsbank.com 2009-07-26 12:32:08

Hàm này chả copy ở đâu mà thiếu tùm lum vậy trời

@downloadsbank.com

phuongphp 2009-07-28 05:37:05

paginator here

download

@phuongphp

luuson@gmail.com 2009-09-11 06:32:33


cảm ơn các bạn đã Share.

Đây là đoạn code mình đã FIX lại và Design xin Share cho ai cần.

<style>
#pagination-digg li { border:0; margin:0; padding:0; font-size:11px; list-style:none; /* savers */ float:left; }
#pagination-digg a { border:solid 1px #9aafe5; margin-right:2px; }
#pagination-digg .active { background:#2e6ab1; color:#FFFFFF; font-weight:bold; display:block; float:left; padding:4px 6px; /* savers */ margin-right:2px; }
#pagination-digg a:link,
#pagination-digg a:visited { color:#0e509e; display:block; float:left; padding:3px 6px; text-decoration:none; }
#pagination-digg a:hover { border:solid 1px #0e509e; }
</style>
<?php
function page_div($link, $offset, $numofpages, $page) {
$numofpages = ceil($numofpages);
$pagesstart = ceil($page-$offset);
$pagesend = ceil($page+$offset);
if (
$page != "1" && ceil($numofpages) != "0")
{
echo
str_replace('%d_pg', ceil($page-1), " <a href=".$link." ><b>< Pre</b></a>&nbsp;");
}
for(
$i = 1; $i <= $numofpages; $i++)
{
if (
$pagesstart <= $i && $pagesend >= $i)
{
if (
$i == $page)
{
echo
"<b class=active>$i</b>&nbsp;";
}
else
{
echo
str_replace('%d_pg', "$i", '<a href="'.$link.'"><b>'.$i.'</b></a>&nbsp; ');
}
}
}
if (
ceil($numofpages) == "0")
{
echo
"$i";
}
if (
$page != ceil($numofpages) && ceil($numofpages) != "0")
{
echo
str_replace('%d_pg', ceil($page+1), '<a href="'.$link.'"><b> Next</b></a>');
}
}

include(
'../connections.php');
$pp = "10";
$p_now=$_GET['p'];

$q2 = "SELECT count(*) as tot FROM cn05b_sanpham";
$s2 = mysql_query($q2,$link);
$r2 = @mysql_fetch_array($s2);

$numofpages = $r2['tot'] / $pp;
if (!
$p_now) {$page = 1;}
else {
$page = $p_now;}
$limitvalue = $page * $pp - ($pp);
//lấy dữ liệu cho trang
$sql="SELECT * FROM cn05b_sanpham LIMIT $limitvalue, $pp";
// hiển thị dữ liệu
?>
<div id=pagination-digg> <?
// in phân trang
echo 'Pages: '.ceil($numofpages).'<br>';
page_div("?action=donow&p=%d_pg", "5", ceil($numofpages), $page);
?> </div>

@luuson@gmail.com

slopesky@gmail.com 2009-11-06 04:48:36

không có links trên IE mặc dù cú pháp đúng Fifox vẫn chạy có link, IE có số ko có link view source vẫn đúng

@slopesky@gmail.com

th 2011-04-07 14:55:34

@luuson@gmail.com:  'p' là giá trị ở đâu vậy anh?

@th

mina 2012-03-21 16:41:22

'p' la bien khi ho nhan vao so trang.

@mina

cbcvbcv 2012-05-07 18:53:25

vc bcbc

@cbcvbcv

tocom 2012-10-18 12:19:28

mình đọc cái này nhức đầu quá
có ai rành về PHP thì bên mình đang cần người đó
lương thỏa thuận
có thể làm thêm ko cần chính thức
lh 0985970559

@tocom

Reply