过去21天内观看次数最多的帖子

时间:2012-03-15 20:06:02

标签: php mysql cookies google-analytics-api

我正在尝试使用php创建一个博客系统,我需要一种方法来计算过去21天内观看次数最多的帖子。有人知道这样做的好方法吗?

我对PHP没有太多经验,所以我需要有人指出我正确的方向。我试图调查谷歌anlytics API,但它似乎有点复杂。使用cookies会更容易吗?

3 个答案:

答案 0 :(得分:1)

由于您正在构建自己的博客系统,因此这是最简单的方法:

我认为这是对您的博客帖子访问的匿名计数。如果你想拥有ip记录的记录,你将不得不调整业务逻辑。

  1. 创建一个名为visits。的新表。
  2. 添加一个id(主键),一个名为blogpostid的字段(将存储正在查看的帖子的ID)和一个名为dtpost的字段,其中包含timestamp或datetime属性,插入后会自动显示日期/时间。
  3. 现在你可以像这样查询:

    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();