#1 (permalink)  
Old 22-05-2008, 08:40 AM
Lucky_Star's Avatar
Senior Member
 
Tham gia ngày: May 2008
Bài gởi: 506
Credits: 182
Thanks: 0
Thanked 1 Time in 1 Post
Lucky_Star is on a distinguished road
Default [PHP]Thuật toán Phân trang PHP

Điều kiện trước khi đọc bài viết:
1. Bạn phải biết cách kết nối vào DB.
2. Bạn đã tạo sẵn 1 table và table này có chứa nhiều thông tin để chờ... phân trang


Bạn tạo file list.php (Hay tạo file nào đó cũng được) có code hoàn chỉnh như sau:

CODE
<?php

$page = isset ( $_GET["page"] ) ? intval ( $_GET["page"] ) : 1;

$rows_per_page = 20;

$page_start = ( $page - 1 ) * $rows_per_page;
$page_end = $page * $rows_per_page;

$sql_query = mysql_query("SELECT * FROM table_name");

$number_of_page = ceil ( mysql_num_rows( $sql_query ) / $rows_per_page );

if ( $number_of_page > 1 )
{
$list_page = " <td> Trang: </td>";

for ( $i = 1; $i <= $number_of_page; $i++ )
{
if ( $i == $page )
{
$list_page .= " <td>[ <b>{$i}</b> ]</td> ";
}
else
{
$list_page .= "<td><a href='list.php?page={$i}'> {$i} </a></td>";
}
}
}

$i = 0;

while ( $result = mysql_fetch_array ( $sql_query ) )
{
if ( $i >= $page_start )
{
print "";
}

$i++;

if ($i >= $page_end)
{
break;
}
}

print <<<EOF
<table cellspacing="0" cellpadding="0" border="0">
<tr>
{$list_page}
</tr>
</table>
EOF;

?>



Giải thích từng đoạn:

1. Cú pháp của đoạn này là:
Page = kiểm tra xem biến page có tồn tại hay không [?]
nếu tồn tại thì lấy giá trị của biến này và dùng hàm intval lọc dể nhận được giá trị an toàn [:]
còn nếu không thì sẽ có giá trị mặc định là 1

$page = isset ( $_GET["page"] ) ? intval ( $_GET["page"] ) : 1;

2. Số dòng trên 1 trang

$rows_per_page = 20;

3. Tính số dòng ở trang mở đầu dựa theo biến $page

$page_start = ( $page - 1 ) * $rows_per_page;

4. Tính số dòng ở trang cuối dựa theo biến $page

$page_end = $page * $rows_per_page;

Ví dụ về trang mở đầu và trang cuối theo công thức trên:
Giả sử trang đang xem hiện giờ là 1, ta đc: $page_start = (1 - 1) * 20 = 0
Còn $page_end = 1 * 20 = 20, vậy ta có giá trị 0 là mở đầu và 20 là kết thúc

5. Truy xuất vào table_name

$sql_query = mysql_query("SELECT * FROM table_name");

6. Tính toán số trang, cách làm như sau:
"mysql_num_rows( $sql_query )" là lấy tổng số dòng của table đã truy xuất [1]
"$rows_per_page" là bằng 20 (giá trị mà ta đặt ở trên) [2]
Lấy [1] chia cho [2] ta sẽ ra được số trang
Để làm tròn các giá trị từ (x.1 -> x.9 thành 1+x) ta dùng hàm ceil()

CODE
$number_of_page = ceil ( mysql_num_rows( $sql_query ) / $rows_per_page );


7. Nếu số trang lớn hơn 1 thì sẽ tiến hành liệt kê các trang

CODE
if ( $number_of_page > 1 )
{
$list_page = " <td> Trang: </td>";

// Tiến hành in từng trang
for ( $i = 1; $i <= $number_of_page; $i++ )
{
// Nếu $i bằng $page hiện giờ sẽ in đậm để nhận biết đang xem trang nào
if ( $i == $page )
{
$list_page .= " <td>[ <b>{$i}</b> ]</td> ";
}
// Ngược lại...
else
{
$list_page .= "<td><a href='list.php?page={$i}'> {$i} </a></td>";
}
}
}


8. Đặt biến $i bằng 0

$i = 0;

9. Liệt kê tất cả các dòng trong 1 table

CODE
while ( $result = mysql_fetch_array ( $sql_query ) )
{
// Nếu như số dòng liệt kê lớn hơn hoặc bằng $page_start thì sẽ in tiếp tục
if ( $i >= $page_start )
{
print $result[noidung]; // Với field noidung là do bạn đặt, ở đây L chỉ ví dụ
}

// Gia tăng giá trị $i theo từng dòng
// Lúc đầu ta đặt biến $i là 0, vậy nếu có 4 dòng thì biến $i sẽ gia tăng cho đến khi bằng 4
$i++;

// Nếu như số dòng đang liệt kê lớn hơn $page_end thì sẽ kết thúc vòng lặp bằng "break"
if ($i >= $page_end)
{
break;
}
}


10. Ở trên ta đã nạp nội dung cho biến $list_page, bây giờ thì in nó ra: (Design what to do )

CODE
print <<<EOF
<table cellspacing="0" cellpadding="0" border="0">
<tr>
{$list_page}
</tr>
</table>
EOF;
Trả Lời Với Trích Dẫn
Trả lời


Ðang đọc: 1 (0 thành viên và 1 khách)
 
Ðiều Chỉnh
Xếp Bài

Chuyển đến


Múi giờ GMT. Hiện tại là 03:35 PM.


Connect