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

PHP 實作文章點擊排行統計:按月、週、日追蹤瀏覽數

     編輯:PHP 相關知識

在內容管理系統(CMS)中,記錄文章的點擊數並依時間維度(月、週、日)進行排行顯示,是常見的功能需求。本文將介紹如何使用 PHP 搭配 MySQL,實作一套輕量級的文章統計模組,適合應用於 DedeCMS 等系統中。

核心邏輯與資料表設計

統計功能的核心在於「判斷時間區間」並「遞增對應計數器」。我們需要一張專門的統計表 dede_tongji 來儲存各篇文章的累積點擊數:

  • aid:文章 ID(主鍵)
  • m_total、w_total、d_total、t_total:分別對應月、週、日、總點擊數
  • lasttime:最後一次點擊的 Unix 時間戳,用於判斷是否跨越統計週期

關鍵程式碼解析

以下函式 countdown($field_id) 接收文章 ID,自動處理新增或更新邏輯:

<?php
function countdown($field_id) {
    date_default_timezone_set('Asia/Shanghai');
    global $dsql;
    $tableName = '#@__tongji';
    $now = getdate(time());

    // 查詢該文章是否已有統計紀錄
    $sql = "SELECT * FROM `$tableName` WHERE aid=$field_id";
    $rs = $dsql->ExecuteNoneQuery2($sql);

    if ($rs <= 0) {
        // 首次點擊:初始化統計欄位
        $typeid = $dsql->GetOne("SELECT typeid FROM `#@__archives` WHERE id=$field_id");
        $query = "INSERT INTO `$tableName` VALUES($field_id, {$typeid['typeid']}, 1, 1, 1, 1, {$now[0]})";
        $dsql->ExecNoneQuery($query);
    } else {
        // 既有紀錄:依時間判斷是否重置月/週/日計數
        $row = $dsql->GetOne($sql);
        $old = getdate($row['lasttime']);

        // 月統計:同年同月則遞增,否則歸一
        $m_total = ($now['year'] == $old['year'] && $now['mon'] == $old['mon']) ? $row['m_total'] + 1 : 1;

        // 週統計:計算本週一 00:00 到週日 23:59 的時間區間
        $weekStart = mktime(0,0,0,$now['mon'],$now['mday'],$now['year']) - ($now['wday'] * 86400);
        $weekEnd   = mktime(23,59,59,$now['mon'],$now['mday'],$now['year']) + ((6 - $now['wday']) * 86400);
        $w_total = ($row['lasttime'] >= $weekStart && $row['lasttime'] <= $weekEnd) ? $row['w_total'] + 1 : 1;

        // 日統計:同一天則遞增
        $dayStart = mktime(0,0,0,$now['mon'],$now['mday'],$now['year']);
        $dayEnd   = mktime(23,59,59,$now['mon'],$now['mday'],$now['year']);
        $d_total = ($row['lasttime'] >= $dayStart && $row['lasttime'] <= $dayEnd) ? $row['d_total'] + 1 : 1;

        $t_total = $row['t_total'] + 1; // 總計永遠遞增

        // 寫回資料庫,同步更新主文章表的 click 欄位
        $dsql->ExecuteNoneQuery("UPDATE $tableName SET m_total=$m_total, w_total=$w_total, d_total=$d_total, t_total=$t_total, lasttime={$now[0]} WHERE aid=$field_id");
        $dsql->ExecuteNoneQuery("UPDATE dede_archives SET click=$t_total WHERE id=$field_id");
    }
    return $t_total;
}
countdown($aid); // 模板中直接呼叫
?>

實作要點與優化建議

  1. 時區設定:務必在腳本開頭呼叫 date_default_timezone_set,避免跨時區部署導致統計錯位。
  2. 週期判斷邏輯:週統計以「週一為起始日」為例,若業務需求不同(如週日為起始),需調整 $now['wday'] 的換算方式。
  3. 效能考量:高流量站點建議改用 Redis 暫存計數,定期批次寫入 DB,減少資料庫鎖爭用。
  4. 擴充性:可依同樣邏輯新增「時統計」、「季統計」等維度,只需增加欄位與判斷區塊。

這套機制結構簡單、邏輯清晰,適合中小型 CMS 專案快速整合。若需支援高併發,後續可導入非同步佇列與快取層進行架構升級。

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