帶搜索條件的分頁是後台管理、列表頁的標配需求。關鍵在於「分頁鏈接攜帶搜索參數」、「總數查詢復用 WHERE 條件」、「頁碼邊界保護」。本文提供一個結構清晰、可直接落地的完整實現。
<?php
// 模擬數據庫連接(實際項目用 PDO/Mysqli)
$conn = mysqli_connect('localhost', 'root', '', 'test');
// 1. 構建 WHERE 條件與 URL 參數
$whereList = [];
$urlList = [];
if (!empty($_GET['title'])) {
$title = mysqli_real_escape_string($conn, $_GET['title']);
$whereList[] = "title LIKE '%{$title}%'";
$urlList[] = "title=" . urlencode($_GET['title']);
}
if (!empty($_GET['keywords'])) {
$kw = mysqli_real_escape_string($conn, $_GET['keywords']);
$whereList[] = "keywords LIKE '%{$kw}%'";
$urlList[] = "keywords=" . urlencode($_GET['keywords']);
}
if (!empty($_GET['author'])) {
$author = mysqli_real_escape_string($conn, $_GET['author']);
$whereList[] = "author LIKE '%{$author}%'";
$urlList[] = "author=" . urlencode($_GET['author']);
}
$where = $whereList ? "WHERE " . implode(' AND ', $whereList) : '';
$urlParams = $urlList ? '&' . implode('&', $urlList) : '';
// 2. 總記錄數
$sqlCount = "SELECT COUNT(*) FROM news {$where}";
$resCount = mysqli_query($conn, $sqlCount);
$total = mysqli_fetch_row($resCount)[0];
// 3. 分頁參數
$pageSize = 5;
$maxPage = ceil($total / $pageSize);
$page = isset($_GET['page']) ? max(1, min((int)$_GET['page'], $maxPage)) : 1;
$offset = ($page - 1) * $pageSize;
// 4. 數據查詢
$sqlData = "SELECT * FROM news {$where} LIMIT {$offset}, {$pageSize}";
$resData = mysqli_query($conn, $sqlData);
?>
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>搜索分頁演示</title></head>
<body>
<form method="get">
標題:<input name="title" value="<?= htmlspecialchars($_GET['title'] ?? '') ?>" size="12">
關鍵字:<input name="keywords" value="<?= htmlspecialchars($_GET['keywords'] ?? '') ?>" size="12">
作者:<input name="author" value="<?= htmlspecialchars($_GET['author'] ?? '') ?>" size="12">
<button type="submit">搜索</button>
<a href="?>重置</a>
</form>
<table border="1" cellpadding="5" cellspacing="0" width="100%">
<tr><th>ID</th><th>標題</th><th>關鍵字</th><th>作者</th><th>日期</th><th>內容</th></tr>
<?php while ($row = mysqli_fetch_assoc($resData)): ?>
<tr>
<td><?= $row['id'] ?></td>
<td><?= htmlspecialchars($row['title']) ?></td>
<td><?= htmlspecialchars($row['keywords']) ?></td>
<td><?= htmlspecialchars($row['author']) ?></td>
<td><?= date('Y-m-d H:i:s', $row['addtime']) ?></td>
<td><?= htmlspecialchars($row['content']) ?></td>
</tr>
<?php endwhile; ?>
</table>
<div style="margin-top:15px; text-align:center;">
<?php
echo "當前 {$page}/{$maxPage} 頁 共 {$total} 條 ";
if ($page > 1) echo "<a href='?page=1{$urlParams}'>首頁</a> ";
if ($page > 1) echo "<a href='?page=" . ($page-1) . "{$urlParams}'>上一頁</a> ";
if ($page < $maxPage) echo "<a href='?page=" . ($page+1) . "{$urlParams}'>下一頁</a> ";
if ($page < $maxPage) echo "<a href='?page={$maxPage}{$urlParams}'>尾頁</a> ";
?>
</div>
</body>
</html>
$_GET,構建 $whereList(SQL 片段)與 $urlList(URL 參數)雙數組,保持一一對應mysqli_real_escape_string() 轉義,或改用 PDO 預處理 ? 佔位符urlencode() 處理中文/特殊字符,htmlspecialchars() 輸出到表單值防 XSSmax(1, min($page, $maxPage)) 確保頁碼合法$urlParams,保持搜索狀態COUNT(*) 結果 1-5 分鐘,減輕 DB 壓力fetch() 獲取片段 HTML 替換 tbody/list/page/2/title/xxx,利於 SEO$where 導出完整 Excel/CSVurlencode 導致中文參數丟失或報錯LIMIT offset, size 深分頁性能劣化(百萬級改用游標/ID 定位)這個模板結構清晰、邏輯完整,復制到項目中按實際表結構調整字段即可使用,是後台列表頁的標準寫法。