我正在尝试使用php创建一个博客系统,我需要一种方法来计算过去21天内观看次数最多的帖子。有人知道这样做的好方法吗?
我对PHP没有太多经验,所以我需要有人指出我正确的方向。我试图调查谷歌anlytics API,但它似乎有点复杂。使用cookies会更容易吗?
答案 0 :(得分:1)
由于您正在构建自己的博客系统,因此这是最简单的方法:
我认为这是对您的博客帖子访问的匿名计数。如果你想拥有ip记录的记录,你将不得不调整业务逻辑。
现在你可以像这样查询:
select visits.blogpostid, count(dtpost) as counted from posts
left join posts on posts.id = visits.blogpostid
where dtpost between (NOW() AND <-21 days interval function>)
order by counted DESC group by visits.blogpostid;
您真正要做的是存储访问您博客帖子的人的日期时间。这自动是一个计数,所以无论你把它放在哪个间隔都会获取数据*。然后count()函数进行计数。
要知道的是,您自己的浏览器刷新会增加访问次数,因此您必须提供一种方法来阻止计算浏览器的刷新次数(通常是时间限制或cookie来说明你已经看过那个页面了。
*编辑: 由于这是不明确的,我的意思是它将在您想要的时间段内获取您的数据。
答案 1 :(得分:0)
使用外键创建一个表views
以发布ID,并添加包含访问者信息和日期的条目。然后你可以获取观看次数最多的帖子(未经测试):
SELECT p.*, COUNT(p.*) count FROM posts p
INNER JOIN views v ON v.post_id = p.id
WHERE DATE_SUB(CURDATE(), INTERVAL 21 DAY) <= p.date_viewed
ORDER BY count DESC
GROUP BY p.id;
答案 2 :(得分:0)
为防止同一用户多次查看时计数增加,您可以使用会话优势来防止这种情况发生。
session_start();
if (!isset($_SESSION['posts_viewed'])) {
$_SESSION['posts_viewed'] = array();
}
// some logic to get to relevant post id here
// check that the post_id is not in the array
if (!in_array($post_id, $_SESSION['posts_viewed'])) {
// logic to increment a persistent counter (e.g. in mysql) here
// add post_id to array
array_push($_SESSION['posts_viewed'], $post_id);
}
// finally some logic that display the post here
session_close();