Thống kê lượt view, download theo ngày, tuần, tháng và năm bằng PHP

Với nhiều website có tính năng tính lượt view hay lượt download, ta có thể dễ dàng thống kê, lọc những bài viết có lượt xem cao, file có lượt download cao. Nhưng vấn đề đặt ra là làm sao có thể làm thống kê theo ngày, theo tuần, theo tháng, năm như lấy ra bài viết có lượt xem cao nhất tuần hay xem được sự thay đổi về sự phổ biến của bài viết đó (ví dụ như bảng xếp hạng). Trong bài viết này, tôi sẽ hướng dẫn bạn làm điều đó.

Giải pháp

Trong phần này, tôi sẽ trình bày một ví dụ thống kê lượt view các bài viết (posts).

  • Tạo một bảng count_views trong database để lưu trữ với cấu trúc sau:

    | Field           | Type    |
    | id              | int(11) |
    | post_id         | int(11) |
    | day             | int(11) |
    | yesterday       | int(11) |
    | week            | int(11) |
    | month           | int(11) |
    | year            | int(11) |
    | alltime         | int(11) |
    

    Chức năng của từng cột trong bảng:

  • id: Auto Increment, dùng để phân biệt.
  • post_id: Là thuộc tính foreign key với id của table bài viết (posts).
  • day: Lưu lượt view theo ngày hiện tại.
  • yesterday: Lưu lượt view của ngày hôm trước.
  • week: Lưu lượt view của tuần hiện tại.
  • month: Lưu lượt view của tháng hiện tại.
  • year: Lưu lượt view của năm hiện tại.
  • alltime: Lưu lượt view từ khi đăng bài viết đến nay.

  • Với mỗi lần bài viết của bạn được xem, cập nhật day của bản ghi tương ứng với bài viết đó lên một đơn vị. Ví dụ về câu lệnh SQL: UPDATE count_views SET day = day + 1 WHERE post_id = $post_id

  • Tạo một script với nội dung tương tự như dưới đây, dùng để cập nhật và reset lại lượt view vào cuối ngày.

    <?php
    /*
           Kết nối SQL ở đây ($sql)
    */
    $time = time();
    mysqli_query($sql, "UPDATE download_counter SET alltime = alltime + day, year = year + day, month = month + day, week = week + day, yesterday = day, day = 0");
    if(date('z', $time) == '0') {
        //Ngày đầu tiên trong năm
        mysqli_query($sql, "UPDATE count_views SET year = 0, month = 0, week = 0");
    }
    else {
        if(date('j', $time) == '1') {
            //Ngày đầu tiên trong tháng
            mysqli_query($sql, "UPDATE count_views SET month = 0, week = 0");
         }
         else {
             if(date('D', $timestamp) == 'Mon') {
                 //Ngày đầu tiên trong tuần (Thứ hai)
                 mysqli_query($sql, "UPDATE count_views SET week = 0");
             }
         }
    }
    ?>
    
  • Với đoạn PHP ở trên, ắt hẳn bạn đã hiểu nó thực hiện như thế nào, và đoạn script này nên được đặt cronjob thực thi vào nửa đêm (khoảng lúc 11h58 là tốt nhất).

Và khi cần lấy thống kê, bạn chỉ cần:

  • Lấy 10 bài viết xem nhiều nhất trong ngày: SELECT * FROM posts JOIN count_views IN count_views.post_id = posts.id ORDER by count_views.day DESC LIMIT 10
  • Lấy 10 bài viết có lượt xem nhiều nhất trong tuần: SELECT * FROM posts JOIN count_views IN count_views.post_id = posts.id ORDER by count_views.week DESC LIMIT 10
  • Lấy 10 bài viết xem nhiều nhất từ trước đến nay: SELECT * FROM posts JOIN count_views IN count_views.post_id = posts.id ORDER by count_views.alltime DESC LIMIT 10
  • ....
Dây rút nhựa tp hcm