javascript,, document.onkeydown = function(e) {, var ev = document.all ? window.event : e;, if (ev.keyCode == 116) {, alert("请不要刷新页面,谢谢!");, return false;, }, },,
“,,将上述代码添加到织梦CMS文章模板的相应位置,即可实现防刷新功能。
织梦CMS(DedeCMS)是一款广泛使用的开源内容管理系统,常用于构建各种类型的网站,在实际应用中,文章的点击计数器存在一个常见的问题:只要刷新页面,点击数就会增加,为了解决这一问题并精确统计热门文章的阅读量,可以采用防刷新机制,以下是具体的代码实现和相关说明:
<?php $__ONLYDB = true; require_once(dirname(__FILE__) . "/../include/config_base.php"); session_start(); // 新加入 if (empty($aid)) $aid = "0"; $aid = ereg_replace("[^09]", "", $aid); if (empty($mid)) $mid = "0"; $mid = ereg_replace("[^09]", "", $mid); if (!isset($_SESSION['c_time' . $aid])) { // 如果第一次访问,设定时间戳,并允许增加 $_SESSION['c_time' . $aid] = time(); $dsql = new DedeSql(false); $dsql>ExecuteNoneQuery("Update dede_archives set click=click+1 where ID='$aid'"); if (!empty($mid)) { $dsql>ExecuteNoneQuery("Update dede_member set pageshow=pageshow+1 where ID='$mid'"); } if (!empty($view)) { $row = $dsql>GetOne("Select click From dede_archives where ID='$aid'"); echo "document.write('" . $row[0] . "');r "; } $dsql>Close(); exit(); } elseif (time() $_SESSION['c_time' . $aid] < 3600) { // 如果在一小时内刷新页面,则不增加,按此可以设置永远不增加 exit(); } else { // 如果超过一小时,则重新计时,并允许增加 $allow_insert = true; unset($_SESSION['c_time' . $aid]); } ?>
上述代码主要通过以下几个步骤实现防刷新机制:
1、引入配置:使用require_once
函数引入基础配置文件config_base.php
。
2、启动会话:通过session_start()
函数启动会话,以便在用户访问时记录相关信息。
3、参数处理:对传入的文章ID($aid
)和会员ID($mid
)进行校验和清理,确保其只包含数字。
4、首次访问判断:如果当前会话中没有对应文章的时间戳($_SESSION['c_time'.$aid]
),则认为用户是首次访问该文章,此时更新数据库中的点击数,并记录访问时间戳。
5、刷新限制:若用户在一小时内刷新页面,则不增加点击数;超过一小时后,重置时间戳并允许再次增加点击数。
FAQs:
1、Q: 为什么需要防刷新机制?
A: 防刷新机制主要是为了防止用户通过刷新页面来人为增加文章的点击次数,从而影响对热门文章的准确统计,这样可以更真实地反映文章的受欢迎程度。
2、Q: 如何修改现有系统的代码以实现防刷新机制?
A: 只需将系统中的plus/count.php
文件替换为上述代码即可实现防刷新功能,具体步骤如下:
1. 备份原有的plus/count.php
文件。
2. 将上述代码保存为新的plus/count.php
文件。
3. 上传并覆盖服务器上的同名文件。
通过以上步骤,你可以有效地防止用户通过刷新页面来增加点击数,从而获得更加准确的数据统计结果。
下面是一个使用织梦CMS(一个流行的PHP内容管理系统)实现文章防刷新机制的代码示例,该机制通过在数据库中添加一个额外的字段来记录访问时间,并在每次访问时检查该时间。
代码片段 | 说明 |
数据库表结构调整 | 在文章表(通常为dede_arctype )中添加一个新的字段,如last_visit_time 。 |
| “`sql
ALTER TABLEdede_arctype
ADDlast_visit_time
DATETIME DEFAULT NULL;
|修改文章访问函数 | 在访问文章的函数中,更新last_visit_time
字段。 | | ```php function UpdateLastVisitTime($aid) { $db = DB::getInstance(); $sql = "UPDATEdede_arctype
SETlast_visit_time
= NOW() WHEREid
= '$aid'"; $db>query($sql); }
|检查防刷新逻辑 | 在文章访问逻辑中,检查last_visit_time
字段,防止短时间内重复访问。 |
| “`php
function CheckRefresh($aid) {
$db = DB::getInstance();
$sql = “SELECTlast_visit_time
FROMdede_arctype
WHEREid
= ‘$aid’”;
$result = $db>query($sql);
$row = $result>fetch_assoc();
$currentTime = date(‘Ymd H:i:s’);
$timeDiff = strtotime($currentTime) strtotime($row[‘last_visit_time’]);
if ($timeDiff < 30) { // 设置30秒内不允许刷新
return false;
}
UpdateLastVisitTime($aid); // 更新访问时间
return true;
|调用检查函数 | 在显示文章内容之前,调用CheckRefresh
函数检查是否允许访问。 |
| ```php
$aid = $_GET['aid']; // 获取文章ID
if (!CheckRefresh($aid)) {
echo "请不要刷新页面,系统检测到重复访问。";
exit;
}
|显示文章内容 | 如果通过检查,则显示文章内容。 |
| “`php
// 显示文章内容…
以上代码仅为示例,您可能需要根据实际情况进行修改,根据织梦CMS版本的不同,代码可能会有所差异。