Đếm số lượt xem trang trong PHP, Laravel

    Chức năng đếm số lượt xem trang, bài viết, sản phẩm... là khá hay và rất cần thiết cho các trang web, cho người dùng người quản trị biết được có bao nhiêu người đã xem trang của mình.

    Hôm nay mình xin được mạo muội giới thiệu tới các bạn cách viết chức năng đếm số lượt xem trang web bằng PHP thuần và trong Laravel

    Đầu tiên cơ sở dữ liệu bảng bài, trang, sản phẩm của bạn phải có một trường để lưu số lượt xem trang (ví dụ: "views")

1. Cách củ chuối

Cách đơn giản nhất đó là cứ khi có người vào trang web thì chúng ta lại tăng trường views lên 1.
Các bạn có thể viết code ở trang xem chi tiết như sau:

<?php

    // PHP thuần
    $conn = new mysqli('localhost', 'root', '', 'db_name');
    if ($conn->connect_errno) {
        die('can not connect database');
    }
    $postId = 'xxx';
    $conn->query('UPDATE table_posts SET views = views + 1 WHERE id = ' . $postId . ');

    //Laravel
    $post = PostModel::findOrFail($postId);
    $post->increment('views');
    
?>


Vì sao cách này lại là cách củ chuối, đó là khi người dùng refresh trang liên tục (F5) thì số lượt views cứ thế tăng tằng tằng, có thể lên cả nghìn cả triệu lượt views, làm như vậy thì bạn sẽ có một trang web có lượt views siêu khủng @@

2. Cách tối ưu hơn

Cách tối ưu hơn là chúng ta dùng Session, khi đóng ứng dụng hay tắt trình duyệt thì Session sẽ mất đi, do đó khi người dùng bật trình duyệt và vào lại trang web thì chúng ta mới tính thêm một view, còn khi vẫn đang còn Session thì không tăng view nữa.

<?php

    //PHP thuần
    $sessionKey = 'post_' . $postId;
    $sessionView = $_SESSION[$sessionKey];
    if (!$sessionView) { // nếu chưa có session
        $_SESSION[$sessionKey] = 1; //set giá trị cho session
        $conn->query('UPDATE table_posts SET views = views + 1 WHERE id = ' . $postID);
    }

    //Laravel
    $sessionView = Session::get($sessionKey);
    $post = PostModel::findOrFail($postId);
    if (!$sessionView) { //nếu chưa có session
        Session::put($sessionKey, 1); //set giá trị cho session
        $post->increment('views');
    }

?>

    Ngoài ra nếu các bạn muốn tính lượt xem theo cách khác như sau bao nhiêu giây hoặc bao nhiêu phút thì mới cộng thêm lượt view thì có thể dùng cookie, cookie sẽ không bị mất khi tắt trình duyệt mà chỉ phụ thuộc vào thời gian sống mà chúng ta đặt cho nó. khi hết thời gian sống thì chúng ta có thể tăng lên đc 1 view

 

Bài viết từ pinlaz.com