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

PHP 實現文章上一篇/下一篇導航(基於 ID 排序)

     編輯:PHP 綜合知識

核心邏輯

假設文章表主鍵 id 為自增整數,且已發布文章的 ID 連續或不連續均可。當前文章 ID 為 $currentId。

  • 上一篇:ID 小於 當前 ID 的最大值 → WHERE id < $currentId ORDER BY id DESC LIMIT 1
  • 下一篇:ID 大於 當前 ID 的最小值 → WHERE id > $currentId ORDER BY id ASC LIMIT 1

完整 PDO 實現

<?php
// config.php 已建立 $pdo 實例
$currentId = (int)($_GET['id'] ?? 0);
if (!$currentId) die('無效文章 ID');

// 上一篇
$stmtPrev = $pdo->prepare("SELECT id, title FROM articles WHERE id < ? AND status = 1 ORDER BY id DESC LIMIT 1");
$stmtPrev->execute([$currentId]);
$prev = $stmtPrev->fetch(PDO::FETCH_ASSOC);

// 下一篇
$stmtNext = $pdo->prepare("SELECT id, title FROM articles WHERE id > ? AND status = 1 ORDER BY id ASC LIMIT 1");
$stmtNext->execute([$currentId]);
$next = $stmtNext->fetch(PDO::FETCH_ASSOC);
?>
<nav class="article-nav">
    <?php if ($prev): ?>
        <a href="article.php?id=<?php echo $prev['id']; ?>" class="prev">
            ← 上一篇:<?php echo htmlspecialchars($prev['title']); ?>
        </a>
    <?php else: ?>
        <span class="disabled">← 已是第一篇</span>
    <?php endif; ?>
    
    <?php if ($next): ?>
        <a href="article.php?id=<?php echo $next['id']; ?>" class="next">
            下一篇:<?php echo htmlspecialchars($next['title']); ?> →
        </a>
    <?php else: ?>
        <span class="disabled">已是最新篇 →</span>
    <?php endif; ?>
</nav>

進階:同分類導航

若需限制在同一分類(category_id)內翻頁:

$stmtPrev = $pdo->prepare("
    SELECT id, title FROM articles 
    WHERE id < ? AND category_id = ? AND status = 1 
    ORDER BY id DESC LIMIT 1
");
$stmtPrev->execute([$currentId, $categoryId]);

性能優化建議

  • 為 id、status、category_id 建立複合索引:INDEX idx_nav (status, category_id, id)
  • 高并發場景可緩存導航結果(Redis key: `article_nav:{id}`,TTL 1 小時)。
  • 避免使用 MAX(id) 子查詢,ORDER BY ... LIMIT 1 在有索引時極快。

替代方案:按發布時間排序

若業務要求按 published_at 排序而非 ID:

// 上一篇(發布時間更早)
WHERE published_at < ? AND status = 1 ORDER BY published_at DESC LIMIT 1

// 下一篇(發布時間更晚)
WHERE published_at > ? AND status = 1 ORDER BY published_at ASC LIMIT 1

需為 published_at 建立索引,並注意同一秒發布多篇文章的邊界處理(可輔助用 ID 斷 Tie)。

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