大家好,所以我有部分工作代码。不过我也有问题。但是,让我开始告诉你我想要实现的目标......在我的网站上,我有一个登录工具,只有在用户登录时才将所有用户发送到主页。我想显示其他人登录我的页面,显示列表中的用户名。
好吧所以我可以编写代码来添加用户加入网站到数据库,然后将该数据库中的每个用户显示为一个div,这很棒,因为它在线显示所有人...
但是,当用户离开页面时,需要从在线用户数据库中删除用户名。在过去,我只需要在java中使用on window close选项。但由于Google Safari和Firefox不再支持此选项,我不得不寻找另一种方法。
因此下面的代码加载一个间隔,所以在这么多时间之后它会重复其中的代码。代码首先将用户添加到数据库,然后将该用户显示在站点上的列表中,然后从数据库中删除该用户,以防他们要离线。
对于一个用户来说这一切都很好,但是一旦第二个用户参与其中,则间隔会在不同的时间出现。所以我在显示列表后从数据库中删除了用户,但这意味着第二个用户显示数据库,第一个用户不在其中,因为它们被删除...这也会导致用户下线时出现问题在函数发生的一半时间,然后它将它们留在数据库中,并且不会将它们从数据库中删除。
$(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);
}):
//------------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某事直到它没有响应并从数据库中删除用户。
由于我当前的代码存在多个用户的问题以及间隔功能的同步,因此需要考虑到这一点,不同的用户会在不同的时间看到列表刷新。
P.S。我也看过使用$ SESSION但是我仍然不确定如何通过检查脱机用户来完成这项工作,然后从数据库中删除它们这可能是一种方法。
谢谢,我希望有足够的信息继续下去。
答案 0 :(得分:2)
我采取了不同的方法:
JS:
循环5秒,AJAX请求onlinenow.php并在在线用户框中显示返回的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 " $count_user_online user".$plur." online now ";
// Close connection
mysql_close();
?>
我已经多次使用过这个逻辑,无论是否显示用户名(有时只是一个数字) 当然,代码可以改进,但基本原则是一个相当好的解决方案。
答案 1 :(得分:0)
插入时,您可以尝试而不是删除以包含时间戳(基于服务器)。
然后每分钟左右插入/更新javascript代码。
然后你查询谁在上面只是哪些行有最近的时间戳(比如最后65秒)
当然,你必须最终清除表格中的旧行,除非你想要记录所有曾经出现过的人以及何时出现。