使用PHP显示在线用户列表

使用PHP显示在线用户列表,php,mysql,database,session,session-timeout,Php,Mysql,Database,Session,Session Timeout,大家好,我有部分工作代码。但是我也有一些问题。但让我先告诉你我正在努力实现的目标。。。在我的网站上,我有一个登录工具,它可以将所有用户发送到主页一次,并且只有在用户登录时才发送。我想在我的页面上显示其他登录者,在列表中显示这些用户名 我现在的能力。。。 好的,我可以编写代码,将加入网站的用户添加到数据库中,然后将数据库中的每个用户显示到一个div中,这很好,因为它可以在线显示每个人 问题所在。。。 但是,当用户离开页面时,需要从联机用户数据库中删除用户名。在过去,我只是使用java中的on wi

大家好,我有部分工作代码。但是我也有一些问题。但让我先告诉你我正在努力实现的目标。。。在我的网站上,我有一个登录工具,它可以将所有用户发送到主页一次,并且只有在用户登录时才发送。我想在我的页面上显示其他登录者,在列表中显示这些用户名

我现在的能力。。。 好的,我可以编写代码,将加入网站的用户添加到数据库中,然后将数据库中的每个用户显示到一个div中,这很好,因为它可以在线显示每个人

问题所在。。。 但是,当用户离开页面时,需要从联机用户数据库中删除用户名。在过去,我只是使用java中的on window close选项来实现这一点。但由于谷歌safari和Firefox不再支持这个选项,我不得不寻找另一种方式来实现它

下面的代码所做的。。。 下面的代码加载了一个时间间隔,所以在这么长的时间之后,它会在其中重复代码。代码首先将用户添加到数据库中,然后在站点上的列表中显示该用户,然后从数据库中删除该用户,以防他们随后脱机

问题所在。。。 对于一个用户来说,这一切都很好,但一旦第二个用户参与进来,间隔就会在不同的时间出现。因此,我已经从数据库中删除了显示列表后的用户,但这意味着第二个用户显示数据库,而第一个用户不在其中,因为他们被删除了。。。这也会导致一个问题,如果用户在函数运行的中途脱机,然后将它们留在数据库中,而不将它们从数据库中删除

以下是java代码。。。
$(文档).ready(函数(){
var user_name=“”;
setInterval(函数(){
$.post('onlineusers.php',{name:user_name,action:“joined”});
$.post(“onlineusers.php”,{action2:“list”},函数(数据){
$('#listusers').html(数据);
});
$.post(“onlineusers.php”,{nameleft:user_name,action3:“left”},函数(数据){
$('#errorreport').html(数据);
});
}, 5000);
}):  
现在有了PHP文档代码
/-----------用户加入页面放入数据库--------
如果($\请求[“名称”])
{
$user\u name=$\u请求['name'];
};  
如果($_请求[“操作”])
{
$action=$_请求['action'];
};
如果($action=='joined'){
用户加入($user\u name);
};
//-----------在第----------------页中列出在线用户
如果($\请求[“操作2”])
{
$action2=$_请求['action2'];
};
如果($action2=='list'){
foreach(user_list()作为$user){
echo$user.“
”; }; }; //------------用户左键从数据库中删除------------ 如果($_请求[“nameleft”]) { $user_nameleft=$\u请求['nameleft']; }; 如果($_请求[“操作3”]){ $action3=$_请求['action3']; }; 如果($action3=='left'){ user\u left($user\u nameleft); }; //------功能如何做-------- 已加入函数user\u($user\u name){ $user\u name=mysql\u real\u escape\u字符串(htmlentities($user\u name)); mysql_查询(“插入用户(用户名)值('$user_name'))或死亡(“这没有发生”); } 函数user\u left($user\u name left){ $user\u name=mysql\u real\u escape\u字符串(($user\u nameleft)); $query=mysql\u query(“从用户中删除,其中user\u name='$user\u name left'”)或die(“从表中删除失败”); } 函数用户列表(){ $user_list=array(); $users\u query=mysql\u query(“从用户中选择用户名”)或die(“无法收集用户列表”); 而($users\u row=mysql\u fetch\u assoc($users\u query)){ $user_list[]=$users_行['user_name']; } 返回$user\u列表; }
上述代码 很抱歉,它有点乱,因为为了让它工作,我重复了这么多次。 如果有人能帮我把这件事做好,我将不胜感激。现在,如果不只是简单地删除上面的代码,我可以在进入页面时将用户添加到在线用户数据库中,并通过在数据库中列出用户来列出经常在线的用户

真正的问题和我在哪里寻求你的帮助请。。。 但是,如果您对下面的代码有任何想法,那就太好了。。。离开页面的用户就是出现问题的地方。我需要一些方法来检查用户是否仍然处于活动状态,如果没有,则将其从数据库中删除,以便当列表刷新时,用户不再在列表中。例如ping某个东西,直到它没有响应并从数据库中删除该用户

由于我当前的代码在多个用户和间隔函数的同步方面存在问题,因此需要考虑到不同的用户将在不同的时间看到列表刷新

另外,我也研究过使用$SESSION,但是我仍然不确定如何通过检查脱机用户然后将其从数据库中删除来实现这一点。这可能是一种方法


谢谢,我希望有足够的信息继续。

我采取了不同的方法:
JS:
循环5秒后,AJAX请求onlinenow.php并在online users框中显示返回的html-这主要是从W3C复制和粘贴的,URL已更改

setInterval("getOnline()",5000);
function getOnline()
{
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("onlineNow").innerHTML=xmlhttp.responseText;
    }
  }
xmlhttp.open("GET","http://www.path.com/to/onlinenow.php",true);
xmlhttp.send();
}
PHP:
获取用户/ip/标识符,并在数据库中存储/更新+unix时间戳 返回过去10分钟内具有unix时间戳的所有行的列表

<?php
header('Access-Control-Allow-Origin: *');//Pretty sure this enables cross domain AJAX
$session = $_SERVER['REMOTE_ADDR'];
$time=time();
$time_check=$time-60; //SET TIME 10 Minute


$host="localhost"; // Host name
$username="root"; // Mysql username
$password="pass"; // Mysql password
$db_name="custom"; // Database name
$tbl_name="table"; // Table name


// Connect to server and select databse
 mysql_connect("$host", "$username", "$password")or die("cannot connect to server");
 mysql_select_db("$db_name")or die("cannot select DB");

// Check if user is already in the DB
$sql="SELECT * FROM $tbl_name WHERE session='$session'";
 $result=mysql_query($sql);

$count=mysql_num_rows($result);

if($count=="0"){
    //User is not in the DB, lets add them
$sql1="INSERT INTO $tbl_name(session, time, ip)VALUES('$session', '$time', '".$_SERVER['REMOTE_ADDR']."')";
$result1=mysql_query($sql1);
}
//Update this user's entry
else {
    //User is in the DB, Update their entry
    $sql2="UPDATE $tbl_name SET time='$time' WHERE session = '$session'";
    $result2=mysql_query($sql2);
}

//Done updating info, time to get the user list
// if over 10 minute, delete session - Could just get all in past 10 mins instead
$sql4="DELETE FROM $tbl_name WHERE time<$time_check";
$result4=mysql_query($sql4);

//Get total users (Could get a list of names if you preferred and store the info)
$sql3="SELECT * FROM $tbl_name";
$result3=mysql_query($sql3);
$count_user_online=mysql_num_rows($result3);
if ($count_user_online == 1) {
    $plur = "";
}
else {
    $plur = "s";
}
echo "&nbsp;&nbsp;$count_user_online user".$plur." online now&nbsp;&nbsp;";

// Close connection 
mysql_close();
 ?>

您可以尝试在插入时包含时间戳(基于服务器),而不是删除

然后每隔一分钟左右插入/更新javascript代码

然后,您对谁在上的查询就是哪些行具有最近的时间戳(如最后65秒)

当然,您最终必须清除表中的旧行,除非您想要记录每个人的登录时间和登录时间。

setInterval("getOnline()",5000);
function getOnline()
{
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("onlineNow").innerHTML=xmlhttp.responseText;
    }
  }
xmlhttp.open("GET","http://www.path.com/to/onlinenow.php",true);
xmlhttp.send();
}
<?php
header('Access-Control-Allow-Origin: *');//Pretty sure this enables cross domain AJAX
$session = $_SERVER['REMOTE_ADDR'];
$time=time();
$time_check=$time-60; //SET TIME 10 Minute


$host="localhost"; // Host name
$username="root"; // Mysql username
$password="pass"; // Mysql password
$db_name="custom"; // Database name
$tbl_name="table"; // Table name


// Connect to server and select databse
 mysql_connect("$host", "$username", "$password")or die("cannot connect to server");
 mysql_select_db("$db_name")or die("cannot select DB");

// Check if user is already in the DB
$sql="SELECT * FROM $tbl_name WHERE session='$session'";
 $result=mysql_query($sql);

$count=mysql_num_rows($result);

if($count=="0"){
    //User is not in the DB, lets add them
$sql1="INSERT INTO $tbl_name(session, time, ip)VALUES('$session', '$time', '".$_SERVER['REMOTE_ADDR']."')";
$result1=mysql_query($sql1);
}
//Update this user's entry
else {
    //User is in the DB, Update their entry
    $sql2="UPDATE $tbl_name SET time='$time' WHERE session = '$session'";
    $result2=mysql_query($sql2);
}

//Done updating info, time to get the user list
// if over 10 minute, delete session - Could just get all in past 10 mins instead
$sql4="DELETE FROM $tbl_name WHERE time<$time_check";
$result4=mysql_query($sql4);

//Get total users (Could get a list of names if you preferred and store the info)
$sql3="SELECT * FROM $tbl_name";
$result3=mysql_query($sql3);
$count_user_online=mysql_num_rows($result3);
if ($count_user_online == 1) {
    $plur = "";
}
else {
    $plur = "s";
}
echo "&nbsp;&nbsp;$count_user_online user".$plur." online now&nbsp;&nbsp;";

// Close connection 
mysql_close();
 ?>