思路: 设计表格,对应的文章id(关联):news_id;本机IP;用户ID:user_id;
最后点击事件(last_click_time);点击总数(click_count)!
避免重复多次点击问题,规定IP和最后点击时间作为判断
1.结合最后点击时间和系统时间作对比(本人是半个小时为有效)若为有效点击
count叠加1
2.控制IP作为标识,区分重复!
因为文章ID 是唯一的,所以最后统计是sum聚合求总!
第二种思路:在新闻列表中设计一个点击总数字段,最后调取这个click_counts
时间和记录最后点击次数 代码
private function checkNeedAddClick($tid, $user_info,$type) {
//获取到对应IP
$ip = strval(Comm_Tools::getRemoteAddr());
$time = time() - 1800; //半小时前
$up_flag = false; //更新阅读量标识
$sql = sprintf("SELECT * FROM {$db->_tbl_name} where ip = '%s' AND post_id = %d AND article_type = '%s' LIMIT 1",$ip, intval($tid),$type);
$one_data = $r_db->getAll($sql);
if(count($one_data) > 0 && isset($one_data[0]['id'])) {
//update
if(strtotime($one_data['0']['last_click_date']) < $time){
//已存在并且上次点击时间在半小时前更新点击
$up_ary = [
'last_click_date' => date("Y-m-d H:i:s")
];
if(isset($user_info['userId'])) $up_ary['user_id'] = $user_info['userId'];
$db->update($up_ary, ['id' => $one_data[0]['id']]);
$up_flag = true;
}
} else {
// add
$inser_data = [
'ip' => $ip,
'post_id' => $tid,
'last_click_date' => date("Y-m-d H:i:s"),
'article_type' => $type
];
if(isset($user_info['userId'])){
$inser_data['user_id'] = $user_info['userId'];
}
$db->insert($inser_data);
$up_flag = true;
}
return $up_flag;
}
添加次数,根据上边方法返回一个参数,有效则添加一次数据
$flag = $this->checkNeedAddClick($tid, $user_info,$type);
if($flag) {
if($type==1){
$db3 = Mod_TgPostModel::instance();
$np_id = 'post_id';
}else if($type==2){
$db3 = Mod_TgNewsModel::instance();
$np_id = 'news_id';
}
$w_db = Comm_Db::getDbWrite();
$w_db->query(sprintf("UPDATE {$db3->_tbl_name} SET click_counts = click_counts+1 WHERE {$np_id}=%d",$tid));
}