Во-первых, это связанный с этим вопрос 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, вот хороший учебник .
Подход, который я использовал для такого рода вещей, заключается не только в сохранении зарегистрированного статуса пользователя, но и в сохранении его последнего времени активности .
Если деятельность может означать:
Пользователь считается отключенным, если выполнено одно из следующих действий:
Чтобы проверить активность, вы сравниваете последнее время активности с текущим временем. Если разность ( $currentTime - $lastActiveTime
) больше N
, вы считаете, что пользователь вышел из системы.
Список зарегистрированных пользователей будет обновляться каждые две секунды (с использованием какого-либо механизма кэширования), где неактивные пользователи будут UPDATE
d для «Logged Out» в базе данных, тем самым сохраняя время запроса и время обработки.