PHP计入登录用户

时间:2010-10-23 02:31:11

标签: php user-accounts

我无法弄清楚如何计算应用程序中已登录用户的数量。

我拥有的内容:当用户登录时,他们会获得一个会话(当用户想要访问受保护的页面时使用该会话),并且users表中的用户的IsLoggedIn列是设置为1表示用户已登录。当用户注销时,该值将重新设置为0.计算users表中的1的数量可以轻松返回登录的用户数。但...

问题:如果用户在未注销的情况下关闭浏览器,则数据库中的值保持为1,表示即使用户关闭浏览器时会话已结束,用户仍然已登录

问题:有人建议采取正确的方法吗?

3 个答案:

答案 0 :(得分:13)

您应该添加LastTimeSeen列,而不是IsLoggedIn列。任何人访问页面时都会更新列:

UPDATE members SET LastTimeSeen = NOW() WHERE id = $the_user_id

然后,要在任何特定时刻获取网站上有多少人,请使用查询:

SELECT COUNT(*) FROM members WHERE LastTimeSeen > DATE_SUB(NOW(), INTERVAL 5 MINUTE)

这表明在过去的5分钟内有多少人浏览了一个页面,这是没有更复杂的解决方案的最佳选择。

答案 1 :(得分:4)

提供另一种解决方案:

if ($user->isLoggedIn()) {
  touch("/writable/path/loggedInUsers/" . $user->id);
}

如果您不需要查询此数据,则本地文件触摸比DB写入快得多。要登录用户,请在N秒之前扫描目录以查找文件时间。

答案 2 :(得分:1)

由于我们的网站构建方式,有必要使用ajax方法。我正在使用jQuery,所以它相对无痛。

这些行进入了$(document).ready函数。

fnShowImOnline();
setInterval('fnShowImOnline', 120000);

这是javascript函数......

function fnShowImOnline() {
    $.get('ajax/im_online.php');
}

这是PHP

<?php
    session_start();
    if ((isset($_SESSION['user']))&&($_SESSION['authorized']=='authorized')) {
        include('../includes/db.php');
        db_connect();
        mysql_query("UPDATE members SET last_checked_in = NOW() WHERE user_id = {$_SESSION['user']['user_id']}");
    }

?>

计数是直接的PHP / mySQL。

//  Members online.
$online_sql = "SELECT COUNT(*) FROM members where last_checked_in > DATE_SUB(NOW(), INTERVAL 5 MINUTE)";
$online_RS = mysql_query($online_sql);
$online_row = mysql_fetch_row($online_RS);
$online = $online_row[0];

对于那些我需要动态更新数字的时间,ajax的这一点就可以了。

$.ajax({
    url: 'ajax/members_online.php',
    dataType: 'json',
    success: function(response) {
        if (!isNaN(response.total)) {
            $('#OnlineTotal').html(response.total + " Total ");
            $('#OnlineOnline').html(response.online +  " Online Now");
        }
    }
})

将此用于PHP / mySQL

//  Members online.
$online_sql = "SELECT COUNT(*) FROM members WHERE last_checked_in > DATE_SUB(NOW(), INTERVAL 5 MINUTE)";
$online_RS = mysql_query($online_sql);
$online_row = mysql_fetch_row($online_RS);
$online = $online_row[0];
//  Members total.
$total_sql = "SELECT COUNT(*) FROM members";
$total_RS = mysql_query($total_sql);
$total_row = mysql_fetch_row($total_RS);
$total = $total_row[0];
$response = json_encode(array('total'=>$total,'online'=>$online));
echo($response);

这对我们来说很有效。