dede统计24小时如何实现?

99ANYc3cd6
预计阅读时长 15 分钟
位置: 首页 DEDE建站 正文

核心思路

无论统计什么,核心思路都是一样的:

  1. 确定时间起点:获取当前时间,并减去24小时,得到24小时前的时间戳。
  2. 编写SQL查询:使用SELECT COUNT(*) FROM ... WHERE arc.senddate > ? 这样的SQL语句,查询在指定时间之后(即24小时内)的数据条数。
  3. 在模板中调用:将查询结果输出到模板文件中。

DedeCMS提供了强大的全局变量功能,我们可以通过修改 include/common.func.php 文件来创建一个可全局调用的函数,然后在任意模板中使用。


第一步:创建全局统计函数(通用方法)

这个方法最推荐,因为它一劳永逸,之后在所有模板里都可以直接调用。

  1. 打开你的DedeCMS后台目录下的文件:/include/common.func.php
  2. 在文件末尾的 ?> 之前,添加以下任意一个或多个你需要的函数:

函数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 文件,并且上传到了服务器。
  • 这个方法获取的数据是实时的,每次刷新页面都会重新查询数据库。

第三步:进阶用法 - 缓存优化(可选)

如果你的网站流量较大,频繁查询数据库可能会影响性能,这时可以加入缓存机制。

  1. 修改 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;
}
  1. 在模板中调用方式不变,依然是 {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 的值。

这种方法的缺点:

  • 代码冗余:如果要在多个页面显示,每个页面都要写一遍SQL。
  • 维护困难:未来如果需要修改SQL,需要找到所有模板文件进行修改。
  • 性能问题:无法使用缓存,每次都会查询数据库。
方法 优点 缺点 推荐场景
修改 common.func.php 代码复用性强,维护方便,可配合缓存优化性能 需要修改核心文件,对新手有门槛 绝大多数情况下的首选
直接在模板用 sql 简单快速,无需修改文件 代码冗余,维护困难,性能较差 临时测试、仅在单个页面使用的小功能
修改 common.func.php + 缓存 性能最佳,代码复用性强 实现稍复杂 访问量大的首页或关键数据展示区

对于绝大多数用户,我强烈推荐你使用第一种方法(修改 common.func.php,这是最规范、最灵活、最利于长期维护的解决方案。

-- 展开阅读全文 --
头像
dede怎么调用作者
« 上一篇 今天
dede建站教程从零开始怎么学?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码