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

PHP 實作「上一篇 / 下一篇」文章導航

     編輯:PHP 綜合知識

核心 SQL 邏輯

  • 上一篇:`id < 當前id`,按 `id DESC` 取第一筆(最近的較小 id)
  • 下一篇:`id > 當前id`,按 `id ASC` 取第一筆(最近的較大 id)

完整程式碼(PDO 版,防注入)

<?php
// 假設已建立 $pdo 連線
$id = (int)($_GET['id'] ?? 0);
if (!$id) exit('參數錯誤');

// 上一篇
$stmt = $pdo->prepare('SELECT id, title FROM article WHERE id < ? ORDER BY id DESC LIMIT 1');
$stmt->execute([$id]);
$prev = $stmt->fetch();

// 下一篇
$stmt = $pdo->prepare('SELECT id, title FROM article WHERE id > ? ORDER BY id ASC LIMIT 1');
$stmt->execute([$id]);
$next = $stmt->fetch();

// 輸出
echo '<div class="article-nav">';
if ($prev) {
    echo '<a href="article.php?id=' . $prev['id'] . '" class="prev">← 上一篇:' . htmlspecialchars($prev['title']) . '</a>';
} else {
    echo '<span class="prev disabled">← 上一篇:無</span>';
}

if ($next) {
    echo '<a href="article.php?id=' . $next['id'] . '" class="next">下一篇:' . htmlspecialchars($next['title']) . ' →</a>';
} else {
    echo '<span class="next disabled">下一篇:無 →</span>';
}
echo '</div>';
?>

進階優化:單一查詢同時取得上/下篇(MySQL 8.0+ / MariaDB 10.2+)

SELECT 
  (SELECT id FROM article WHERE id < ? ORDER BY id DESC LIMIT 1) AS prev_id,
  (SELECT title FROM article WHERE id < ? ORDER BY id DESC LIMIT 1) AS prev_title,
  (SELECT id FROM article WHERE id > ? ORDER BY id ASC LIMIT 1) AS next_id,
  (SELECT title FROM article WHERE id > ? ORDER BY id ASC LIMIT 1) AS next_title;

以預處理綁定 4 次同樣參數,單次往返資料庫,減少連線開銷。

非連續 ID / 軟刪除場景

若資料表有 `deleted_at` 或 `status` 欄位,查詢需加入 `WHERE status = 1 AND deleted_at IS NULL`,並建立複合索引 (status, id) 確保效能。

前端體驗小技巧

  • 用 CSS 隱藏「無」狀態或顯示灰色禁用樣式
  • 可預先 `` 預載上/下篇頁面
  • 若文章量大,考慮改用「相關推薦」取代單純 ID 遞增導航
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved