Привет всем, поэтому у меня есть частично рабочий код. Однако у меня также есть проблемы с этим. Но позвольте мне начать рассказывать вам, чего я пытаюсь достичь … На моем сайте у меня есть логин, который отправляет всех пользователей на домашнюю страницу один раз и только в том случае, если пользователь вошел в систему. Я хотел бы показать, кто еще зашел на мою страницу, показывая там имена пользователей в списке.
Хорошо, поэтому я могу закодировать его, чтобы добавить пользователей к подключению сайта к базе данных, а затем отобразить каждого пользователя в этой базе данных в div, который отлично подходит для отображения всех онлайн …
Однако, когда пользователь покидает страницу, имя пользователя должно быть удалено из базы данных онлайн-пользователей. Раньше я просто делал это с опцией закрытия окна в java. Но из-за того, что Safari Google и 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; }
Извините, это немного грязно из-за моего перекодирования его столько раз, чтобы заставить его работать. Я был бы признателен, если бы кто-нибудь мог оказать мне помощь, чтобы заставить это работать. Теперь, если это не просто просто код выше, я могу добавить пользователя в онлайн-базу данных пользователя при входе на страницу и получить его, чтобы он часто указывал, что он часто перечисляет пользователей в базе данных.
Однако, если у вас есть какие-либо идеи по коду для следующего, это было бы здорово … Пользователь, покидающий страницу, сталкивается с проблемой. Мне нужен какой-то метод проверки пользователя, который все еще активен, и если они не удаляют их из базы данных, поэтому, когда список затем обновляется, пользователь больше не входит в список. Например, что-то пинговать до тех пор, пока он не получит ответ и удалит пользователя из базы данных.
Поскольку у моего текущего кода возникают проблемы с несколькими пользователями и синхронизация функции интервалов, необходимо учитывать это, так как разные пользователи будут видеть обновление списка в разное время.
PS Я также посмотрел на использование $ SESSION, однако я все еще не уверен, как сделать эту работу с проверкой для автономных пользователей, а затем удалить их из базы данных, это может быть метод ее выполнения.
Спасибо, я надеюсь, что информации достаточно.
Я использовал другой подход:
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 / identifier и сохраняет / обновляет, что + временная метка unix в БД. Возвращает список всех строк с временной отметкой unix за последние 10 минут.
<?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(); ?>
Я использовал эту логику несколько раз с указанием и без имени пользователя (иногда просто числа).
Конечно, код можно было бы улучшить, но основной принцип – довольно хорошее решение.
Вы можете попробовать вместо удаления включить временную метку (на сервере) при вставке.
Затем вставляйте / обновляйте код javascript каждую минуту или около того.
Тогда ваш запрос о том, кто находится, это просто, какие строки имеют недавнюю метку времени (например, последние 65 секунд)
Разумеется, вам придется очищать старые строки в таблице, если вы не хотите, чтобы журнал всех, кто когда-либо был и когда.