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]   

> Описание: немогу придумать как правельно сложить задачу
OverNik
Отправлено: 21 Января, 2008 - 17:55:53
Post Id



Частый гость


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


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




Дело вот такое!
Нужен скрипт который показует кто онлайн (пользиватели чата) а кто оффлайн!
Пожалуйста помогите, спец. тему создал! Надеюсь на помощь! Вдруг и я когда нить пригожусь Улыбка
 
 Top
EuGen Администратор
Отправлено: 21 Января, 2008 - 18:18:38
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Основная проблема, связанная с этим - то, что нет постоянного соединения с сервером у клиентов. Пользователь зашел - сервер отдал ему содержимое страницы - и забыл. И что там дальше пользователь делает, нам неизвестно. Может, он онлайн и спит за монитором .. а может, закрыл себе страницу и все.
Потому классическим решением является высчитывание разницы в секундах/минутах/часах (и т.п.) между текущим временем и действием конкретного пользователя.
Для БД это выглядит примерно так:
PHP:
скопировать код в буфер обмена
  1.  
  2. //выводим только тех пользователей, у которых время отсутствия меньше $OFFLINE - их мы считаем онлайн
  3. //$user_id - id пользователя, работающего в настоящий момент (может храниться, например, в сессии)
  4. $OFFLINE=60;
  5. $user_id=$_SESSION['user_id'];
  6. $result=mysql_query("UPDATE users SET last_online=NOW() WHERE user_id=".$user_id);
  7. $result=mysql_query("SELECT * FROM users WHERE last_online+INTERVAL $OFFLINE SECOND>NOW()");
  8. while($row=mysql_fetch_array($result))
  9. {
  10.    echo($row['name']."\n");
  11. }
  12.  

Это простейший вариант.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
OverNik
Отправлено: 21 Января, 2008 - 20:37:23
Post Id



Частый гость


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


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




Извените, у меня база на файлах Недовольство, огорчение
 
 Top
EuGen Администратор
Отправлено: 21 Января, 2008 - 20:45:24
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Тогда опишите ее структуру.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
OverNik
Отправлено: 21 Января, 2008 - 20:59:03
Post Id



Частый гость


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


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




Вот:
user.txt

CODE (text):
скопировать код в буфер обмена
  1. Николай|direx
  2. имя user|ник user
 
 Top
EuGen Администратор
Отправлено: 21 Января, 2008 - 21:08:34
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Ну тогда очевидно, что у Вас хранится недостаточное число информации. Нужно как минимум добавить еще last_online - дата или таймштамп, когда пользователь был в последний раз. Вам, я думаю, удобнее использовать таймштамп в третьей колонке. Тогда это будет:
PHP:
скопировать код в буфер обмена
  1.  
  2. //выводим только тех пользователей, у которых время отсутствия меньше $OFFLINE - их мы считаем онлайн
  3. //$user_id - id пользователя, работающего в настоящий момент (может храниться, например, в сессии)
  4. $OFFLINE=60;
  5. $user_id=$_SESSION['user_id'];
  6. $file_result=file("user.txt");
  7. $result=array();
  8. foreach($file_result as $key=>$value)
  9.    $result[]=explode("|", $file_result[$key])
  10. foreach($result as $key=>$value)
  11. {
  12.    if(mktime()-$value[2]<$OFFLINE)//$value - это массив, его 3-я колонка - таймштамп - имеет индекс 2
  13.       echo($value[0]."\n");
  14. }
  15.  

Но это, как мне кажется, не оптимальное решение.

(Отредактировано автором: 21 Января, 2008 - 21:09:17)



-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
OverNik
Отправлено: 21 Января, 2008 - 21:18:06
Post Id



Частый гость


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


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




Parse error: syntax error, unexpected T_FOREACH in H:\www\userlist.php on line 10

Это ошибка Недовольство, огорчение
 
 Top
Dastar
Отправлено: 21 Января, 2008 - 21:44:23
Post Id



Частый гость


Покинул форум
Сообщений всего: 199
Дата рег-ции: Янв. 2008  
Откуда: Израиль


Помог: -6 раз(а)




Напиши именно строки о которых говорит ошибка


-----
Не знаешь - молчи.
 
 Top
SION-ZENIT
Отправлено: 21 Января, 2008 - 22:23:27
Post Id


Частый гость


Покинул форум
Сообщений всего: 148
Дата рег-ции: Июль 2007  
Откуда: SPb


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




Может дело в ";" после
CODE (text):
скопировать код в буфер обмена
  1. $result[]=explode("|", $file_result[$key])
 
 Top
OverNik
Отправлено: 21 Января, 2008 - 23:08:42
Post Id



Частый гость


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


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




делао имено в том!
Спасибо !
только не в этом основа проблемы!
Вот алгоритм входа пользивателей в чат:
Пользиватель при вводе логина и пароля должен быть зарегестрирован с мини анкетой, и при в ходе в чат его логин засыпаетса в куки. После забивания куков автоматически обробатываетса скрипт который заносит в userlist.txt логин пользивателя, (userlist.txt это база кто онлайн)! А вот как зделать что бы удалялась строка с этой бази когда он не отвичает $OFFLINE=60; я непойму, или могзгов нехватает или просто опыта!
 
 Top
EuGen Администратор
Отправлено: 22 Января, 2008 - 09:50:54
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Да, я что-то не поставил ';', бывает.
Ну, если предполагать, что у Вас те, кто онлайн, в другом файле, и этот файл не большой, то можно и так:
PHP:
скопировать код в буфер обмена
  1.  
  2. //$login - логин пользователя, которого нужно удалить из userlist.txt
  3. $result=file("userlist.txt");//помещаем все данные из файла в массив
  4. $f=fopen("userlist.txt","w+");//это открывает файл для записи, стирая в нем все данные
  5. if($f)
  6. {
  7.    foreach($result as $key=>$value)
  8.    {
  9.       if($value!=$login)//если текущая строка не совпадает с удаляемым логином - записываем ее снова
  10.          fwrite($f, $value."\n");
  11.    };
  12.    fclose($f);
  13. }
  14.  

То есть мы, фактически, перебираем все строки файла и по новой их переписываем, но уже без той, которую нужно удалить.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
OverNik
Отправлено: 22 Января, 2008 - 12:58:57
Post Id



Частый гость


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


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




Клссно! Всё роботает спасибо!!! Подросту в постах с меня + Улыбка
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB