首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 實現搜索條件保持的分頁顯示完整案例

     編輯:PHP 綜合知識

帶搜索條件的分頁是後台管理、列表頁的標配需求。關鍵在於「分頁鏈接攜帶搜索參數」、「總數查詢復用 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>

核心邏輯拆解

  1. 條件收集:遍歷 $_GET,構建 $whereList(SQL 片段)與 $urlList(URL 參數)雙數組,保持一一對應
  2. SQL 注入防護:mysqli_real_escape_string() 轉義,或改用 PDO 預處理 ? 佔位符
  3. URL 編碼:urlencode() 處理中文/特殊字符,htmlspecialchars() 輸出到表單值防 XSS
  4. 頁碼邊界:max(1, min($page, $maxPage)) 確保頁碼合法
  5. 分頁鏈接:每個鏈接拼接 $urlParams,保持搜索狀態

進階優化方向

  • PDO 預處理:動態綁定參數,徹底杜絕注入
  • 緩存總數:Redis 緩存 COUNT(*) 結果 1-5 分鐘,減輕 DB 壓力
  • AJAX 分頁:前端攔截分頁點擊,fetch() 獲取片段 HTML 替換 tbody
  • URL 美化:路由重寫為 /list/page/2/title/xxx,利於 SEO
  • 導出功能:復用 $where 導出完整 Excel/CSV

常見坑點提醒

  • 忘記 urlencode 導致中文參數丟失或報錯
  • 分頁鏈接未帶搜索參數,翻頁後條件丟失
  • LIMIT offset, size 深分頁性能劣化(百萬級改用游標/ID 定位)
  • 總數查詢與列表查詢 WHERE 不一致,導致分頁數錯誤

這個模板結構清晰、邏輯完整,復制到項目中按實際表結構調整字段即可使用,是後台列表頁的標準寫法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved