Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Прошу помощи (online/offline пользователи)

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: online/offline пользователи
ArtemRazulin
Отправлено: 14 Августа, 2014 - 07:10:01
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Доброго времени суток друзья.
У меня появилась проблема не могу настроить php скрипт я новичок в php так что не судите строго.
У меня есть панель администрации на сайте там показывается список пользователей из базы (логин, пароль, ip и тд)
Решил сделать статус что бы показывал какие пользователи online а какие offline, долго искать код не пришлось взял его отсюда http://webo4ka[dot]ru/load/57-1-0-3865 и переделал под себя вот так.

PHP:
скопировать код в буфер обмена
  1. $today = date("U");
  2. $totime = date("H:i:s",time()+3*3600);
  3. $olddate = date("d.m.Y");
  4. $u_login=$_SESSION['login'];
  5. $timeold = mysql_query("UPDATE users SET lastdate='$today' WHERE login='".$u_login."'");
  6. $timeout = mysql_query("UPDATE users SET lasttime='$totime' WHERE login='".$u_login."'");
  7. $olddatee = mysql_query("UPDATE users SET olddate='$olddate' WHERE login='".$u_login."'");
  8. $userinfo = mysql_query("SELECT lastdate FROM `users` WHERE login='".$u_login."'");
  9. $userinfodat = mysql_fetch_array($userinfo);
  10. $today = date("U");
  11. if($userinfodat['lastdate'] + 100 < $today) {
  12. mysql_query("UPDATE `users` SET `online`='offline' WHERE login='".$u_login."'");
  13. } else {
  14. mysql_query("UPDATE `users` SET `online`='online' WHERE login='".$u_login."'");
  15. };


А теперь о проблеме: Когда пользователь заходит в кабинет то статус становится online но по истечению времени или если пользователь выйдет то статус не меняется.

Я новичок в этом деле и не знаю что ешё нужно предоставить что бы знающие люди посмотрели.
 
 Top
RickMan
Отправлено: 14 Августа, 2014 - 09:10:02
Post Id


Участник


Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012  


Помог: 30 раз(а)




Ну а что сложного? Сделайте чтобы во время любого действия срабатывал у пользователя такоой запрос:
PHP:
скопировать код в буфер обмена
  1. mysql_query("UPDATE `users` SET `online`='online' WHERE `lasttime`='".time()."' LIMIT 1;");


Ну и при выводе делай так:
PHP:
скопировать код в буфер обмена
  1. if ($user['lasttime'] < time()-60 ){
  2.        // Пользователь онлайн
  3. }else{
  4.       // Пользователь оффлайн
  5. }


Ну вот и всё... Так он будет тебе выводить активных за последнюю минуту. Если надо больше то 60 меняй на другое колличество секунд. Если надо чтобы пользователь был активный даже если он не одновляет окно но окно открыто то делай через axaj фоноыве запросы раз в минуту для обновления lasttime.
 
 Top
likvidator
Отправлено: 14 Августа, 2014 - 09:11:07
Post Id


Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Март 2012  


Помог: 4 раз(а)

[+]


ArtemRazulin пишет:
PHP:
скопировать код в буфер обмена
  1. $timeold = mysql_query("UPDATE users SET lastdate='$today' WHERE login='".$u_login."'"); $timeout = mysql_query("UPDATE users SET lasttime='$totime' WHERE login='".$u_login."'"); $olddatee = mysql_query("UPDATE users SET olddate='$olddate' WHERE login='".$u_login."'");

мои глаза..я просто ничего больше не увидел.. это ШЕДЕВР,товарисч
(Добавление)
ArtemRazulin пишет:
PHP:
скопировать код в буфер обмена
  1. if($userinfodat['lastdate'] + 100 < $today) { mysql_query("UPDATE `users` SET `online`='offline' WHERE login='".$u_login."'");} else { mysql_query("UPDATE `users` SET `online`='online' WHERE login='".$u_login."'");};

а,еще вкусняшка? ммм

(Отредактировано автором: 14 Августа, 2014 - 09:19:49)

 
 Top
ArtemRazulin
Отправлено: 14 Августа, 2014 - 09:27:26
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




RickMan пишет:
Ну а что сложного? Сделайте чтобы во время любого действия срабатывал у пользователя такоой запрос:
PHP:
скопировать код в буфер обмена
  1. mysql_query("UPDATE `users` SET `online`='online' WHERE `lasttime`='".time()."' LIMIT 1;");


Ну и при выводе делай так:
PHP:
скопировать код в буфер обмена
  1. if ($user['lasttime'] < time()-60 ){
  2.        // Пользователь онлайн
  3. }else{
  4.       // Пользователь оффлайн
  5. }


Ну вот и всё... Так он будет тебе выводить активных за последнюю минуту. Если надо больше то 60 меняй на другое колличество секунд. Если надо чтобы пользователь был активный даже если он не одновляет окно но окно открыто то делай через axaj фоноыве запросы раз в минуту для обновления lasttime.


Благодарю за ответ, а можно по подробней или вашу icq просто мне нужна помощь, я разбираюсь только в html и css так сказать только дизайн.
Буду очень благодарен.
(Добавление)
likvidator пишет:
ArtemRazulin пишет:
PHP:
скопировать код в буфер обмена
  1. $timeold = mysql_query("UPDATE users SET lastdate='$today' WHERE login='".$u_login."'"); $timeout = mysql_query("UPDATE users SET lasttime='$totime' WHERE login='".$u_login."'"); $olddatee = mysql_query("UPDATE users SET olddate='$olddate' WHERE login='".$u_login."'");

мои глаза..я просто ничего больше не увидел.. это ШЕДЕВР,товарисч
(Добавление)
ArtemRazulin пишет:
PHP:
скопировать код в буфер обмена
  1. if($userinfodat['lastdate'] + 100 < $today) { mysql_query("UPDATE `users` SET `online`='offline' WHERE login='".$u_login."'");} else { mysql_query("UPDATE `users` SET `online`='online' WHERE login='".$u_login."'");};

а,еще вкусняшка? ммм

Ну хватит я понял уже что знающие люди засмеют мою писанину я с php только 3 день.
Буду очень благодарен за помощь, хотя критику всегда приветствую только она ставит на верный путь и работу на ошибками.
 
 Top
tato
Отправлено: 14 Августа, 2014 - 10:13:25
Post Id



Посетитель


Покинул форум
Сообщений всего: 468
Дата рег-ции: Сент. 2011  
Откуда: Владивосток


Помог: 8 раз(а)




Для начала mysql плохое хранилище для подобных задач. Посмотрите в сторону memcached или redis.

На примере redis:
Используем LSET для записи в специальный список. Это будут онлайн пользователи.
Логика такая, пришел пользователь - записали его id и выставили expire на минуту например. Если пользователь уже внесен в список мы просто обновим expire, что бы запись не удалилась.

Далее LRANGE выбрать всех пользователей из списка(или часть если надо). Показываем где хотим.

Это будет работать быстро, без напряга для бд, без сложных запросов, тупо по ключам(т.е. id пользователей)

Загнал, так мы весему списку таймаут обновим. Но логика такая.

(Отредактировано автором: 14 Августа, 2014 - 10:25:18)



-----
просто ?: сложно
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB