Присутствующие на форуме участники
Проблема с секцией "Сегодня присутствовали"
Добрый день,
Хотелось бы сначала выразить моё почтение автору этого форума. Наш сайт пользуется этим движком уже больше пяти лет. В этом году мы приняли решение обновить версию и переехать на форум 3.02. Мы в полном восторге от новой версии, много полезностей и технических улучшений.

Недавно мы столкнулись с такой проблемой: войдя на форум под своим именем и через некоторое время закрыв вкладку - я буду в списках "сегодня присутствовали". Однако, если я решу выйти со своего аккаунта, и, предположим, зайти в аккаунт второй, то меня в списках сегодня присутствовавших уже не будет. Будет отображён второй аккаунт.
Если выйду из него, то оба аккаунта не будут в списках сегодня присутствовавших. В старой версии такой проблемы не было, выходя со своего аккаунта, пользователь, который сейчас заходит всегда фиксировался в списках. Скажите, можно ли разрешить эту проблему? Что примечательно, есть зайти в профиль пользователя, то последний визит отображается корректно.
Буду очень благодарен за возможно оказанную помощь 
Вообще, ситуация, когда пользователь сидит под несколькими логинами, достаточно редкая (а на многих форумах и запрещенная правилами), поэтому я такой вариант не учитывал. А в IntB 3.x сделано так: для того, чтобы когда пользователь входит на форум под своим именем, он убирался бы из числа гостей, добавлено отслеживание по хешу, который считается из IP-адреса, User-Agent и ещё нескольких заголовков. И когда происходит вход/выход пользователя, то в списке присутствующих обновляются данные для всех, у кого такой же хеш, поэтому данные входа под другими логинами теряются.
Делается это в функции fix_online файла app/app.php, вот в этом куске кода:
$sql = 'DELETE FROM '.DB_prefix.'online WHERE hash=\''.$this->db->slashes($hash).'\'';
if ($data['uid'] > AUTH_SYSTEM_USERS)
$sql.=' OR uid='.intval($data['uid']);
$this->db->query($sql);
Можно попробовать заменить OR $sql.=' OR uid='.intval($data['uid']); на
$sql.=' AND (uid=1 OR uid='.intval($data['uid']).')';
Тогда всё станет работать так же, как было в IntB 2.x.
Критикуя — предлагай, предлагая — обосновывай!
4xpro.ru — мой личный сайт-мультиблог на Intellect Board.
В принципе, у нас это тоже не поощряется. У нас есть один пользователь, который заправляет двумя аккаунтами в рамках исключения (ролевая игра).
На самом деле, проблема глубже. Она касается и единичных аккаунтов, т.е. если любой пользователь решит завершить сессию на форуме и выйдет из него (например, с целью, чтобы кто-то из домочадцев не мог прочитать личную информацию (ЛС)), то пользователь из списков также исчезает и таким образом, это влияет на статистику посещений в целом. Вроде человек был, сообщение на форуме оставил, а вроде как его и не было сегодня, некая такая невидимка.
Исправил вышеупомянутый код, но я так же исчезаю из списков "Сегодня присутствовали", как только нажимаю на кнопку "Выйти"...
Разобрался. В общем, нужно привести тот кусок кода, о котором шла речь, к такому виду:
$sql = 'DELETE FROM '.DB_prefix.'online WHERE hash=\''.$this->db->slashes($hash).'\'';
$sql.=' AND (uid=1 OR uid='.intval($data['uid']).')';
$this->db->query($sql);
Но этого будет недостаточно. Потребуется ещё изменить PRIMARY KEY таблицы {prefix}_online, чтобы в него входили столбцы hash и uid.
Делается это так
ALTER TABLE `{prefix}_online` DROP PRIMARY KEY, ADD PRIMARY KEY (`hash`,`uid`);
(выполнять в чем-нибудь вроде PhpMyAdmin или подключившись к MySQL из командной строки).
После этого исчезнет проблема и исчезновения пользователей после выхода, и проблема захода под двумя разными логинами. Но при этом пользователь, вошедший на форум, перестанет считаться гостем.
Вместо {prefix} нужно прописать свой префикс, чаще всего это intb или ib.
Критикуя — предлагай, предлагая — обосновывай!
4xpro.ru — мой личный сайт-мультиблог на Intellect Board.
Спасибо, что вообще взялись за этот вопрос. Проблема действительно разрешилась, теперь выходя из форума я остаюсь в списках. НО:

Вставил код в app.php и выполнил SQL запрос в PhpMyAdmin.
Теперь после выхода из форума, я далее свечусь Онлайн. Не знаю, возможно, что это только на некоторое время, и позже имя исчезнет. В таком случае, в принципе, это не проблема.
В списках теперь имена дублируются почему-то.
Видимо, заходите с разных устройств или IP-адресов, и получается разное поле hash. Тогда попробуем так:
$sql = 'DELETE FROM '.DB_prefix.'online WHERE (hash=\''.$this->db->slashes($hash).'\' AND uid=1)';
if (!$this->is_guest()) $sql.=' OR uid='.intval($data['uid']);
$this->db->query($sql);
Всё правильно: там показывается, кто был на форуме последние 10 минут, вне зависимости от того, залогинены они сейчас или нет.
Критикуя — предлагай, предлагая — обосновывай!
4xpro.ru — мой личный сайт-мультиблог на Intellect Board.
Теперь моё имя не дублируется. И не дублируется имя участницы, которая заходила на форум в тот же момент что и я. А вот два пользователя, которые были на форуме утром, почему-то дублируются:

У вас нет прав для отправки сообщений в эту тему.


