今天刚搭建这个论坛系统发现有刷帖子浏览量的BUG,分享一下自己的解决过程和方案

lianjin 6月前 50

一个帖子打开以后,一直按F5刷新帖子页面 浏览量会一直不停的往上涨

刷新一次就增加一次 所以我就跑到这个论坛开发者的官网去问了下面的问题,但是最终没人给出解决方案

我看了一下 官网的版本也是有这个BUG的,

可否修复一下这个BUG

通过帐号或者浏览者IP地址来判断一下 防止这种情况?

============我自己增加代码解决这个bug了============

首先 我不是做PHP的 用到的所有资料都是临时查和自己猜出来的

所以万一有BUG 本人不负任何责任哦 (我自己测试反正是没BUG)

首先数据库增加表

--
-- 表的结构 `bbs_threaduid`
--

CREATE TABLE `bbs_threaduid` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `tid` int(11) NOT NULL,
  `uid` int(11) NOT NULL,
  `userip` int(11) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Indexes for table `bbs_threaduid`
--
ALTER TABLE `bbs_threaduid`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `tid` (`tid`,`uid`,`userip`);

--
-- 在导出的表使用AUTO_INCREMENT
--

--
-- 使用表AUTO_INCREMENT `bbs_threaduid`
--
ALTER TABLE `bbs_threaduid`
  MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=9;
COMMIT;

然后 route/thread.php 中

thread_inc_views($tid);
修改为
thread_inc_views($tid,$uid,$longip);

然后 model/thread.func.php 中


//在第四行代码处 增加

function threaduid__create($arr){    
// hook model_thread__create_start.php   
 $r = db_insert('threaduid', $arr);  
   // hook model_thread__create_end.php  
return $r;
}

//然后把
//function thread_inc_views($tid,$n = 1) {.....}  方法改为

function thread_inc_views($tid, $uid, $longip, $n = 1)
{
    // hook model_thread_inc_views_start.php
    global $conf, $db;
    $tablepre = $db->tablepre;
    if (!$conf['update_views_on']) return TRUE;
    $sqladd = !in_array($conf['cache']['type'], array('mysql', 'pdo_mysql')) ? '' : ' LOW_PRIORITY';
    $r = true;
    $uidtmp=99999;//游客的ID 设为99999 
    if($uid == null ||$uid==0){
        $uidtmp=99999;
    }else{
    $uidtmp=$uid;
    }
    $counts = db_count("threaduid",
        array('tid' => $tid, 'uid' => $uidtmp, 'userip' => $longip));

    if ($counts <= 0) {
       // 创建主题
        $threaduid = array(
            'tid' => $tid,
            'uid' => $uidtmp,
            'userip' => $longip,
        );
        $tids = threaduid__create($threaduid);
        if($tids){
        $r = db_exec("UPDATE$sqladd `{$tablepre}thread` SET views=views+$n WHERE tid='$tid'");
        }

    }
    // hook model_thread_inc_views_end.php
    return $r;
}

最终再去后台管理里面清除一下缓存即可

最后于 6月前 被lianjin编辑 ,原因:
最新回复 (1)
  • lianjin 6月前
    0 引用 2
    之前改的时候 遇到一个问题   没弄明白 threaduid__create 方法返回的是插入的数据的ID  看了官方文档才知道
    由于不会用 phpmyadmin 找了大佬帮忙 增加了 threaduid表的自增ID   就解决这个问题了
    • Deep♂Dark♂Fantastic
      3
        立即登录 立即注册 
返回