Статус онлайн-офлайн-статус – проблема с автономным статусом

Во-первых, это связанный с этим вопрос PHP: онлайновый статус в автономном режиме. Но поскольку мой подход немного отличается и проблема тоже, я решил, что новый вопрос будет лучше.

Теперь я добавил один столбец в таблицу qa_users, называемую «онлайн», которая вставляет / обновляет время регистрации и постоянно обновляет взаимодействие с пользователем (я не уверен, что это правильно или нет)

Теперь он отображает пользователя онлайн, как только они вошли в систему, но проблема после выхода из системы, они сохраняют статус отображения в сети и никогда не выходят в автономный режим.

Я думаю, что что-то не так с моим условным кодом сравнения времени, но чего я не знаю.

Ниже вы найдете код, который я использую.

$loggedtime = date('Ymd h:i:s', time()-300); // 5 minutes $query = 'SELECT userid, handle, online FROM ^users ORDER BY userid ASC'; $result = qa_db_query_sub($query); while($ids = mysql_fetch_array($result)){ $online = $ids['online']; $userid = qa_get_logged_in_userid(); if(qa_is_logged_in()){ $update = 'UPDATE ^users SET online = NOW() WHERE userid = '.$userid.''; qa_db_query_sub($update); } $time = $ids['online']; if ($time >= $loggedtime){ // i have tried with $loggedtime > $time too echo '<li>'.$ids['handle'].' online</li>'; } else { echo '<li>'.$ids['handle'].' offline</li>'; } } 

Не зная своего структурного подразделения DB, это своего рода догадка.

 if ($time >= $loggedtime) 

Вы сравниваете строку типа '2012-11-01 10:10:10' с любым $time в вашей БД. Это, кажется, проблема здесь. Вы могли / должны использовать отметки времени UNIX. Их можно легко сравнивать.

Если $time – это временная метка UNIX, которую вы могли бы просто сделать:

 if ($time >= time()-300) 

РЕДАКТИРОВАТЬ:

Измените свой запрос, чтобы получить временную метку UNIX для online запросов

 $query = 'SELECT userid, handle, UNIX_TIMESTAMP(online) as online FROM ^users ORDER BY userid ASC'; 

EDIT2: Сделать это более ясно: в вашей первой версии вы сравнивали два дата в форме «2012-11-01 10:10:10»

 if ('2012-11-01 10:10:10' < '2012-11-02 10:10:10') 

Это не может работать на PHP – это как делать:

 if ('apples' < 'bananas') 

Вы должны сравнивать числа. Поэтому я предложил использовать временные метки unix, которые можно легко сравнить.

Позвольте мне начать с этого:

Пожалуйста, не используйте функции mysql_* в новом коде . Они больше не поддерживаются, и на нем начался процесс устаревания . См. Красную рамку ? Узнайте о подготовленных инструкциях и используйте PDO или MySQLi – эта статья поможет вам решить, какой из них. Если вы выберете PDO, вот хороший учебник .


Подход, который я использовал для такого рода вещей, заключается не только в сохранении зарегистрированного статуса пользователя, но и в сохранении его последнего времени активности .

Если деятельность может означать:

  • Витировал страницу.
  • Представлена ​​форма.
  • Что-нибудь на вашем сайте

Пользователь считается отключенным, если выполнено одно из следующих действий:

  • Пользователь вышел из системы через ссылку «Выход».
  • Пользователь не был активным в течение N секунд.

Чтобы проверить активность, вы сравниваете последнее время активности с текущим временем. Если разность ( $currentTime - $lastActiveTime ) больше N , вы считаете, что пользователь вышел из системы.

Список зарегистрированных пользователей будет обновляться каждые две секунды (с использованием какого-либо механизма кэширования), где неактивные пользователи будут UPDATE d для «Logged Out» в базе данных, тем самым сохраняя время запроса и время обработки.