Баг со статусом ОНЛАЙН - руководство к исправлению

#1 18 июня 2013 в 19:51
Неверное отображение статуса онлайн связано со следующим моментом:

Статус присваивается в функции получения друзей, которая затем формирует из значений массив и кладет его в сессию, соответственно при авторизации Вы получаете своих друзей и их статусы, при входе и выходе друга статус обновляется, но у вас он остается такой же, так как данные берутся из массива сохраненного в сессии.

Чтобы это исправить нужно дописать несколько строчек в user.class.php
Найти функцию получения друзей: getFriends($user_id=0)

И изменить строчку:
  1. if ($is_me && self::sessionGet('friends') !== false) { return self::sessionGet('friends'); }
На:

  1.  
  2. if ($is_me && self::sessionGet('friends') !== false) {
  3. $friends= array();
  4. $friends = self::sessionGet('friends');
  5. foreach ($friends as $value) {
  6. $value['is_online'] = self::isOnline($value['id']);
  7. $friends[$value['id']] = $value;
  8. }
  9. return $friends;
  10. }
После этих изменений, если список друзей будет существовать в сессии, то в нем будет лишь проверен статус каждого друга. Немного изменится нагрузка в качестве дополнительной обработки массива данных и запроса таблицы cms_online но статус будет всегда актуальным.

Кое что следовало бы еще в cms.php изменить, при записи в cms_online обновление строки происходит не всегда корректно (бывает что в поле user_id стоит 0), при желании переместите user_id из ON DUPLICATE UPDATE в INSERT IGNORE — это не обязательно, при повторном обновлении странички все исправляется.
#2 18 июня 2013 в 20:06

Кое что следовало бы еще в cms.php изменить, при записи в cms_online обновление строки происходит не всегда корректно (бывает что в поле user_id стоит 0)

Smith
хм… нечто подобное видел, когда писал себе модуль и мне надо было получить id юзера… и время от времени слетала сессия… но я грешил на денвер… спасибо за наводку, теперь поковыряюсь в коде.
#3 18 июня 2013 в 20:09
Дело в том, что INSERT IGNORE вставляет запись в случае ее отсутствия, DUPLICATE UPDATE лишь их обновляет, логичней было бы перенести user_id в первое условие, а обновлять только просматриваемую страницу и браузер пользователя
#4 10 июля 2013 в 03:08
Поднимаю тему, вопрос о пустых записях связан с неправильным запросом к БД, например:
  1.  
  2. $inDB->query("INSERT IGNORE INTO cms_online (ip, sess_id) VALUES ('$ip', '$sess_id') ON DUPLICATE KEY UPDATE user_id = '$user_id', agent = '$useragent'");
  3.  
Если запись не существовала, то user_id и agent будут пустыми, так как ON DUPLICATE KEY UPDATE лишь обновляет существующие значения

Исходя из этого логичней запрос изменить на:
  1. $inDB->query("INSERT IGNORE INTO cms_online (ip, sess_id, user_id, agent) VALUES ('$ip', '$sess_id', '$user_id', '$useragent') ON DUPLICATE KEY UPDATE user_id = '$user_id', agent = '$useragent'");
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.