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
Форумы портала PHP.SU :: Версия для печати :: Помогите с модулем online\offline
Форумы портала PHP.SU » PHP » Программирование на PHP » Помогите с модулем online\offline

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

1. OverNik - 21 Января, 2008 - 17:55:53 - перейти к сообщению
Дело вот такое!
Нужен скрипт который показует кто онлайн (пользиватели чата) а кто оффлайн!
Пожалуйста помогите, спец. тему создал! Надеюсь на помощь! Вдруг и я когда нить пригожусь Улыбка
2. EuGen - 21 Января, 2008 - 18:18:38 - перейти к сообщению
Основная проблема, связанная с этим - то, что нет постоянного соединения с сервером у клиентов. Пользователь зашел - сервер отдал ему содержимое страницы - и забыл. И что там дальше пользователь делает, нам неизвестно. Может, он онлайн и спит за монитором .. а может, закрыл себе страницу и все.
Потому классическим решением является высчитывание разницы в секундах/минутах/часах (и т.п.) между текущим временем и действием конкретного пользователя.
Для БД это выглядит примерно так:
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.  

Это простейший вариант.
3. OverNik - 21 Января, 2008 - 20:37:23 - перейти к сообщению
Извените, у меня база на файлах Недовольство, огорчение
4. EuGen - 21 Января, 2008 - 20:45:24 - перейти к сообщению
Тогда опишите ее структуру.
5. OverNik - 21 Января, 2008 - 20:59:03 - перейти к сообщению
Вот:
user.txt

CODE (text):
скопировать код в буфер обмена
  1. Николай|direx
  2. имя user|ник user
6. EuGen - 21 Января, 2008 - 21:08:34 - перейти к сообщению
Ну тогда очевидно, что у Вас хранится недостаточное число информации. Нужно как минимум добавить еще 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.  

Но это, как мне кажется, не оптимальное решение.
7. OverNik - 21 Января, 2008 - 21:18:06 - перейти к сообщению
Parse error: syntax error, unexpected T_FOREACH in H:\www\userlist.php on line 10

Это ошибка Недовольство, огорчение
8. Dastar - 21 Января, 2008 - 21:44:23 - перейти к сообщению
Напиши именно строки о которых говорит ошибка
9. SION-ZENIT - 21 Января, 2008 - 22:23:27 - перейти к сообщению
Может дело в ";" после
CODE (text):
скопировать код в буфер обмена
  1. $result[]=explode("|", $file_result[$key])
10. OverNik - 21 Января, 2008 - 23:08:42 - перейти к сообщению
делао имено в том!
Спасибо !
только не в этом основа проблемы!
Вот алгоритм входа пользивателей в чат:
Пользиватель при вводе логина и пароля должен быть зарегестрирован с мини анкетой, и при в ходе в чат его логин засыпаетса в куки. После забивания куков автоматически обробатываетса скрипт который заносит в userlist.txt логин пользивателя, (userlist.txt это база кто онлайн)! А вот как зделать что бы удалялась строка с этой бази когда он не отвичает $OFFLINE=60; я непойму, или могзгов нехватает или просто опыта!
11. EuGen - 22 Января, 2008 - 09:50:54 - перейти к сообщению
Да, я что-то не поставил ';', бывает.
Ну, если предполагать, что у Вас те, кто онлайн, в другом файле, и этот файл не большой, то можно и так:
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.  

То есть мы, фактически, перебираем все строки файла и по новой их переписываем, но уже без той, которую нужно удалить.
12. OverNik - 22 Января, 2008 - 12:58:57 - перейти к сообщению
Клссно! Всё роботает спасибо!!! Подросту в постах с меня + Улыбка

 

Powered by ExBB FM 1.0 RC1