PHP có được người dùng trực tuyến

Sử dụng PHP và MySQL để biết người dùng có trực tuyến hay không, số lượng người dùng hiện đang trực tuyến, trực tuyến cao nhất từ ​​​​trước đến nay, số lượng người dùng trực tuyến hôm nay và Thời gian nhìn thấy lần cuối của người dùng

  • Tải xuống trực tuyến_Người dùng. khóa kéo - 2. 7KB

Giới thiệu

Biết thống kê trang web của bạn là một yếu tố rất quan trọng trong việc theo dõi sự phát triển của trang web của bạn. Việc sử dụng thông tin thống kê như vậy rõ ràng hơn là trong các diễn đàn, cộng đồng và mạng xã hội, nơi cần phải biết

  • Nếu người dùng đang trực tuyến (hữu ích trong Trò chuyện trực tuyến trên web)
  • Số lượng người dùng hiện đang trực tuyến
  • Trực tuyến cao nhất từ ​​​​trước đến nay (có ngày và giờ)
  • Số người dùng đã trực tuyến trong ngày hôm đó
  • Ngày giờ người dùng được nhìn thấy lần cuối

Bài viết này giới thiệu cách đạt được những điều này bằng cách sử dụng PHP và MySQL. Việc triển khai điều này bằng PHP và MySQL khá dễ dàng và đơn giản (hãy tin tôi về điều này

PHP có được người dùng trực tuyến
). Bạn có thể lấy các tệp nguồn được đính kèm với bài viết này chứa hai trình kiểm tra tệp. php (mã phụ trợ) và kiểm tra. php (chứa HTML, PHP và AJAX để ping không đồng bộ máy chủ cho trình kiểm tra. php).

Kiểm tra điều này trên các trình duyệt và tab khác nhau để mô phỏng nhiều người dùng. Đóng một vài tab và trình duyệt để thấy hiệu quả

thiết lập

Cần có cơ sở dữ liệu online_users trên máy chủ MySQL của bạn. Hai bảng là cần thiết trong cơ sở dữ liệu này. trực tuyến và cao nhất. Bảng trực tuyến nên chứa hai cột. id cột có thể là

.
.
.
//Report your presence
if(isset($_GET[report]))
{
    $query = "SELECT * FROM ". $db_name .".online WHERE id = '%s'";
    $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])));
    if(mysql_num_rows(mysql_query($query, $con)) > 0)
    {
        $query = "UPDATE ". $db_name .".online SET time = '%s' WHERE id = '%s'";
        $now = date('Y-m-d H:i:s', strtotime('now'));
        $query = sprintf($query, $now, mysql_real_escape_string(stripslashes($_GET[id])));
        mysql_query($query, $con);echo $query;
    }
    else
    {
        $query = "INSERT INTO ". $db_name .".online (id, time) VALUES ('%s', '%s')";
        $now = date('Y-m-d H:i:s', strtotime('now'));
        $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])), $now);
        mysql_query($query, $con);
    }
    //Set highest online info
    setHighestOnline($con, $db_name);
}
.
.
.
7 hoặc
.
.
.
//Report your presence
if(isset($_GET[report]))
{
    $query = "SELECT * FROM ". $db_name .".online WHERE id = '%s'";
    $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])));
    if(mysql_num_rows(mysql_query($query, $con)) > 0)
    {
        $query = "UPDATE ". $db_name .".online SET time = '%s' WHERE id = '%s'";
        $now = date('Y-m-d H:i:s', strtotime('now'));
        $query = sprintf($query, $now, mysql_real_escape_string(stripslashes($_GET[id])));
        mysql_query($query, $con);echo $query;
    }
    else
    {
        $query = "INSERT INTO ". $db_name .".online (id, time) VALUES ('%s', '%s')";
        $now = date('Y-m-d H:i:s', strtotime('now'));
        $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])), $now);
        mysql_query($query, $con);
    }
    //Set highest online info
    setHighestOnline($con, $db_name);
}
.
.
.
8 tùy thuộc vào cách ID của người dùng được xử lý trên trang web của bạn nhưng với mục đích minh họa này, nó sẽ là
.
.
.
//Report your presence
if(isset($_GET[report]))
{
    $query = "SELECT * FROM ". $db_name .".online WHERE id = '%s'";
    $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])));
    if(mysql_num_rows(mysql_query($query, $con)) > 0)
    {
        $query = "UPDATE ". $db_name .".online SET time = '%s' WHERE id = '%s'";
        $now = date('Y-m-d H:i:s', strtotime('now'));
        $query = sprintf($query, $now, mysql_real_escape_string(stripslashes($_GET[id])));
        mysql_query($query, $con);echo $query;
    }
    else
    {
        $query = "INSERT INTO ". $db_name .".online (id, time) VALUES ('%s', '%s')";
        $now = date('Y-m-d H:i:s', strtotime('now'));
        $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])), $now);
        mysql_query($query, $con);
    }
    //Set highest online info
    setHighestOnline($con, $db_name);
}
.
.
.
9. Cột thứ hai trong bảng trực tuyến phải là thời gian sẽ là một
.
.
.
//Report your presence
if(isset($_GET[report]))
{
    $query = "SELECT * FROM ". $db_name .".online WHERE id = '%s'";
    $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])));
    if(mysql_num_rows(mysql_query($query, $con)) > 0)
    {
        $query = "UPDATE ". $db_name .".online SET time = '%s' WHERE id = '%s'";
        $now = date('Y-m-d H:i:s', strtotime('now'));
        $query = sprintf($query, $now, mysql_real_escape_string(stripslashes($_GET[id])));
        mysql_query($query, $con);echo $query;
    }
    else
    {
        $query = "INSERT INTO ". $db_name .".online (id, time) VALUES ('%s', '%s')";
        $now = date('Y-m-d H:i:s', strtotime('now'));
        $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])), $now);
        mysql_query($query, $con);
    }
    //Set highest online info
    setHighestOnline($con, $db_name);
}
.
.
.
0.  

Bảng thứ hai cao nhất phải chứa hai cột;

Bạn có thể thiết lập những thứ này theo cách thủ công bằng cách sử dụng phpMyAdmin của mình hoặc bằng cách sử dụng mã bên dưới giả sử tên cơ sở dữ liệu của bạn là “online_user” và bạn đã kết nối với máy chủ MySQL bằng biến

.
.
.
//Report your presence
if(isset($_GET[report]))
{
    $query = "SELECT * FROM ". $db_name .".online WHERE id = '%s'";
    $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])));
    if(mysql_num_rows(mysql_query($query, $con)) > 0)
    {
        $query = "UPDATE ". $db_name .".online SET time = '%s' WHERE id = '%s'";
        $now = date('Y-m-d H:i:s', strtotime('now'));
        $query = sprintf($query, $now, mysql_real_escape_string(stripslashes($_GET[id])));
        mysql_query($query, $con);echo $query;
    }
    else
    {
        $query = "INSERT INTO ". $db_name .".online (id, time) VALUES ('%s', '%s')";
        $now = date('Y-m-d H:i:s', strtotime('now'));
        $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])), $now);
        mysql_query($query, $con);
    }
    //Set highest online info
    setHighestOnline($con, $db_name);
}
.
.
.
2

PHP

<?php
.
.
.
//already connected to MySQL using $connection
//To create database
$sql = "CREATE DATABASE online_users";
mysql_query($sql, $connection);
 
//To create tables
$sql = "CREATE TABLE online_users.online (id VARCHAR( 10 ) NOT NULL ,
time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE = InnoDB";
mysql_query($sql, $connection);
 
$sql = "CREATE TABLE online_users.highest (time TIMESTAMP NOT NULL 
              DEFAULT CURRENT_TIMESTAMP , num INT NOT NULL ) ENGINE = InnoDB";
mysql_query($sql, $connection);
.
.
.
?>  

Xin lưu ý rằng bạn phải tạo các cơ sở dữ liệu và bảng này trước khi các tệp nguồn đi kèm với bài viết này có thể hoạt động. Phần tạo cơ sở dữ liệu và bảng này đã được loại bỏ khỏi mã nguồn để giữ cho nó sạch sẽ, rõ ràng và đi thẳng vào vấn đề.  

Người kiểm tra

người kiểm tra. php chứa mã phụ trợ nhưng trước khi sử dụng, bạn phải thay đổi các biến

.
.
.
//Report your presence
if(isset($_GET[report]))
{
    $query = "SELECT * FROM ". $db_name .".online WHERE id = '%s'";
    $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])));
    if(mysql_num_rows(mysql_query($query, $con)) > 0)
    {
        $query = "UPDATE ". $db_name .".online SET time = '%s' WHERE id = '%s'";
        $now = date('Y-m-d H:i:s', strtotime('now'));
        $query = sprintf($query, $now, mysql_real_escape_string(stripslashes($_GET[id])));
        mysql_query($query, $con);echo $query;
    }
    else
    {
        $query = "INSERT INTO ". $db_name .".online (id, time) VALUES ('%s', '%s')";
        $now = date('Y-m-d H:i:s', strtotime('now'));
        $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])), $now);
        mysql_query($query, $con);
    }
    //Set highest online info
    setHighestOnline($con, $db_name);
}
.
.
.
3,
.
.
.
//Report your presence
if(isset($_GET[report]))
{
    $query = "SELECT * FROM ". $db_name .".online WHERE id = '%s'";
    $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])));
    if(mysql_num_rows(mysql_query($query, $con)) > 0)
    {
        $query = "UPDATE ". $db_name .".online SET time = '%s' WHERE id = '%s'";
        $now = date('Y-m-d H:i:s', strtotime('now'));
        $query = sprintf($query, $now, mysql_real_escape_string(stripslashes($_GET[id])));
        mysql_query($query, $con);echo $query;
    }
    else
    {
        $query = "INSERT INTO ". $db_name .".online (id, time) VALUES ('%s', '%s')";
        $now = date('Y-m-d H:i:s', strtotime('now'));
        $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])), $now);
        mysql_query($query, $con);
    }
    //Set highest online info
    setHighestOnline($con, $db_name);
}
.
.
.
4,
.
.
.
//Report your presence
if(isset($_GET[report]))
{
    $query = "SELECT * FROM ". $db_name .".online WHERE id = '%s'";
    $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])));
    if(mysql_num_rows(mysql_query($query, $con)) > 0)
    {
        $query = "UPDATE ". $db_name .".online SET time = '%s' WHERE id = '%s'";
        $now = date('Y-m-d H:i:s', strtotime('now'));
        $query = sprintf($query, $now, mysql_real_escape_string(stripslashes($_GET[id])));
        mysql_query($query, $con);echo $query;
    }
    else
    {
        $query = "INSERT INTO ". $db_name .".online (id, time) VALUES ('%s', '%s')";
        $now = date('Y-m-d H:i:s', strtotime('now'));
        $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])), $now);
        mysql_query($query, $con);
    }
    //Set highest online info
    setHighestOnline($con, $db_name);
}
.
.
.
5,
.
.
.
//Report your presence
if(isset($_GET[report]))
{
    $query = "SELECT * FROM ". $db_name .".online WHERE id = '%s'";
    $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])));
    if(mysql_num_rows(mysql_query($query, $con)) > 0)
    {
        $query = "UPDATE ". $db_name .".online SET time = '%s' WHERE id = '%s'";
        $now = date('Y-m-d H:i:s', strtotime('now'));
        $query = sprintf($query, $now, mysql_real_escape_string(stripslashes($_GET[id])));
        mysql_query($query, $con);echo $query;
    }
    else
    {
        $query = "INSERT INTO ". $db_name .".online (id, time) VALUES ('%s', '%s')";
        $now = date('Y-m-d H:i:s', strtotime('now'));
        $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])), $now);
        mysql_query($query, $con);
    }
    //Set highest online info
    setHighestOnline($con, $db_name);
}
.
.
.
6 thành máy chủ MySQL, tên người dùng, mật khẩu và tên cơ sở dữ liệu tương ứng.  

thử thách 1

Bước đầu tiên để đạt được mục tiêu của chúng tôi là ghi ID và thời gian hiện tại của mọi người dùng có mặt trên trang web vào bảng “trực tuyến” của cơ sở dữ liệu và để đảm bảo thông tin này được cập nhật miễn là người dùng vẫn mở trang web trong . Nếu đạt được điều này, các vấn đề sau sẽ được giải quyết ngay lập tức

Giải pháp 1.  

  • Nhận nếu người dùng đang trực tuyến. Bằng cách kiểm tra thời gian hàng của người dùng được cập nhật lần cuối, bạn có thể biết liệu người dùng có còn trực tuyến hay không. Chẳng hạn, nếu bạn đặt hàng được cập nhật sau mỗi 30 giây và lần cuối cùng hàng được cập nhật là 1 phút trước hoặc lâu hơn, thì bạn có thể nói chính xác rằng người dùng không còn trực tuyến nữa
  • Lấy số lượng người dùng đang trực tuyến. Nếu bạn chọn một người dùng có thể được coi là ngoại tuyến nếu thời gian hàng được cập nhật lần cuối là 1 phút trước trở lên, thì bằng cách lấy số lượng hàng được cập nhật cách đây chưa đầy 1 phút, bạn sẽ có được số lượng người dùng trực tuyến.
     
  • Nhìn thấy lần cuối. Bằng cách kiểm tra lần cuối hàng của người dùng được cập nhật lần cuối, bạn có thể xác định xem anh ta có trực tuyến hay không hoặc thời gian “Xem lần cuối”.   
  • Số người dùng trực tuyến ngày hôm nay. Bằng cách lấy số hàng đã được cập nhật vào ngày cụ thể đó, bạn sẽ nhận được số đã trực tuyến vào ngày hôm đó

thử thách 2

Thách thức thứ hai (và cuối cùng kể từ Giải pháp 1 đã giải quyết được 4 trên 5) là làm thế nào để đạt được kết quả trực tuyến cao nhất từ ​​trước đến nay. Tất nhiên đây sẽ là một “thời điểm”. Điều này thoạt nghe có vẻ đáng sợ khi bạn nghĩ rằng một tập lệnh có thể phải tiếp tục chạy trên máy chủ của bạn mọi lúc để có được số lượng người dùng trực tuyến mỗi mili giây. Dù sao đó cũng không phải là giải pháp nên hãy thư giãn

Giải pháp 2.  

  • Trực tuyến cao nhất từ ​​​​trước đến nay. để có trực tuyến cao nhất, bạn phải có người dùng trực tuyến. Điều này ban đầu có vẻ giống như một tuyên bố kết xuất nhưng đó là sự thật. Vậy tại sao không đặt trách nhiệm kiểm tra “trực tuyến cao nhất từ ​​trước đến nay” lên người dùng trực tuyến thay vì để Cron Jobs chạy một đoạn mã vĩnh viễn trên máy chủ của bạn. Nếu không có người dùng trực tuyến thì không cần kiểm tra trực tuyến cao nhất

Khi người dùng báo cáo sự hiện diện của mình, số lượng người dùng trực tuyến sẽ được kiểm tra và so sánh với cột “số” của bảng “cao nhất”. Nếu số lớn hơn hoặc bằng “num” thì thời điểm hiện tại và số là

.
.
.
//Report your presence
if(isset($_GET[report]))
{
    $query = "SELECT * FROM ". $db_name .".online WHERE id = '%s'";
    $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])));
    if(mysql_num_rows(mysql_query($query, $con)) > 0)
    {
        $query = "UPDATE ". $db_name .".online SET time = '%s' WHERE id = '%s'";
        $now = date('Y-m-d H:i:s', strtotime('now'));
        $query = sprintf($query, $now, mysql_real_escape_string(stripslashes($_GET[id])));
        mysql_query($query, $con);echo $query;
    }
    else
    {
        $query = "INSERT INTO ". $db_name .".online (id, time) VALUES ('%s', '%s')";
        $now = date('Y-m-d H:i:s', strtotime('now'));
        $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])), $now);
        mysql_query($query, $con);
    }
    //Set highest online info
    setHighestOnline($con, $db_name);
}
.
.
.
7 hoặc
.
.
.
//Report your presence
if(isset($_GET[report]))
{
    $query = "SELECT * FROM ". $db_name .".online WHERE id = '%s'";
    $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])));
    if(mysql_num_rows(mysql_query($query, $con)) > 0)
    {
        $query = "UPDATE ". $db_name .".online SET time = '%s' WHERE id = '%s'";
        $now = date('Y-m-d H:i:s', strtotime('now'));
        $query = sprintf($query, $now, mysql_real_escape_string(stripslashes($_GET[id])));
        mysql_query($query, $con);echo $query;
    }
    else
    {
        $query = "INSERT INTO ". $db_name .".online (id, time) VALUES ('%s', '%s')";
        $now = date('Y-m-d H:i:s', strtotime('now'));
        $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])), $now);
        mysql_query($query, $con);
    }
    //Set highest online info
    setHighestOnline($con, $db_name);
}
.
.
.
8d vào bảng

kiểm tra ping

Kiểm tra. tệp php chứa mã PHP, tập lệnh AJAX và HTML chạy trên giao diện người dùng. Điều này cũng giống như trang web của bạn, tôi. e. , những gì người dùng sẽ thấy. AJAX được sử dụng để giao tiếp không đồng bộ với máy chủ cứ sau 30 giây để báo cáo sự hiện diện của người dùng giữa những người khác

Mã và giải thích

Bốn trong số năm thách thức của chúng tôi có thể được giải quyết bằng cách trang chỉ cần báo cáo sự hiện diện của nó cho máy chủ, cứ sau 30 giây và máy chủ cập nhật hàng trong bảng “trực tuyến” một cách thích hợp

  • Báo cáo sự hiện diện của người dùng
  • PHP

    .
    .
    .
    //Report your presence
    if(isset($_GET[report]))
    {
        $query = "SELECT * FROM ". $db_name .".online WHERE id = '%s'";
        $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])));
        if(mysql_num_rows(mysql_query($query, $con)) > 0)
        {
            $query = "UPDATE ". $db_name .".online SET time = '%s' WHERE id = '%s'";
            $now = date('Y-m-d H:i:s', strtotime('now'));
            $query = sprintf($query, $now, mysql_real_escape_string(stripslashes($_GET[id])));
            mysql_query($query, $con);echo $query;
        }
        else
        {
            $query = "INSERT INTO ". $db_name .".online (id, time) VALUES ('%s', '%s')";
            $now = date('Y-m-d H:i:s', strtotime('now'));
            $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])), $now);
            mysql_query($query, $con);
        }
        //Set highest online info
        setHighestOnline($con, $db_name);
    }
    .
    .
    .

    Đoạn mã này nằm ở phần phụ trợ (trình kiểm tra. php) và kiểm tra xem

    .
    .
    .
    //Report your presence
    if(isset($_GET[report]))
    {
        $query = "SELECT * FROM ". $db_name .".online WHERE id = '%s'";
        $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])));
        if(mysql_num_rows(mysql_query($query, $con)) > 0)
        {
            $query = "UPDATE ". $db_name .".online SET time = '%s' WHERE id = '%s'";
            $now = date('Y-m-d H:i:s', strtotime('now'));
            $query = sprintf($query, $now, mysql_real_escape_string(stripslashes($_GET[id])));
            mysql_query($query, $con);echo $query;
        }
        else
        {
            $query = "INSERT INTO ". $db_name .".online (id, time) VALUES ('%s', '%s')";
            $now = date('Y-m-d H:i:s', strtotime('now'));
            $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])), $now);
            mysql_query($query, $con);
        }
        //Set highest online info
        setHighestOnline($con, $db_name);
    }
    .
    .
    .
    9 có phải là
    <?php
    .
    .
    .
    //already connected to MySQL using $connection
    //To create database
    $sql = "CREATE DATABASE online_users";
    mysql_query($sql, $connection);
     
    //To create tables
    $sql = "CREATE TABLE online_users.online (id VARCHAR( 10 ) NOT NULL ,
    time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
     
    $sql = "CREATE TABLE online_users.highest (time TIMESTAMP NOT NULL 
                  DEFAULT CURRENT_TIMESTAMP , num INT NOT NULL ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
    .
    .
    .
    ?>  
    00 không. Nếu đúng, điều đó cho biết một trang đang báo cáo sự hiện diện của người dùng. Sau đó, mã này sẽ kiểm tra xem người dùng đã được đăng ký vào bảng “trực tuyến” trước đó chưa. Nếu đúng (tôi. e. , số hàng được trả về trong truy vấn lớn hơn 0) hàng là
    .
    .
    .
    //Report your presence
    if(isset($_GET[report]))
    {
        $query = "SELECT * FROM ". $db_name .".online WHERE id = '%s'";
        $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])));
        if(mysql_num_rows(mysql_query($query, $con)) > 0)
        {
            $query = "UPDATE ". $db_name .".online SET time = '%s' WHERE id = '%s'";
            $now = date('Y-m-d H:i:s', strtotime('now'));
            $query = sprintf($query, $now, mysql_real_escape_string(stripslashes($_GET[id])));
            mysql_query($query, $con);echo $query;
        }
        else
        {
            $query = "INSERT INTO ". $db_name .".online (id, time) VALUES ('%s', '%s')";
            $now = date('Y-m-d H:i:s', strtotime('now'));
            $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])), $now);
            mysql_query($query, $con);
        }
        //Set highest online info
        setHighestOnline($con, $db_name);
    }
    .
    .
    .
    8d nếu không thì thông tin là
    .
    .
    .
    //Report your presence
    if(isset($_GET[report]))
    {
        $query = "SELECT * FROM ". $db_name .".online WHERE id = '%s'";
        $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])));
        if(mysql_num_rows(mysql_query($query, $con)) > 0)
        {
            $query = "UPDATE ". $db_name .".online SET time = '%s' WHERE id = '%s'";
            $now = date('Y-m-d H:i:s', strtotime('now'));
            $query = sprintf($query, $now, mysql_real_escape_string(stripslashes($_GET[id])));
            mysql_query($query, $con);echo $query;
        }
        else
        {
            $query = "INSERT INTO ". $db_name .".online (id, time) VALUES ('%s', '%s')";
            $now = date('Y-m-d H:i:s', strtotime('now'));
            $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])), $now);
            mysql_query($query, $con);
        }
        //Set highest online info
        setHighestOnline($con, $db_name);
    }
    .
    .
    .
    7 bảng

    Hãy nhớ rằng trong Giải pháp 2, người ta đã nói rằng bất cứ khi nào có sự hiện diện của người dùng được báo cáo, số lượng người dùng trực tuyến phải được kiểm tra và xử lý thích hợp, đó là lý do cho chức năng

    <?php
    .
    .
    .
    //already connected to MySQL using $connection
    //To create database
    $sql = "CREATE DATABASE online_users";
    mysql_query($sql, $connection);
     
    //To create tables
    $sql = "CREATE TABLE online_users.online (id VARCHAR( 10 ) NOT NULL ,
    time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
     
    $sql = "CREATE TABLE online_users.highest (time TIMESTAMP NOT NULL 
                  DEFAULT CURRENT_TIMESTAMP , num INT NOT NULL ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
    .
    .
    .
    ?>  
    03. Chức năng sẽ được thảo luận sau

    Người dùng báo cáo sự hiện diện từ kiểm tra. php với đoạn mã AJAX này

    JavaScript

    <?php
    .
    .
    .
    //already connected to MySQL using $connection
    //To create database
    $sql = "CREATE DATABASE online_users";
    mysql_query($sql, $connection);
     
    //To create tables
    $sql = "CREATE TABLE online_users.online (id VARCHAR( 10 ) NOT NULL ,
    time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
     
    $sql = "CREATE TABLE online_users.highest (time TIMESTAMP NOT NULL 
                  DEFAULT CURRENT_TIMESTAMP , num INT NOT NULL ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
    .
    .
    .
    ?>  
    0

    Đây chỉ là một mã AJAX đơn giản nhưng lưu ý rằng “POST” đã được sử dụng trong phương thức mở nhưng các tham số được truyền bằng phương thức GET (i. e. , nối các tham số vào URL).

    <?php
    .
    .
    .
    //already connected to MySQL using $connection
    //To create database
    $sql = "CREATE DATABASE online_users";
    mysql_query($sql, $connection);
     
    //To create tables
    $sql = "CREATE TABLE online_users.online (id VARCHAR( 10 ) NOT NULL ,
    time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
     
    $sql = "CREATE TABLE online_users.highest (time TIMESTAMP NOT NULL 
                  DEFAULT CURRENT_TIMESTAMP , num INT NOT NULL ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
    .
    .
    .
    ?>  
    04 cũng được sử dụng trên mã phụ trợ. Mục đích của việc sử dụng POST trong phương thức mở là để ngăn bộ nhớ đệm, GET sẽ luôn lưu vào bộ đệm nếu được sử dụng trong phương thức mở và điều này là không mong muốn trong tình huống này do đó POST. Tất cả các mã AJAX khác chỉ cần làm theo mẫu này. Tham số id trong biến URL ở trên phải là UserID của người dùng. Trong ví dụ này, ID được tạo ngẫu nhiên và được lưu trữ trong trường nhập ẩn

    PHP

    <?php
    .
    .
    .
    //already connected to MySQL using $connection
    //To create database
    $sql = "CREATE DATABASE online_users";
    mysql_query($sql, $connection);
     
    //To create tables
    $sql = "CREATE TABLE online_users.online (id VARCHAR( 10 ) NOT NULL ,
    time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
     
    $sql = "CREATE TABLE online_users.highest (time TIMESTAMP NOT NULL 
                  DEFAULT CURRENT_TIMESTAMP , num INT NOT NULL ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
    .
    .
    .
    ?>  
    6

    Trong mã của riêng bạn, hãy sử dụng UserID thực

  • Đặt trực tuyến cao nhất từ ​​​​trước đến nay
  • PHP

    <?php
    .
    .
    .
    //already connected to MySQL using $connection
    //To create database
    $sql = "CREATE DATABASE online_users";
    mysql_query($sql, $connection);
     
    //To create tables
    $sql = "CREATE TABLE online_users.online (id VARCHAR( 10 ) NOT NULL ,
    time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
     
    $sql = "CREATE TABLE online_users.highest (time TIMESTAMP NOT NULL 
                  DEFAULT CURRENT_TIMESTAMP , num INT NOT NULL ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
    .
    .
    .
    ?>  
    7

    Thao tác này sẽ chỉ kiểm tra số lượng người dùng trực tuyến từ bảng “trực tuyến” và so sánh kết quả với bản ghi trong bảng “cao nhất”. Bảng “cao nhất” là

    .
    .
    .
    //Report your presence
    if(isset($_GET[report]))
    {
        $query = "SELECT * FROM ". $db_name .".online WHERE id = '%s'";
        $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])));
        if(mysql_num_rows(mysql_query($query, $con)) > 0)
        {
            $query = "UPDATE ". $db_name .".online SET time = '%s' WHERE id = '%s'";
            $now = date('Y-m-d H:i:s', strtotime('now'));
            $query = sprintf($query, $now, mysql_real_escape_string(stripslashes($_GET[id])));
            mysql_query($query, $con);echo $query;
        }
        else
        {
            $query = "INSERT INTO ". $db_name .".online (id, time) VALUES ('%s', '%s')";
            $now = date('Y-m-d H:i:s', strtotime('now'));
            $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])), $now);
            mysql_query($query, $con);
        }
        //Set highest online info
        setHighestOnline($con, $db_name);
    }
    .
    .
    .
    8d hoặc
    .
    .
    .
    //Report your presence
    if(isset($_GET[report]))
    {
        $query = "SELECT * FROM ". $db_name .".online WHERE id = '%s'";
        $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])));
        if(mysql_num_rows(mysql_query($query, $con)) > 0)
        {
            $query = "UPDATE ". $db_name .".online SET time = '%s' WHERE id = '%s'";
            $now = date('Y-m-d H:i:s', strtotime('now'));
            $query = sprintf($query, $now, mysql_real_escape_string(stripslashes($_GET[id])));
            mysql_query($query, $con);echo $query;
        }
        else
        {
            $query = "INSERT INTO ". $db_name .".online (id, time) VALUES ('%s', '%s')";
            $now = date('Y-m-d H:i:s', strtotime('now'));
            $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])), $now);
            mysql_query($query, $con);
        }
        //Set highest online info
        setHighestOnline($con, $db_name);
    }
    .
    .
    .
    7 một cách thích hợp. Chức năng khác chỉ tuân theo mẫu kiểm tra, cập nhật và chèn vào cơ sở dữ liệu MySQL này và khá đơn giản để hiểu. Hàm
    <?php
    .
    .
    .
    //already connected to MySQL using $connection
    //To create database
    $sql = "CREATE DATABASE online_users";
    mysql_query($sql, $connection);
     
    //To create tables
    $sql = "CREATE TABLE online_users.online (id VARCHAR( 10 ) NOT NULL ,
    time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
     
    $sql = "CREATE TABLE online_users.highest (time TIMESTAMP NOT NULL 
                  DEFAULT CURRENT_TIMESTAMP , num INT NOT NULL ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
    .
    .
    .
    ?>  
    07 trong JavaScript được sử dụng để chạy tất cả các hàm AJAX trong một khoảng thời gian xác định

    JavaScript

    .
    .
    .
    //Report your presence
    if(isset($_GET[report]))
    {
        $query = "SELECT * FROM ". $db_name .".online WHERE id = '%s'";
        $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])));
        if(mysql_num_rows(mysql_query($query, $con)) > 0)
        {
            $query = "UPDATE ". $db_name .".online SET time = '%s' WHERE id = '%s'";
            $now = date('Y-m-d H:i:s', strtotime('now'));
            $query = sprintf($query, $now, mysql_real_escape_string(stripslashes($_GET[id])));
            mysql_query($query, $con);echo $query;
        }
        else
        {
            $query = "INSERT INTO ". $db_name .".online (id, time) VALUES ('%s', '%s')";
            $now = date('Y-m-d H:i:s', strtotime('now'));
            $query = sprintf($query, mysql_real_escape_string(stripslashes($_GET[id])), $now);
            mysql_query($query, $con);
        }
        //Set highest online info
        setHighestOnline($con, $db_name);
    }
    .
    .
    .
    1

Các nhu yếu phẩm khác

  1. Đảm bảo cả checker. php và kiểm tra. php nằm trong cùng một thư mục, nếu không, bạn sẽ phải cập nhật biến URL trong mã AJAX một cách thích hợp
  2. Lưu ý rằng mã giả định rằng kết nối của bạn với cơ sở dữ liệu sẽ không bao giờ bị lỗi nên không có xử lý lỗi nào được tích hợp sẵn
  3. Bạn cũng có thể mở rộng mã để bao gồm một chức năng lấy trang hiện tại mà người dùng đang xem tại một thời điểm cụ thể. Cái này và những cái khác không được đưa vào để giữ cho mã tập trung, ngắn gọn và rõ ràng. Mặc dù điều này có thể được giới thiệu dưới dạng Phần thứ hai theo yêu cầu phổ biến

Ảnh chụp màn hình

PHP có được người dùng trực tuyến

Sửa đổi lần thứ nhất. ngày 9 tháng 4 năm 2013

Thuật toán cơ bản vẫn còn nhưng mã ban đầu đã được thay đổi một chút để khắc phục sự giám sát

  1. Hành vi Tiết kiệm thời gian ban ngày của
    <?php
    .
    .
    .
    //already connected to MySQL using $connection
    //To create database
    $sql = "CREATE DATABASE online_users";
    mysql_query($sql, $connection);
     
    //To create tables
    $sql = "CREATE TABLE online_users.online (id VARCHAR( 10 ) NOT NULL ,
    time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
     
    $sql = "CREATE TABLE online_users.highest (time TIMESTAMP NOT NULL 
                  DEFAULT CURRENT_TIMESTAMP , num INT NOT NULL ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
    .
    .
    .
    ?>  
    08 của PHP. Thời gian trước +1 giờ của
    <?php
    .
    .
    .
    //already connected to MySQL using $connection
    //To create database
    $sql = "CREATE DATABASE online_users";
    mysql_query($sql, $connection);
     
    //To create tables
    $sql = "CREATE TABLE online_users.online (id VARCHAR( 10 ) NOT NULL ,
    time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
     
    $sql = "CREATE TABLE online_users.highest (time TIMESTAMP NOT NULL 
                  DEFAULT CURRENT_TIMESTAMP , num INT NOT NULL ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
    .
    .
    .
    ?>  
    08 của PHP trong DTS không được xem xét trong mã ban đầu. Điều này dẫn đến việc mã không thể phát hiện người dùng trực tuyến trong DTS vì tất cả người dùng trực tuyến dường như đã ngoại tuyến trong một giờ qua. Điều đó đã được khắc phục bằng cách chuyển
    <?php
    .
    .
    .
    //already connected to MySQL using $connection
    //To create database
    $sql = "CREATE DATABASE online_users";
    mysql_query($sql, $connection);
     
    //To create tables
    $sql = "CREATE TABLE online_users.online (id VARCHAR( 10 ) NOT NULL ,
    time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
     
    $sql = "CREATE TABLE online_users.highest (time TIMESTAMP NOT NULL 
                  DEFAULT CURRENT_TIMESTAMP , num INT NOT NULL ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
    .
    .
    .
    ?>  
    60 làm thời điểm hiện tại thay vì sử dụng MySQL
    <?php
    .
    .
    .
    //already connected to MySQL using $connection
    //To create database
    $sql = "CREATE DATABASE online_users";
    mysql_query($sql, $connection);
     
    //To create tables
    $sql = "CREATE TABLE online_users.online (id VARCHAR( 10 ) NOT NULL ,
    time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
     
    $sql = "CREATE TABLE online_users.highest (time TIMESTAMP NOT NULL 
                  DEFAULT CURRENT_TIMESTAMP , num INT NOT NULL ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
    .
    .
    .
    ?>  
    61
  2. Một hành vi không mong muốn cũng được phát hiện theo đó chức năng
    <?php
    .
    .
    .
    //already connected to MySQL using $connection
    //To create database
    $sql = "CREATE DATABASE online_users";
    mysql_query($sql, $connection);
     
    //To create tables
    $sql = "CREATE TABLE online_users.online (id VARCHAR( 10 ) NOT NULL ,
    time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
     
    $sql = "CREATE TABLE online_users.highest (time TIMESTAMP NOT NULL 
                  DEFAULT CURRENT_TIMESTAMP , num INT NOT NULL ) ENGINE = InnoDB";
    mysql_query($sql, $connection);
    .
    .
    .
    ?>  
    03 đang trả về lỗi MySQL "Không có cơ sở dữ liệu được chọn". Điều đó cũng đã được khắc phục bằng cách chuyển một liên kết MySQL đã được kết nối tới chức năng
  3. Đã sửa một số lỗi đánh máy

Giấy phép

Bài viết này, cùng với bất kỳ mã nguồn và tệp liên quan nào, được cấp phép theo Giấy phép Mở Dự án Mã (CPOL)


PHP có được người dùng trực tuyến

Được viết bởi

Oso Oluwafemi Ebenezer

Người phát triển phần mềm

PHP có được người dùng trực tuyến
Ni-giê-ri-a

Tốt nghiệp ngành Kỹ sư Nông nghiệp tại Đại học Công nghệ Ladoke Akintola, Ogbomoso nhưng lập trình máy tính và web là mối tình đầu của anh ấy. Bạn có thể gặp anh ấy trên Facebook Osofem Inc

Làm cách nào để có được người dùng trực tuyến trong PHP?

Lưu trữ thông tin đăng nhập của người dùng trong bảng. Đầu tiên, khi người dùng đăng nhập vào hệ thống của chúng tôi thì chúng tôi phải lưu thông tin đăng nhập của anh ấy như id, thời gian đăng nhập vào cơ sở dữ liệu chi tiết đăng nhập của chúng tôi. .
Cập nhật Hoạt động cuối cùng của người dùng Đăng nhập vào thông tin đăng nhập của anh ấy. .
Lấy dữ liệu người dùng trực tuyến từ bảng

Làm cách nào để kiểm tra xem người dùng có trực tuyến trong PHP không?

Bất cứ khi nào người dùng truy cập một trang, đặt/cập nhật trường LastActiveTime trong bản ghi bảng Người dùng của họ. Sau đó, hãy đếm tất cả người dùng có Thời gian hoạt động cuối cùng trong vòng 5 phút qua . Bất cứ điều gì hơn thế này, và chúng có thể được coi là "ngoại tuyến. "

Làm cách nào để hiển thị trạng thái trong PHP?

Hàm stat() / mysqli_stat() trả về trạng thái hệ thống hiện tại.