[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Запись в куки -> удаление записи из MySQL
Platinum
пишу в чате функцию он лайна в юзерлисте...
есть DIV с id=users
он обновляется через JS (ajax) каждые 20 секунд.
юзеры в этом диве выводятся с базы в цикле

устанавливаются куки:
setcookie("online", $_SESSION['nick'], time()+25); // запись кук на 25 секунд


получается что при обновлении дива (обновляется автоматически) записывается кука... $_COOKIE['online']
Нужно сделать так...
Если записывается кука - значит юзер находится на странице, если вышел, соответственно див не обновляется т.к. юзер ее не грузит.. срок действия куки истекает (25 сек.) и при этом должен выполнится запрос на удаление записи из базы (на удаление ника из таблицы с он лайном)

Чё то не пойму как сделать такое smile.gif



Спустя 11 минут, 5 секунд (16.01.2010 - 20:56) arlamar написал(а):
А я чё то не пойму вообще чё тут надо))) зачем куки, зачем удалять из базы если в офф ушёл... кароч объясни лучше задачу, может чё нить придумаем
тебе нужен динамический список "пользователей онлайн"?

Спустя 2 часа, 17 минут, 58 секунд (16.01.2010 - 23:14) Platinum написал(а):
arlamar, Щас попробую обьяснить что мне надо и зачем smile.gif
Вот смотри вот у меня в базе есть таблица 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='$ник'");}



Думаю всё обьяснил правильно и понятно smile.gif

Спустя 15 минут, 2 секунды (16.01.2010 - 23:29) FatCat написал(а):
Зачем так сложно?
При каждом рефреше в сессию юзеру апдейтишь time()
И удаляешь сессии, у которых тайм просрочен больше 25 секунд или сколько тебе надо.

Спустя 34 минуты, 39 секунд (17.01.2010 - 00:03) Platinum написал(а):
т.е. создавать ещё одну переменную
$_SESSION['online_time'] = 25;
?
Цитата
И удаляешь сессии, у которых тайм просрочен больше 25 секунд или сколько тебе надо.

А как проверить просрочен тайм или нет? Чё то не совсем понимаю biggrin.gif

Спустя 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 а как я узнаю какому юзеру апдейт времени делать?)

Ведь сначала будет апдейтится, потом выполняться запрос на удаление и в итоге ничего не удалит.
Или я чё то не понимаю huh.gif

Вот я создал в таблице 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 так вот:
//добавляем поле 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 спс всё работает rolleyes.gif код только переписал чуток, но суть я понял..как я сразу не додумался так сделать)

А можно сделать ещё так, чтобы если не выводится запись с
WHERE last_avtive>=$time
то выводилось сообщение о выходе? Как я понимаю это надо как то идентифицировать ник того, у кого last_avtive < $time unsure.gif

Спустя 6 часов, 51 минута, 22 секунды (17.01.2010 - 12:32) arlamar написал(а):
пожалуйста smile.gif


а по поводу:
Цитата
А можно сделать ещё так, чтобы если не выводится запись с
WHERE last_avtive>=$time
то выводилось сообщение о выходе? Как я понимаю это надо как то идентифицировать ник того, у кого last_avtive < $time


что бы пользователю сказать что он оффлайн надо же спросить сервер)) а если у тебя users_set_online() вызывается при любом обращении то он автоматом становится онлайн) поэтому не понятен смысл выше описанного. если же всё таки users_set_online() вызывается не при каждом обращении, проверку "онлайн ли я" можно сделать обычным аяксовым запросом

Спустя 46 минут, 11 секунд (17.01.2010 - 13:19) Platinum написал(а):
arlamar в юзер листе всё работает, всё обновляется хорошо smile.gif

Нужно чтобы к диву с сообщениями пользователей добавлялось сообщение типа
"[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, спс) сделал как ты сказал и в цикле стал выводить все сообщения с никами где просрочена сессия))
ппц вот вроде всё просто..и чё я сразу не додумался так сделать laugh.gif

Спустя 6 месяцев, 4 дня, 20 часов, 27 минут, 15 секунд (23.07.2010 - 19:35) Guest написал(а):
Я ничего понять не могу)))
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.