在內容管理系統(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); // 模板中直接呼叫
?>
date_default_timezone_set,避免跨時區部署導致統計錯位。$now['wday'] 的換算方式。這套機制結構簡單、邏輯清晰,適合中小型 CMS 專案快速整合。若需支援高併發,後續可導入非同步佇列與快取層進行架構升級。