才能正確的擷取目前的資料範圍。
假設使用sqlite資料庫,程式碼如下:
$dbh = new PDO('sqlite:question.db');
// 取得資料總筆數
$rs = null;
$num = null;
$sth0 = $dbh->query("SELECT count(*) FROM questions");
$rs = $sth0->fetch();
$num = $rs[0];
//echo $num;
// 一頁顯示20筆資料
$page_size = 20;
// 總頁數(無條件進位)
$page_count = ceil($num/$page_size);
// 目前所在頁數($_GET['anchor']為使用者點擊所要前往的頁數)
$page_index = 0;
if ($_GET['anchor']) {
$page_index = $_GET['anchor'];
} else {
$page_index = 1;
}
// 目前頁面起始資料編號
$item_start = 0;
if ($page_index == 1) {
$item_start = 1;
} else {
$item_start = ($page_index-1)*$page_size+1;
}
// 目前頁面最後資料編號
$item_end = $page_index*$page_size;
if ($item_end > $num) {
$item_end = $num;
}
// page bar 起始頁(根據page_index座落在那個區間來判斷)
// 這裡設定page bar一次能顯示十個頁面的連結
$page_start = 0;
$start = 1;
$end = 10;
$count = 1;
for ($count; $count<=ceil($page_count/10); $count++) {
if ($page_index>=$start && $page_index<=$end) {
$page_start = $start;
break;
} else {
$start = $start + 10;
$end = $end + 10;
}
}
// page bar 最後頁
$page_end = 0;
if ($page_start+9 < $page_count) {
$page_end = $page_start+9;
} else {
$page_end = $page_count;
}
// 根據目前頁面的資料範圍擷取範圍內資料
$result = null;
$sth1 = $dbh->prepare("SELECT * FROM questions
WHERE id >= ".$item_start." AND id <= ".$item_end);
$sth1->execute();
$result = $sth1->fetchAll();
這裡是假設資料表的id欄位是從1開始的連續編號,如果不是的話,上述根據頁面資料範圍擷取資料庫範圍內資料的方法則不適用。
再來概據選取頁面,在html中印出目前的page bar範圍:
<div>
<?php
if ($page_count > 0) {
if ($page_start != 1) {
?>
<a href="./list.php?anchor=>?php echo $page_start-1; ?>">上10頁</a>
<?php
}
for ($page_start; $page_start<=$page_end; $page_start++) {
if ($page_start == $page_index) {
echo $page_start;
} else {
?>
<a href="./list.php?anchor=<?php echo $page_start; ?>"></a>
<?php
}
}
if ($page_end<$page_count) {
?>
<a href="./list.php?anchor=<?php echo $page_end+1; ?>">下10頁</a>
<?php
}
}
?>
</div>
下頁是實際頁面:

沒有留言:
張貼留言