核心函數:genpage()
<?php
function genpage(string &$sql, int $pageSize = 10): void
{
global $pages, $sums, $eachpage, $page;
$page = max(1, (int)($_GET['page'] ?? 1));
$eachpage = $pageSize;
// 從原 SQL 解析出 FROM 子句以降後,組成 COUNT(*) 查詢
$fromPos = stripos($sql, ' from ');
if ($fromPos === false) {
die('SQL 缺少 FROM 子句');
}
$countSql = 'SELECT COUNT(*) AS total' . substr($sql, $fromPos);
$res = mysql_query($countSql) or die(mysql_error());
$row = mysql_fetch_array($res);
$sums = (int)$row[0];
$pages = max(1, (int)ceil($sums / $eachpage));
if ($page > $pages) $page = $pages;
$offset = ($page - 1) * $eachpage;
$sql .= " LIMIT $offset, $eachpage";
}
?>
顯示函數:showpage()
function showpage(): void
{
global $pages, $sums, $eachpage, $page;
$link = $_SERVER['PHP_SELF'];
echo "記錄 $sums : $eachpage ";
echo "頁數 $page / $pages ";
$start = max(1, $page - 5);
$end = min($pages, $page + 5);
echo "[<a href='$link?page=1'>首頁</a>] ";
for ($i = $start; $i <= $end; $i++) {
if ($i === $page) {
echo "<b><strike>[$i]</strike></b> ";
} else {
echo "<a href='$link?page=$i'>[$i]</a> ";
}
}
echo "[<a href='$link?page=$pages'>末頁</a>]";
}
使用範例
<?php
$sql = "SELECT * FROM articles WHERE status = 1 ORDER BY id DESC";
genpage($sql, 15); // 修改 $sql 加上 LIMIT
$res = mysql_query($sql);
while ($row = mysql_fetch_assoc($res)) {
echo $row['title'] . '<br>';
}
showpage();
?>
⚠️ 重要警示
- mysql_* 函數已於 PHP 7.0 移除,現代專案請改用 PDO 或 mysqli
- 直接拼接 SQL 存在注入風險,請使用預處理語句
- 全域變數耦合度高,建議封裝為類別
現代 PDO 版分頁類別
class Pager
{
public function __construct(private PDO $pdo, private int $perPage = 15) {}
public function paginate(string $baseSql, array $params = [], int $page = 1): array
{
$page = max(1, $page);
$offset = ($page - 1) * $this->perPage;
// 總筆數
$countSql = preg_replace('/^SELECT .+ FROM/i', 'SELECT COUNT(*) FROM', $baseSql);
$stmt = $this->pdo->prepare($countSql);
$stmt->execute($params);
$total = (int)$stmt->fetchColumn();
// 分頁資料
$dataSql = $baseSql . " LIMIT ?, ?";
$stmt = $this->pdo->prepare($dataSql);
$allParams = array_merge($params, [$offset, $this->perPage]);
$stmt->execute($allParams);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
return [
'data' => $rows,
'current_page' => $page,
'per_page' => $this->perPage,
'total' => $total,
'last_page' => max(1, (int)ceil($total / $this->perPage)),
];
}
public function renderLinks(array $pager, string $urlPattern): string
{
$html = '';
for ($i = 1; $i <= $pager['last_page']; $i++) {
$class = $i === $pager['current_page'] ? 'active' : '';
$html .= "<a class='$class' href='" . sprintf($urlPattern, $i) . "'>$i</a> ";
}
return $html;
}
}