есть DIV с id=users
он обновляется через JS (ajax) каждые 20 секунд.
юзеры в этом диве выводятся с базы в цикле
устанавливаются куки:
setcookie("online", $_SESSION['nick'], time()+25); // запись кук на 25 секунд
получается что при обновлении дива (обновляется автоматически) записывается кука... $_COOKIE['online']
Нужно сделать так...
Если записывается кука - значит юзер находится на странице, если вышел, соответственно див не обновляется т.к. юзер ее не грузит.. срок действия куки истекает (25 сек.) и при этом должен выполнится запрос на удаление записи из базы (на удаление ника из таблицы с он лайном)
Чё то не пойму как сделать такое
Спустя 11 минут, 5 секунд (16.01.2010 - 20:56) arlamar написал(а):
А я чё то не пойму вообще чё тут надо))) зачем куки, зачем удалять из базы если в офф ушёл... кароч объясни лучше задачу, может чё нить придумаем
тебе нужен динамический список "пользователей онлайн"?
тебе нужен динамический список "пользователей онлайн"?
Спустя 2 часа, 17 минут, 58 секунд (16.01.2010 - 23:14) Platinum написал(а):
arlamar, Щас попробую обьяснить что мне надо и зачем
Вот смотри вот у меня в базе есть таблица online.
После авторизации юзер получает сессию $_SESSION['nick']
Юзер заходит в чат, код в диве #users выполняется выборка ников:
Далее проверяется,
Соответственно если юзер закрывает браузер или вкладку, то запись остаётся в табличке и ник остается в списке.
Удалять ник методом $_GET[] тоже не совсем правильно.
т.е. человек нажмёт на ссылку выход - session_destroy(); и удаление записи из таблицы.
Всё вроде бы хорошо) но почти все юзеры не нажимают на кнопку выхода и закрывают вкладку или браузер.
И вот я решил сделать так:
Раз у меня обновляется список с онлайном (div id=users) каждые 20 секунд, то почему бы и не записывать куку со временем к примеру 25-30 секунд.
Если юзер находится в чате, то каждые 20 сек будет обновляться содержимое дива и записываться кука (устанавливаться будет время time()+25 // 25 сек.)
А если юзера нету в чате, т.е. див не обновляется, то время жизни куки истекает и проверяется каким то образом
Думаю всё обьяснил правильно и понятно
Вот смотри вот у меня в базе есть таблица online.
После авторизации юзер получает сессию $_SESSION['nick']
Юзер заходит в чат, код в диве #users выполняется выборка ников:
$nick = $_SESSION['nick'];
...
$check_online_nick = mysql_query("SELECT nick FROM online WHERE nick='$nick'", $db);
$check_online_nick = mysql_fetch_array($check_online_nick);
Далее проверяется,
if ($_SESSION['nick'] != $check_online_nick['nick'])
{выполняется запрос на вставку ника в базу в таблицу online}
Соответственно если юзер закрывает браузер или вкладку, то запись остаётся в табличке и ник остается в списке.
Удалять ник методом $_GET[] тоже не совсем правильно.
т.е. человек нажмёт на ссылку выход - session_destroy(); и удаление записи из таблицы.
Всё вроде бы хорошо) но почти все юзеры не нажимают на кнопку выхода и закрывают вкладку или браузер.
И вот я решил сделать так:
Раз у меня обновляется список с онлайном (div id=users) каждые 20 секунд, то почему бы и не записывать куку со временем к примеру 25-30 секунд.
Если юзер находится в чате, то каждые 20 сек будет обновляться содержимое дива и записываться кука (устанавливаться будет время time()+25 // 25 сек.)
А если юзера нету в чате, т.е. див не обновляется, то время жизни куки истекает и проверяется каким то образом
if ($_COOKIE['online'] != $_SESSION['nick'] // или что то другое)
{mysql_query("DELETE FROM online WHERE nick='$ник'");}
Думаю всё обьяснил правильно и понятно
Спустя 15 минут, 2 секунды (16.01.2010 - 23:29) FatCat написал(а):
Зачем так сложно?
При каждом рефреше в сессию юзеру апдейтишь time()
И удаляешь сессии, у которых тайм просрочен больше 25 секунд или сколько тебе надо.
При каждом рефреше в сессию юзеру апдейтишь time()
И удаляешь сессии, у которых тайм просрочен больше 25 секунд или сколько тебе надо.
Спустя 34 минуты, 39 секунд (17.01.2010 - 00:03) Platinum написал(а):
т.е. создавать ещё одну переменную
$_SESSION['online_time'] = 25;?
Цитата |
И удаляешь сессии, у которых тайм просрочен больше 25 секунд или сколько тебе надо. |
А как проверить просрочен тайм или нет? Чё то не совсем понимаю
Спустя 16 минут, 28 секунд (17.01.2010 - 00:20) FatCat написал(а):
Цитата (Platinum @ 17.01.2010 - 01:03) |
А как проверить просрочен тайм или нет? Чё то не совсем понимаю |
$DB->query("DELETE FROM `sessions` WHERE `time`<".(time()-25)." ' ");
Спустя 14 минут, 14 секунд (17.01.2010 - 00:34) Platinum написал(а):
FatCat а как я узнаю какому юзеру апдейт времени делать?)
Ведь сначала будет апдейтится, потом выполняться запрос на удаление и в итоге ничего не удалит.
Или я чё то не понимаю
Вот я создал в таблице online поле time, в него нужно апдейтить time() ?
А потом удалять записи со старыми значениями
Ведь сначала будет апдейтится, потом выполняться запрос на удаление и в итоге ничего не удалит.
Или я чё то не понимаю
Вот я создал в таблице online поле time, в него нужно апдейтить time() ?
А потом удалять записи со старыми значениями
$DB->query("DELETE FROM `online` WHERE `time`<".(time()-25)." ' ") or die('\n<br>Delete old session error!');
Спустя 3 часа, 15 минут, 17 секунд (17.01.2010 - 03:49) arlamar написал(а):
блин всё просто же
есть же таблица users так вот:
есть же таблица users так вот:
//добавляем поле last_avtive в таблицу users и каждый раз когда юзер обращается к сайту, заносим туда время следующей функцией:
function users_set_online($user_id, $mysql_link) {
$time = time();
$query = "UPDATE users SET last_avtive='$time' WHERE id=$user_id";
mysql_query($query, $mysql_link);
}
//а вот когда читаем список пользователей "онлайн" используем следующую функцию
//вызывай её допустим users_get_list($mysql_link, 25);
function users_get_list($mysql_link, $online_time = 30) {
$time = time()-$online_time;
$where = " WHERE last_avtive>=$time";
$query = "SELECT * FROM users$where";
$result = mysql_query($query, $mysql_link);
return $result;
}
Спустя 1 час, 51 минута, 39 секунд (17.01.2010 - 05:41) Platinum написал(а):
arlamar спс всё работает код только переписал чуток, но суть я понял..как я сразу не додумался так сделать)
А можно сделать ещё так, чтобы если не выводится запись с
WHERE last_avtive>=$time
то выводилось сообщение о выходе? Как я понимаю это надо как то идентифицировать ник того, у кого last_avtive < $time
А можно сделать ещё так, чтобы если не выводится запись с
WHERE last_avtive>=$time
то выводилось сообщение о выходе? Как я понимаю это надо как то идентифицировать ник того, у кого last_avtive < $time
Спустя 6 часов, 51 минута, 22 секунды (17.01.2010 - 12:32) arlamar написал(а):
пожалуйста
а по поводу:
а по поводу:
Цитата |
А можно сделать ещё так, чтобы если не выводится запись с WHERE last_avtive>=$time то выводилось сообщение о выходе? Как я понимаю это надо как то идентифицировать ник того, у кого last_avtive < $time |
что бы пользователю сказать что он оффлайн надо же спросить сервер)) а если у тебя users_set_online() вызывается при любом обращении то он автоматом становится онлайн) поэтому не понятен смысл выше описанного. если же всё таки users_set_online() вызывается не при каждом обращении, проверку "онлайн ли я" можно сделать обычным аяксовым запросом
Спустя 46 минут, 11 секунд (17.01.2010 - 13:19) Platinum написал(а):
arlamar в юзер листе всё работает, всё обновляется хорошо
Нужно чтобы к диву с сообщениями пользователей добавлялось сообщение типа
"[time] От нас уходит $nick"
p.s. чтобы люди знали что ушёл этот человек
Нужно чтобы к диву с сообщениями пользователей добавлялось сообщение типа
"[time] От нас уходит $nick"
p.s. чтобы люди знали что ушёл этот человек
Спустя 4 часа, 39 минут, 20 секунд (17.01.2010 - 17:58) Dron19 написал(а):
Блин ну это же все легко, записывай пользователя в базу и подключи к главному файлу файл который распознает пользователей, в этом файле (я его назвал online.php) напиши строку mysql_query("DELETE FROM online WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP(time) > 20"); и с таким раскладом удалении нужно записывать в базу в поле time NOW() mysql_query("INSERT INTO online (time,id) VALUES (NOW(),'$id')"); я же писал свои online счетчик в форуме 'Оцените' поищи, скопируй и переделай под себя:)
Спустя 31 минута, 36 секунд (17.01.2010 - 18:30) Platinum написал(а):
Dron19 да он лайн у меня уже работает! Нужно чтобы в чате сообщением выводило что кто то уходит
Спустя 22 часа, 2 минуты, 39 секунд (18.01.2010 - 16:32) Platinum написал(а):
Нужно сделать чтоб каким то образом определялось что пользователь удалился из списка и выводить сообщение о его выходе всем.
Спустя 26 минут, 36 секунд (18.01.2010 - 16:59) Lex_R написал(а):
Можно так сделать: перед тем как удалить просроченные сессии, сделай запрос на выборку пользователей, у которых просрочена сессия, потом удаляй эти сессии и выводи в чат сообщение о уходе пользователей
Спустя 7 часов, 9 минут, 19 секунд (19.01.2010 - 00:08) Platinum написал(а):
Lex_R, спс) сделал как ты сказал и в цикле стал выводить все сообщения с никами где просрочена сессия))
ппц вот вроде всё просто..и чё я сразу не додумался так сделать
ппц вот вроде всё просто..и чё я сразу не додумался так сделать
Спустя 6 месяцев, 4 дня, 20 часов, 27 минут, 15 секунд (23.07.2010 - 19:35) Guest написал(а):
Я ничего понять не могу)))