【发布时间】:2013-09-20 18:38:34
【问题描述】:
大家好,所以我有部分工作代码。但是我也有问题。但是让我开始告诉你我想要实现的目标......在我的网站上,我有一个登录工具,它会将所有用户发送到一个主页,并且只有当用户登录时。我想显示还有谁在我的页面上登录,在列表中显示用户名。
我的代码当前能力...
好的,所以我可以编写代码以将加入网站的用户添加到数据库中,然后将该数据库上的每个用户显示到一个 div 中,这非常棒,因为它可以在线显示每个人...
问题出在哪里...
但是,当用户离开页面时,需要从在线用户数据库中删除用户名。在过去,我会简单地使用 java 中的 on window close 选项来执行此操作。但由于 Google safari 和 Firefox 不再支持此选项,我不得不另谋出路。
下面的代码做了什么……
所以下面的代码会加载一个间隔,所以在很长一段时间后它会重复其中的代码。代码首先将用户添加到数据库中,然后将用户显示在站点上的列表中,然后从数据库中删除用户,以防万一他们离线。
问题出在哪里...
对于一个用户来说这一切都很好,但是一旦第二个用户参与其中,间隔就会在不同的时间下降。所以我在显示列表后从数据库中删除了用户,但这意味着第二个用户显示数据库,而第一个用户不在其中,因为他们被删除了......如果用户离线,这也会导致问题函数执行到一半时,它会将它们留在数据库中,并且不会将它们从数据库中删除。
以下是java代码...
$(document).ready(function() {
var user_name = "<?php print $username ?>";
setInterval(function() {
$.post('onlineusers.php', { name: user_name, action:"joined" });
$.post("onlineusers.php", { action2: "list" }, function(data){
$('#listusers').html(data);
});
$.post("onlineusers.php", { nameleft: user_name, action3:"left" }, function(data){
$('#errorrreport').html(data);
});
}, 5000);
}):
现在有PHP文档代码
//------------User joined page put into database --------
if( $_REQUEST["name"])
{
$user_name = $_REQUEST['name'];
};
if( $_REQUEST["action"])
{
$action = $_REQUEST['action'];
};
if ($action == 'joined') {
user_joined($user_name);
};
//-----------Listing online users within page -------------
if( $_REQUEST["action2"])
{
$action2 = $_REQUEST['action2'];
};
if($action2 == 'list') {
foreach (user_list() as $user){
echo $user . "<br />";
};
};
//------------ User left delete from the database ------------
if( $_REQUEST["nameleft"])
{
$user_nameleft = $_REQUEST['nameleft'];
};
if( $_REQUEST["action3"]){
$action3 = $_REQUEST['action3'];
};
if($action3 == 'left') {
user_left($user_nameleft);
};
//------ Functions what to do... --------
function user_joined($user_name) {
$user_name = mysql_real_escape_string(htmlentities($user_name));
mysql_query("INSERT INTO users (user_name)VALUES('$user_name')") or die("this didn't happen");
}
function user_left($user_nameleft) {
$user_name = mysql_real_escape_string(($user_nameleft));
$query = mysql_query("DELETE FROM users WHERE user_name = '$user_nameleft'")or die("failed to delete from table");
}
function user_list() {
$user_list = array();
$users_query = mysql_query("SELECT user_name FROM users") or die ("Unable to collect userlist");
while ($users_row = mysql_fetch_assoc($users_query)){
$user_list[] = $users_row['user_name'];
}
return $user_list;
}
以上代码
抱歉,由于我多次重新编码以使其正常工作,因此有点混乱。 如果有人可以帮助我使其正常工作,我将不胜感激。现在,如果不仅仅是上面的代码,我可以在页面入口处将用户添加到在线用户数据库,并通过列出数据库中的用户来列出经常在线的用户。
真正的问题以及我在哪里寻求您的帮助...
但是,如果您对以下代码有任何想法,那就太好了...离开页面的用户是问题出现的地方。我需要一些方法来检查用户是否仍然处于活动状态,如果他们没有从数据库中删除它们,那么当列表刷新时,用户不再在列表中。例如 ping 某些东西直到它没有响应并从数据库中删除用户。
由于我当前的代码存在多个用户和间隔函数同步的问题,因此需要考虑到不同的用户会在不同的时间看到列表刷新。
附:我也看过使用 $SESSION 但是我仍然不确定如何通过检查离线用户然后从数据库中删除它们来完成这项工作,这可能是一种方法。
谢谢,我希望有足够的信息继续下去。
【问题讨论】:
-
我过去一直在玩这个,chrome/ff 很好地支持它,我认为它仍然支持,如果用户关闭选项卡它将他从列表中删除,它适用于 javascript 事件,但是opera没有内置这个事件处理程序,它计划了很多年,但是opera正在消亡,我认为它不会有朝一日。那么实现这一点的方法是将每个用户操作记录到数据库及其时间中,例如,如果时间超过 30 秒,请不要从在线用户列表中选择该用户。这在每个浏览器上都可以正常工作。
-
但是问题来了:如果它是一些聊天系统,而用户只是阅读消息而不执行任何操作,那么有很棒的 jQuery idle 插件可以跟踪用户鼠标事件:@ 987654321@ 真的很好用,我一直用它来显示聊天中的空闲/活跃用户。
标签: php mysql database session session-timeout