核心思路
无论统计什么,核心思路都是一样的:
- 确定时间起点:获取当前时间,并减去24小时,得到24小时前的时间戳。
- 编写SQL查询:使用
SELECT COUNT(*) FROM ... WHERE arc.senddate > ?这样的SQL语句,查询在指定时间之后(即24小时内)的数据条数。 - 在模板中调用:将查询结果输出到模板文件中。
DedeCMS提供了强大的全局变量功能,我们可以通过修改 include/common.func.php 文件来创建一个可全局调用的函数,然后在任意模板中使用。
第一步:创建全局统计函数(通用方法)
这个方法最推荐,因为它一劳永逸,之后在所有模板里都可以直接调用。
- 打开你的DedeCMS后台目录下的文件:
/include/common.func.php - 在文件末尾的
?>之前,添加以下任意一个或多个你需要的函数:
函数1:统计24小时内发布的文章数量
/**
* 统计24小时内发布的文章数量
* @return int
*/
function GetLast24HoursArchives()
{
$dtime = time() - 24 * 3600; // 获取24小时前的时间戳
$row = $GLOBALS['dsql']->GetOne("SELECT COUNT(*) AS dd FROM `#@__archives` WHERE `senddate` > $dtime");
return $row['dd'];
}
函数2:统计24小时内发布的会员数量
/**
* 统计24小时内注册的会员数量
* @return int
*/
function GetLast24HoursMembers()
{
$dtime = time() - 24 * 3600; // 获取24小时前的时间戳
$row = $GLOBALS['dsql']->GetOne("SELECT COUNT(*) AS dd FROM `#@__member` WHERE `jointime` > $dtime");
return $row['dd'];
}
函数3:统计24小时内的评论数量
/**
* 统计24小时内的评论数量
* @return int
*/
function GetLast24HoursComments()
{
$dtime = time() - 24 * 3600; // 获取24小时前的时间戳
// 注意:评论表可能是 `#@__feedback` 或 `#@__forum_posts`,根据你的实际情况调整
$row = $GLOBALS['dsql']->GetOne("SELECT COUNT(*) AS dd FROM `#@__feedback` WHERE `dtime` > $dtime");
return $row['dd'];
}
重要提示:
#@__是DedeCMS的数据表前缀,如果你的前缀不是dede_,请自行替换。- 评论表的结构可能因不同版本而异,
dtime字段存储评论时间戳,如果不存在,请替换为正确的字段名(如pubdate)。
第二步:在模板中调用函数
完成第一步后,你就可以在任何DedeCMS的模板文件(.htm)中调用这些函数了。
调用方法非常简单:使用 示例模板代码: 假设你想在首页的某个位置显示这些统计数据,可以像下面这样写: 注意事项: 如果你的网站流量较大,频繁查询数据库可能会影响性能,这时可以加入缓存机制。 缓存机制的优点: 何时使用缓存? 如果你不想修改核心文件,也可以直接在模板中使用 示例:在首页模板中直接查询 代码解释: 这种方法的缺点: 对于绝大多数用户,我强烈推荐你使用第一种方法(修改 {dede:global name='函数名'/}
<div class="stats-box">
<h3>24小时数据统计</h3>
<ul>
<li>新增文章:<strong>{dede:global name='GetLast24HoursArchives'/}</strong> 篇</li>
<li>新增会员:<strong>{dede:global name='GetLast24HoursMembers'/}</strong> 位</li>
<li>新增评论:<strong>{dede:global name='GetLast24HoursComments'/}</strong> 条</li>
</ul>
</div>
common.func.php 文件,并且上传到了服务器。
第三步:进阶用法 - 缓存优化(可选)
common.func.php 中的函数,以 GetLast24HoursArchives 为例:/**
* 统计24小时内发布的文章数量 (带缓存)
* @return int
*/
function GetLast24HoursArchives()
{
$cacheKey = 'last_24_hours_archives_count';
$cacheTime = 3600; // 缓存1小时,可根据需要调整
// 尝试从缓存读取
$count = GetCache($cacheKey);
if ($count !== false) {
return $count;
}
// 缓存不存在,则查询数据库
$dtime = time() - 24 * 3600;
$row = $GLOBALS['dsql']->GetOne("SELECT COUNT(*) AS dd FROM `#@__archives` WHERE `senddate` > $dtime");
$count = $row['dd'];
// 将结果写入缓存
SetCache($cacheKey, $count, $cacheTime);
return $count;
}
{dede:global name='GetLast24HoursArchives'/}。
第四步:直接在模板中使用SQL(不推荐,但可行)
{dede:sql} 标签,这种方法简单直接,但不够灵活,且如果多处使用会造成代码冗余。<div>
24小时新增文章:{dede:sql sql="SELECT COUNT(*) AS dd FROM `#@__archives` WHERE senddate > UNIX_TIMESTAMP(NOW() - INTERVAL 24 HOUR)"}[field:dd/]{/dede:sql} 篇
</div>
dede:sql 用于执行自定义SQL语句。UNIX_TIMESTAMP(NOW() - INTERVAL 24 HOUR) 是一个MySQL函数,它直接计算出当前时间往前推24小时的时间戳,这种方法比在PHP中计算更直观。[field:dd/] 用于输出SQL查询结果中 AS dd 的值。
方法
优点
缺点
推荐场景
修改
common.func.php代码复用性强,维护方便,可配合缓存优化性能
需要修改核心文件,对新手有门槛
绝大多数情况下的首选
直接在模板用
sql简单快速,无需修改文件
代码冗余,维护困难,性能较差
临时测试、仅在单个页面使用的小功能
修改
common.func.php + 缓存性能最佳,代码复用性强
实现稍复杂
访问量大的首页或关键数据展示区
common.func.php),这是最规范、最灵活、最利于长期维护的解决方案。
