在 Web 開發中,分頁是處理大量資料時不可或缺的功能。本文介紹一個原創的 PHP 通用分頁函數 fPageCount(),支援首頁、尾頁、上一頁、下一頁、上十頁、下十頁,以及頁碼跳轉(下拉選單或輸入框)等完整功能,適合快速整合至各類專案中。
function fPageCount($TotalResult, $numPerPage, $Page)
函數開頭定義顯示頁碼數量($NaviLength = 10)、跳轉樣式($showMorePageGo_Type_)、導航圖示(使用 Webdings 字型)等常數。接著透過 $_SERVER['QUERY_STRING'] 取得目前查詢字串,並移除既有的 page 參數,重新組合成乾淨的分頁連結基底 $toPage_。
$tpagecount = ceil($TotalResult / $numPerPage);
$nowCoolPage = ceil($Page / $NaviLength);
將所有頁碼切分為每 10 頁一組的「區塊」,$nowCoolPage 代表目前所在的區塊編號。
若在第一區塊,顯示灰色不可點擊的首頁與上十頁圖示;否則輸出可點擊的連結,目標頁碼分別為 1 與 $Page - $NaviLength。上一頁同理,若 $Page > 1 則輸出連結,否則灰色禁用。
迴圈跑 1 到 $NaviLength,計算實際頁碼 $nowPage。若等於目前頁碼則以 <b> 標籤高亮,否則輸出連結;超過總頁數則 break 跳出。
邏輯與上一頁對稱:若在最後一區塊則灰色禁用,否則輸出對應連結($Page + 1、$Page + $NaviLength、$tpagecount)。
$showMorePageGo_Type_ == 1 時,輸出文字輸入框與按鈕,透過 JavaScript 跳轉。selected。最後附加「每頁筆數、目前頁碼/總頁數、總資料筆數」等統計字串,方便前端直接顯示。
<?php echo fPageCount($TotalResult, $numPerPage, $page); ?>
只需在顯示列表的頁面呼叫此函數,即可獲得完整分頁導航。
sprintf 或 Heredoc 提升可讀性。function fPageCount($TotalResult,$numPerPage,$Page){
$NaviLength = 10;
$showMorePageGo_Type_ = 0;
$int_showNumberLink_ = '十';
$nonLinkColor_ = "#999999";
$toF_ = '<font face=webdings title="首頁">9</font>';
$toP10_ = ' <font face=webdings title="上十頁">7</font>';
$toP1_ = ' <font face=webdings title="上一頁">3</font>';
$toN1_ = ' <font face=webdings title="下一頁">4</font>';
$toN10_ = ' <font face=webdings title="下十頁">8</font>';
$toL_ = '<font face=webdings title="最後一頁">:</font>';
$page_index = "";
$tpagecount = ceil($TotalResult/$numPerPage);
$nowCoolPage = ceil($Page/$NaviLength);
$toPage_ = $_SERVER['QUERY_STRING'];
if ($toPage_ == '') {
$toPage_ = "?page=";
} else {
$toPage_ = preg_replace("/&?page=d+/", '', $toPage_);
$toPage_ = "?".$toPage_."&page=";
}
if($nowCoolPage == 1){
$page_index.='<font color="'.$nonLinkColor_.'" title="首頁">'.$toF_.'</font> ';
$page_index.='<font color="'.$nonLinkColor_.'" title="上'.$int_showNumberLink_.'頁">'.$toP10_.'</font> ';
}else{
$preRow = $Page-$NaviLength;
$page_index.='<a href="'.$toPage_.'1" title="首頁">'.$toF_.'</a> ';
$page_index.='<a href="'.$toPage_.$preRow.'" title="上'.$int_showNumberLink_.'頁">'.$toP10_.'</a> ';
}
$upRow = $Page-1;
$downRow = $Page+1;
if ($upRow>0){
$page_index.='<a href="'.$toPage_.$upRow.'" title="上一頁">'.$toP1_.'</a> ';
}else{
$page_index.='<font color="'.$nonLinkColor_.'" title="上一頁">'.$toP1_.'</font> ';
}
for($i=1;$i<=$NaviLength;$i++){
$nowPage=($nowCoolPage-1)*$NaviLength+$i;
if($nowPage!=$Page){
if($nowPage<=$tpagecount){
$page_index.=' <a href="'.$toPage_.$nowPage.'>" .$nowPage. "</a> ";
}else{
break;
}
}else{
if($tpagecount != 1){
$page_index.='<b>'.$nowPage.'</b>';
}
}
}
if ($downRow <= $tpagecount){
$page_index.='<a href="'.$toPage_.$downRow.'" title="下一頁">'.$toN1_.'</a> ';
}else{
$page_index.='<font color="'.$nonLinkColor_.'" title="下一頁">'.$toN1_.'</font> ';
}
if($nowCoolPage == $tpagecount){
$page_index.=' <font color="'.$nonLinkColor_.'" title="下'.$int_showNumberLink_.'頁">'.$toN10_.'</font> ';
$page_index.='<font color="'.$nonLinkColor_.'" title="尾頁">'.$toL_.'</font>';
}else{
$nextRow = $Page+$NaviLength;
$theEndRow = $tpagecount;
$page_index.=' <a href="'.$toPage_.$nextRow.'" title="下'.$int_showNumberLink_.'頁">'.$toN10_.'</a> ';
$page_index.='<a href="'.$toPage_.$theEndRow.'" title="尾頁">'.$toL_.'</a>';
}
if ($showMorePageGo_Type_ ==1){
$Show_Page_i = $Page + 1;
if ($Show_Page_i>$tpagecount) $Show_Page_i = 1;
$page_index.=" 跳轉<input type='text' id='skip' value='' onkeyup='this.value=this.value.replace(/[^d]+/,'')' style='width:40px'/> <input type='button' value='確定' class='btn' onclick='location.href=\"?page=\"+$(\"skip\").value+\"".$toPage_."\";'/>n";
}else{
$page_index.=" 跳轉:<select name='select' size='1' style='font-size: 12px' onchange='javascript:window.location.href=this.options[this.selectedIndex].value'>";
for($i=1;$i<=$tpagecount;$i++){
if($Page==$i){
$selected=" selected";
}else{
$selected="";
}
$page_index.=" <option value=".$toPage_.$i;
$page_index.=$selected." style='color:#FF0000'";
$page_index.=">第".$i."頁</option>";
}
$page_index.="</select>";
}
$page_index.=$p_.$sp2_." 每頁<b>".$numPerPage."</b>個記錄,現在是:<b><span class='tx'>".$sp2_.$Page."</span>/".$tpagecount."</b>頁,共<b><span id='recordcount'>".$sp2_.$TotalResult."</span></b>個記錄。";
return $page_index;
}