Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Użytkownicy Online
GoOx
post
Post #1





Grupa: Zarejestrowani
Postów: 329
Pomógł: 6
Dołączył: 23.11.2011
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #2





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




Używaj opcji SZUKAJ. Wczoraj był taki temat.


--------------------
Go to the top of the page
+Quote Post
Sephirus
post
Post #3





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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...


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
GoOx
post
Post #4





Grupa: Zarejestrowani
Postów: 329
Pomógł: 6
Dołączył: 23.11.2011
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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?

Ten post edytował GoOx 1.02.2012, 09:12:41
Go to the top of the page
+Quote Post
Sephirus
post
Post #5





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
GoOx
post
Post #6





Grupa: Zarejestrowani
Postów: 329
Pomógł: 6
Dołączył: 23.11.2011
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #7





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




Zobacz kod z linka, który podałem.


--------------------
Go to the top of the page
+Quote Post
GoOx
post
Post #8





Grupa: Zarejestrowani
Postów: 329
Pomógł: 6
Dołączył: 23.11.2011
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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?

Ten post edytował GoOx 1.02.2012, 09:59:25
Go to the top of the page
+Quote Post
Sephirus
post
Post #9





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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ąć

Ten post edytował Sephirus 1.02.2012, 10:43:13


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Damonsson
post
Post #10





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
GoOx
post
Post #11





Grupa: Zarejestrowani
Postów: 329
Pomógł: 6
Dołączył: 23.11.2011
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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

Ten post edytował GoOx 1.02.2012, 11:36:00
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 04:27