Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak sprawdzić czy użytkownik się wylogował?
Forum PHP.pl > Forum > PHP
macromatic
Mam problem, ponieważ nie za bardzo wiem jak zapisać informację o dacie i godzinie wylogowania użytkownika.

Problemu nie ma, gdy użytkownik naciśnie przycisk Wyloguj i opuści konto, jednak co zrobić gdy użytkownik tego nie zrobi i zamknie okno lub przeglądarkę?
Fifi209
Ustawić odpowiedni czas życia sesji.
macromatic
wymyśliłem taką funkcję

  1. //funkcja sprawdzająca czy użytkownik jest jeszcze zalogowany czy wylogował się z systemu
  2. function is_user_active($user_id) { // jako argument podaje id uzytkownika ktory odswieza strone
  3.  
  4. //przypisuje aktualny czas serwera za pomocą funkcji time
  5. $now_time = time();
  6.  
  7. //przypisuję czas o 15 minut wcześniejszy od aktualnego czasu
  8. $time_minus_15_minut = time() - 900; // 900 sekund = 15 minut
  9.  
  10. //aktualizuję pole last_active użytkownika, który wywołał skrypt
  11. $sql = "UPDATE `tabela` SET `last_active` = '$now_time', `status_online` = '1' WHERE `id_user` = '$user_id'";
  12. @mysql_query($sql);
  13.  
  14. //sprawdzam którzy użytkownicy są nieaktywni dłużej niż 15 minut i przypisuje im status 0
  15. $sql2 = "SELECT `id_user` FROM `tabela` WHERE `last_active` < '$time_minus_15_minut' AND `status_online` = '1'";
  16. $wynik2 = @mysql_query($sql2);
  17.  
  18. $liczba_do_wylogowania = mysql_num_rows($wynik2); // ile osób trzeba wylogować
  19.  
  20. if ($liczba_do_wylogowania > 0) {
  21.  
  22. while ($rek2 = mysql_fetch_array($wynik2)) {
  23. $id_user2 = $rek2['id_user'];
  24.  
  25. //aktualizuje status i godzine ostatniej wizyty wylogowanych osób
  26. $sql3 = "UPDATE `tabela` SET `last_visit` = '$now_time', `status_online` = '0' WHERE `id_user` = '$id_user2'";
  27. @mysql_query($sql3);
  28. }
  29. }
  30. }


będzie to działać?
Moli
Sprawdź i zobacz ?
kulczycki
  1. //sprawdzam którzy użytkownicy są nieaktywni dłużej niż 15 minut i przypisuje im status 0
  2. $sql2 = "SELECT `id_user` FROM `tabela` WHERE `last_active` < '$time_minus_15_minut' AND `status_online` = '1'";
  3. $wynik2 = @mysql_query($sql2);
  4.  
  5. $liczba_do_wylogowania = mysql_num_rows($wynik2); // ile osób trzeba wylogować
  6.  
  7. if ($liczba_do_wylogowania > 0) {
  8.  
  9. while ($rek2 = mysql_fetch_array($wynik2)) {
  10. $id_user2 = $rek2['id_user'];
  11.  
  12. //aktualizuje status i godzine ostatniej wizyty wylogowanych osób
  13. $sql3 = "UPDATE `tabela` SET `last_visit` = '$now_time', `status_online` = '0' WHERE `id_user` = '$id_user2'";
  14. @mysql_query($sql3);
  15. }
  16. }


To nie jest potrzebne, a raczej zbędne. Robisz 2 razy to samo. Bo Update samo w sobie też ma SELECT podczas WHERE.
Nie rozumiem po co ustawiać aktualny czas dla osób który już są wylogowane.

  1. UPDATE `tabela` SET `status_online` = 0 WHERE `last_active` <= $time_minus_15_minut AND `status_online` = 1;

Jeśli status_online jest int-em to nie używaj cudzysłowa. Nie potrzebnie mysql będzie to konwertował. To samo tyczy się czasu w UNIX
Rid
Zamiast funkcji można użyć COOKIES ustawić czas na 15 min przyrównać do SESSION .Kiedy COOKIES wygaśnie wygaśnie również sesja, co będzie efektem wylogowania.
kulczycki
Cytat
Zamiast funkcji można użyć COOKIES ustawić czas na 15 min przyrównać do SESSION .Kiedy COOKIES wygaśnie wygaśnie również sesja, co będzie efektem wylogowania.


Kwestia sesji to jak dla mnie inna sprawa. Pewnie ma kolumnę session_key w tabeli odpowiedzialnej za konta (tak sądzę).
To wszystko powinno wyglądać tak

$_SESSION['key'] > sprawdzanie w bazie key wraz z ip > sprawdzanie czas ostatniej aktualizacji sesji > jeśli większe od time()-15 minut to sesja dalej aktywna jeśli nie to czyści session_key, status_online zeruje i $_SESSION['key'] = ''; np. Jak tam wole w cookies tego nie pakować jakoś

Reszta (czyszczenie starych sesji to kosmetyka + statystyki np.)
pain3hp
przy okazji chciałem zapytać po co się robi w bazie pole klucz sesji? Uczę się z książek jeszcze się z tym nie spotkałem natomiast na forach często widzę o tym tematy pośrednie. Domyślam się że po to by weryfikować czy użytkownik który się zalogował to właśnie ten użytkownik który wysyła requesty? Coś poza tym?
macromatic
Cytat(kulczycki @ 29.12.2010, 17:26:59 ) *
  1. //sprawdzam którzy użytkownicy są nieaktywni dłużej niż 15 minut i przypisuje im status 0
  2. $sql2 = "SELECT `id_user` FROM `tabela` WHERE `last_active` < '$time_minus_15_minut' AND `status_online` = '1'";
  3. $wynik2 = @mysql_query($sql2);
  4.  
  5. $liczba_do_wylogowania = mysql_num_rows($wynik2); // ile osób trzeba wylogować
  6.  
  7. if ($liczba_do_wylogowania > 0) {
  8.  
  9. while ($rek2 = mysql_fetch_array($wynik2)) {
  10. $id_user2 = $rek2['id_user'];
  11.  
  12. //aktualizuje status i godzine ostatniej wizyty wylogowanych osób
  13. $sql3 = "UPDATE `tabela` SET `last_visit` = '$now_time', `status_online` = '0' WHERE `id_user` = '$id_user2'";
  14. @mysql_query($sql3);
  15. }
  16. }


To nie jest potrzebne, a raczej zbędne. Robisz 2 razy to samo. Bo Update samo w sobie też ma SELECT podczas WHERE.
Nie rozumiem po co ustawiać aktualny czas dla osób który już są wylogowane.

  1. UPDATE `tabela` SET `status_online` = 0 WHERE `last_active` <= $time_minus_15_minut AND `status_online` = 1;

Jeśli status_online jest int-em to nie używaj cudzysłowa. Nie potrzebnie mysql będzie to konwertował. To samo tyczy się czasu w UNIX


godzina wylogowania potrzebna mi jest aby przy następnym zalogowaniu pokazać użytkownikowi co się zmieniło od jego wyjścia...

dzięki za cenne wskazówki
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.