Thuật toán phân trang trong lập trình PHP & MySQL

Khi truy vấn dữ liệu trong thiết kế website mà nhận được một danh sách kết quả quá dài, người ta thường phải phân trang ứng dụng cho phù hợp (ít nhất là về mặt thẩm mỹ).

Nguyên tắc của việc phân trang ứng dụng như sau:

-> Bước 1: Tính tóan số lượng bản ghi thỏa mãn điều kiện trả về ( thường sử dụng hàm count trong câu lệnh SQL).
-> Bước 2: Xác định số lượng bản ghi sẽ hiển thị trên một trang.
-> Bước 3: Dựa trên các thông tin có được từ bước 1 và 2, xác định được số trang cần hiển thị.
-> Bước 4: Tính toán số lượng bản ghi sẽ hiển thị tính từ trang nào đó do người sử dụng lựa chọn (Sử dụng câu lệnh LIMIT).

Dưới đây tôi sẽ cung cấp cho các bạn 2 function,
– Function GetPageLinks ($Sql, $PageSize): Trả về một chuỗi văn bản chứa số trang hiển thị, với dữ liệu vào bao gồm câu lệnh SQL ($Sql) xác định số lượng bản ghi thỏa mãn điều kiện tìm kiếm, và “kích thước” của một trang ($PageSize)

Mã:
function GetPageLinks($Sql,$PageSize)
{
$result=mysql_query ($Sql);
if (!$result or mysql_num_rows ($result)==0)
{
}
else
{
$line=mysql_fetch_array($result);
$Pages=ceil($line[0]/$PageSize);
if ($Pages>1)
{
$PageLink=”Trang “;
for ($i=0;$i<=$Pages-1;$i++)
{
$j=$i+1;
if ($j==$_GET[“page”])
{
$PageLink.=” {$j} | “;
}
else
{
$NewGet=””;
reset ($_GET);
while (list($key, $val) = each($_GET))
 {    
   if ($key!=’page’)    
   {
$NewGet.=”&{$key}={$val}”;
   }

}
$NewGet.=”&page={$j}”;
$NewGet=substr($NewGet,1);

$PageLink.=” <a href=’?{$NewGet}’>{$j}</a> | “;

}
$PageLink=substr($PageLink,0,-2);
}
}
return $PageLink;
}

Hàm tiếp theo sẽ hiển thị danh sách các record của một trang nào đó, đồng thời ví dụ cách sử dụng hàm GetPageLinks ở trên:
(Ví dụ dưới đây sử dụng một câu truy vấn lấy dữ liệu từ một bảng dulieu với một Category có id xác định)

Mã:
function LoadList()
{
if (isset($_GET[“CatId”]) and is_numeric ($_GET[“CatId”]))
$Dieukien=”where CatId={$_GET[“CatId”]}”;

// Cau lenh truy van chinh khi chua phan trang:
$Sql=”Select * from dulieu {$Dieukien} “;
// Tinh toan so luong ban ghi tra ve:
$PageSize=20;
$CountSQL=”Select count(*) from dulieu {$Dieukien}”;
$PageLinks= GetPageLinks ($CountSQL,$PageSize);

if (isset ($_GET[“page”]) and is_numeric ($_GET[“page”]))
{
$StartNum=$PageSize * ($_GET[“page”]-1); // Xac dinh vi tri ban ghi bat dau
}
else

FOLLOW US
Comments
  1. tai tam

    Anh nên nêu rõ bước nào là 1 là 2 hay 3 chứ hix, anh có thể viết một cái class phân trang xài chung được ko anh :)

    • Admin

      ok. Thời gian tới mình sẽ viết

Leave a Reply

Your email address will not be published. Required fields are marked *