Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Użytkownicy Online
Forum PHP.pl > Forum > Przedszkole
GoOx
Witam,


Ostatnio zastanawiałem się jak zrobić pokazywanie użytkowników online. Myślałem nad sposobem zapisywania do bazy nazw użytkownika a przy wylogowywaniu się usuwaniu lecz nigdy nie jest tak łatwo wink.gif A co będzie gdy ktoś zamknie przeglądarkę? Moim zdaniem tego nie da się wykryć nie przynajmniej przy mojej wiedzy.
Patrzyłem już po rożnych tematach na tym forum ale nic nie naprowadziło mnie jak to zrobić.


A więc proszę o pomoc. Nazwę użytkownika przechowuję pod $_SESSION['login'] - to jest proste a jak przechować wszystkich zalogowanych?
Kshyhoo
Używaj opcji SZUKAJ. Wczoraj był taki temat.
Sephirus
Witaj.

Jest prosty i edukacyjny sposób (nie super wydajny):

Możesz utworzyć dodatkową tabele, w której będziesz przechowywał info o użytkownikach online na stronie.

Tabela taka powinna mieć strukturę (przykładowo):

id_user ip last_activity

Z unikalnych kluczem (jednym) na polach id_user+ip

id_user - przechowywało by wartość 0 (dla niezalogowanych) oraz id uzytkownika jeśli jest zalogowany
last_activity - timestamp po którym okreslalibyśmy czy danego użytkownika uznać za obecnego czy nie
ip - tylko po to by rozróżniać po sobie użytkowników niezalogowanych

i tak:
Po wejściu na kazdą stronę powinien być do tej tabelki insert na zasadzie:
  1. INSERT INTO users_online (id_user,ip,last_activity) VALUES ([id_usera_lub_0_jesli_niezalogowoany],[adres_ip_klienta],NOW()) ON DUPLICATE KEY UPDATE last_activity = NOW()


To zapytanie doda wiersz dla danego usera jak go nie ma albo zaktualizuje czas ostatniej aktywności.

Jak teraz odczytać dane:

  1. SELECT * FROM users_online WHERE UNIX_TIMESTAMP(last_activity) + 2*60 > UNIX_TIMESTAMP(NOW())


Masz już listę użytkowników, którzy coś zrobili w przęciągu ostatnich 2 minut (wartość tą można zmienić)

usuwanie niepotrzebnych rekordów można zrobić raz na jakiś czas poprzez usunięcie rekodrów gdzie czas jest starszy od 2 minut

Pamietać trzeba że w tym sposobie przy zalogowaniu uzytkownika należy zaktualizować rekord z jego IP jak był niezalogowany - inaczej będzie 2 userów a nie jeden.

W bardziej zaawansowanych skryptach/szkieletach w bazie zapisywane są często różne dane bieżące o sesji użytkownika - w takich przypadkach nie ma problemu z określeniem liczby userów online itd...
GoOx
Ok, prawie wszystko rozumiem ale...

last_activity - tego nie rozumiem można bardziej po polsku? - timestamp nie znam tej funkcji

id - po co? nie rozumiem

  1. INSERT INTO users_online (id_user,ip,last_activity) VALUES ([id_usera_lub_0_jesli_niezalogowoany],[adres_ip_klienta],NOW()) ON DUPLICATE KEY UPDATE last_activity = NOW()


ok czyli to przychwyca czy user wykonał czynność czy też nie tak? Czyli np jak dam do to pliku z logo. (On jest wszędzie odczytane poprzez include() to będzie dobrze?
Sephirus
Może być.

last_activity - pole, które będzie przechowywać dokładny czas ostatniej aktywności użytkownika..

Jesli ten czas będzie o 2 minuty (lub tyle ile ustawisz) starszy od obecnego to traktuje się uzytkownika za nieobecnego (bo przez 2 minuty nic nie robił)

id_user - masz użytkowników zalogowanych i niezalogowanych

zalogowani mają jakieś swoje ID, a niezalogowani nie

Zatem tym niezalogowanym dajesz 0 a tym zalogowanych ich ID - w ten sposób wiesz że na stronie jest na przykład:

25 gości
3 użytkowników:
- stefan
- mariolka
- kazik

Bo możesz rozpoznać kto jest kim smile.gif
GoOx
Ok,
a więc zrobiłem tak:

  1. $userfun = $_SESSION['login'];
  2. $user_ip = $_SERVER['REMOTE_ADDR'];
  3. $update_users = "INSERT INTO users_online (id_user,ip,last_activity) VALUES ('$userfun','$user_ip',NOW()) ON DUPLICATE KEY UPDATE last_activity = NOW()";
  4. $update_users_dod = mysql_query($update_users, $db_lnk)or die(mysql_error());


i odczyt:

  1. $kto_online_user = mysql_query("SELECT * FROM users_online WHERE UNIX_TIMESTAMP(last_activity) + 2*60 > UNIX_TIMESTAMP(NOW())");
  2. $wynik_online_user = mysql_fetch_row($kto_online_user);


potem daję echo i nie pokazuje mi userów online.

Proszę o pomoc.
Kshyhoo
Zobacz kod z linka, który podałem.
GoOx
a nie przepraszam działa. Myślałem że użytkownik online od razu sie pokaże a on rónież po 2 min.

A nie da się tak zrobić by użytkownik przy zalogowaniu od razu się pokazywał a przy czynnościach czekał 2 min?

a i jeszcze jedno. Nie pokazuje listy online tylko 1 usera online czy tam nie trzeba zrobić pętli?
Sephirus
Trzeba bo tam jest wielu userów więc do WHILE'a i tyle

EDIT: Jeśli zapoznałbyś się z event schedulerem, tworzeniem eventów i procedurami w MySQL to można by to było fajnie rozwinąć
Damonsson
Ja bym jeszcze dodał tam kolumnę `online`, wtedy będziesz mógł sobie określać, że przy zalogowaniu masz od razu '1', a przy wylogowaniu '0'. No i w bazie danych to przejrzyście wygląda.
GoOx
Damonsson dobry pomysł.

zrobiłem tak że w tabeli użytkownicy user ma w kolumnie online 1 i czas jest 2 minuty w 2 strony to powinno pokazywać użytkownika w liście. a zamiast tworzyć bardzo dużo rekordów to zrobiłem update

  1.  
  2. if($_SESSION['logged']=='true') {
  3. $userfun = "1";
  4. $user_ip = $_SERVER['REMOTE_ADDR'];
  5. $user_logged_online = $_SESSION['login'];
  6. $update_users = "UPDATE uzytkownicy SET `ip` = '$user_ip', `online` = '$userfun', `time` = NOW() WHERE `nick` = '$user_logged_online' ";
  7. $update_users_dod = mysql_query($update_users, $db_lnk)or die(mysql_error());
  8. }
  9.  




to działa.

  1.  
  2. $kto_online_user = mysql_query("SELECT nick FROM users_online WHERE UNIX_TIMESTAMP(time) + 1*60 > UNIX_TIMESTAMP(NOW())");
  3. echo "Użytkownicy online: ";
  4. while($users_online_lista = mysql_fetch_assoc($kto_online_user)) {
  5. $users_online_lista_prop = $users_online_lista['nick'];
  6. echo "$users_online_lista_prop ";
  7. echo ", ";
  8. }
  9.  



ale to już nie ;/

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/recenzeo/public_html/footer.php on line 27

mam taki błąd.
Pomoże ktoś?

Ehh ja chyba ślepy jestem biggrin.gif zamiast users_online nie dałem uzytkownicy poza tym nie wiem jak to zrobiłem ale jak ktoś się zaloguje to od razu pokazuje że jest online
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.