我正在创建一个显示单个新闻项的jsp页面,就像这个StackOverflow页面上的单个问题一样。我需要将视图计数存储在数据库中。
我可以这样简单地增加数据库中的视图计数:
`UPDATE table SET views=views+1 WHERE newsId=4458;`
但是,如果一个用户一次又一次地点击该页面,说50次......那么,在这种情况下,我的观看次数将不代表网站的唯一访问者。我怎么能避免这个?
我想要类似StackOverflow的视图计数系统。
答案 0 :(得分:0)
我说在Javascript中使用计数器。增加身体上的变量onclick。例如:
<script language=”javascript”>
function pageCounter()
{
var counter = 0;
counter = counter++;
}
</script>
<body onclick = “pageCounter()”>
您可以使用onclose更新值..
答案 1 :(得分:0)
一个解决方案可能是你创建一个新表(比如它的被调用的视图),其中包含以下列'viewid''newsid''ipaddress'(显然是newsid是外键) 每当有人访问你的网站,你检查他的IP是否已经在该表的新闻项目中。
Select count(*) AS count FROM views WHERE newsid=1234 AND ipaddress=123.456.125
如果count等于0,则按此插入
INSERT INTO views('newsid', 'ipaddress') VALUES(1234, 123.146.125)
现在,当您想要获取viewcount时:
Select count(*) AS count FROM views WHERE newsid=1234
您可以通过向表视图添加另一个名为“count”和“lastviewed”(键入datetime)的列来增强此功能。 让我们假设如果一天不匹配,你允许每次ip计算另一次。 通过这种方式,您将获得非常准确的观看次数:)
要获取新的viewcount,您只需使用SUM
即可Select SUM(count) AS count WHERE newsid=1234
祝你好运:)
答案 2 :(得分:0)
你可能想引用spencer7593的答案here,他基本上建议同时拥有(1)一个视图计数列,用于快速生成你的网页;(2)一个单独的视图表,它记录用户ID和为了分析,与每个视图相关的时间戳。
我建议此视图表还可用于在确定是否应增加视图计数列时查询是否在最后一天(或一周)内对具有特定内容的特定用户进行了查看。通过检查某个项目的视图是否仅在最后一天(或一周)发生,数据库查询应该大大降低成本,同时仍然保护视图计数的完整性。