Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Sprawdzanie czy sesja jest aktywna.
Forum PHP.pl > Forum > Przedszkole
maxil
Witam wszystkich.

Chciałbym się dowiedzieć czy istnieje możliwość sprawdzania czy sesja jest aktywna.
Mam logowanie oparte na sesjach i w bazie danych komórke `active` w której jest zapisywane czy użytkownik jest zalogowany.
Podczas logowania wpisuje tam 1 a podczas wylogowania wpisywane jest 0.
Ale gdy użytkownik zamknie strone to nadal tam jest wpisane 1 i to mi psuje wygląd statystyk, ponieważ nikt nie jest zalogowany a ciągle pokazuje że ktoś jest zalogowany.

Można to w jakiś sposób sprawdzać czy użytkownik aktualnie jest zalogowany czy nie?
webspy
Nie wiem czy jest taka mozliwość,
Ja bym dał na początku strony zapytanie czy activ byl aktywny przez ostatnie np 3 min jesli tak to zostawia 1 a jesli nie to zapisuje 0,

A jesli sesja istenieje to aktualizuje activ i zapisuje czas w ktorym ostatnio uzytkownik "odswiezyl" strone,

Wiadomo o co mi chodziło??

Ja zaczynam się uczyć php ale ja tak widzę to rozwiązanie.
Pilsener
Poczytaj pod hasłem "własny mechanizm sesji", "własna obsługa sesji" - jest parę artykułów i nawet gotowe klasy, niestety nie ma takiej możliwości, by skrypt rozpoznał czy user zamknął stronę a się nie wylogował - dobrze jest mu o tym przypominać specjalnym komunikatem (gdy kliknie "wyloguj" odnotowujemy ten fakt). Najczęściej ustawia się po prostu czas ważności ciacha sesyjnego - jeśli user nie wykona żadnej akcji w ciągu powiedzmy 15 minut jest wylogowywany, bo ciacho sesyjne ginie ze starości. Oczywiście własny mechanizm sesji zawiera też licznik osób zalogowanych i sprawdza co jakiś czas, który user ma ważną sesję.
maxil
nad własnym mechanizmem sesji jest troche roboty i nie wszędzie zda to rozwiązanie egzamin.
poszukuję trochę prostszego rozwiązania, ma ktoś jakiś pomysł lub propozycje jak to zrobićquestionmark.gif
griwes
Wrzucaj do sesji czas aktywowania (time()). I sprawdzaj, czy time() - tamto > 3 * 60 (3min, dla przykładu); jeśli nie, ustawiasz 0 w active.
maxil
Cytat(griwes @ 16.02.2010, 18:13:30 ) *
Wrzucaj do sesji czas aktywowania (time()). I sprawdzaj, czy time() - tamto > 3 * 60 (3min, dla przykładu); jeśli nie, ustawiasz 0 w active.


w tym wypadku bym musiał ręcznie wywoływać skrypt co jakiś czas a mi chodzi o automat.
crontab nie wchodzi w grę chyba że da się zrobić jakiś żeby sie co jakiś czas na widzie odpalał skrypt.
griwes
Ależ automat. Robisz tak:

1. Sesja się odpala; ustawiasz active = 1 i time = time().
2. Odpalasz UPDATE ... SET active = 0 WHERE time() - time > zadany czas.

Sam tak robię i działa doskonale tongue.gif

edit: trochę pokrętnie napisałem wczesniej tongue.gif
maxil
kożystając z okacji chciałbym sie dowiedziec dlaczego zapytanie sql nie pobiera mi wszystkich danych.
zapytanie wygląda tak:

  1. public static function getById($uid)
  2. {
  3. $u = new User();
  4. $query = sprintf('SELECT * FROM %susers WHERE USER_ID = %d', DB_TBL_PREFIX, $uid);
  5. $result = mysql_query($query, $GLOBALS['DB']);
  6.  
  7. if (mysql_num_rows($result))
  8. {
  9. $row = mysql_fetch_assoc($result);
  10. $u->exists = TRUE;
  11. $u->username = $row['username'];
  12. $u->password = $row['password'];
  13. $u->position = $row['position'];
  14. $u->email = $row['email'];
  15. $u->banned = $row['banned'];
  16. $u->gg = $row['gadugadu'];
  17. $u->pseudo = $row['pseudo'];
  18. $u->uid = $uid;
  19. }
  20.  
  21. return $u;
  22. }


tabela w mysql

  1. CREATE TABLE `panel_users` (
  2. `user_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `username` varchar(20) collate latin1_general_cs NOT NULL,
  4. `password` char(40) collate latin1_general_cs NOT NULL,
  5. `position` varchar(5) collate latin1_general_cs NOT NULL,
  6. `gadugadu` varchar(30) collate latin1_general_cs NOT NULL,
  7. `email` varchar(100) collate latin1_general_cs NOT NULL,
  8. `sadmin` tinyint(1) NOT NULL DEFAULT '0',
  9. `pseudo` varchar(255) collate latin1_general_cs NOT NULL,
  10. `banned` tinyint(1) NOT NULL DEFAULT '0',
  11. PRIMARY KEY (`user_id`)
  12. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs AUTO_INCREMENT=3 ;


bez problemu pobiera mi: user_id, username, password, position, email, banned
nie chce tylko pobrać: gadugadu, pseudo, sadmin

i nie mam zielonego pojęcia dlaczego, męcze się z tym od wczoraj może wy znajdziecie jakiś mały błąd.

!~odświerzam~!
Pilsener
Co to znaczy, "nie chce pobrać"? Może po prostu nie ma tam danych?
iVorIus
Cytat(maxil @ 16.02.2010, 19:14:03 ) *
w tym wypadku bym musiał ręcznie wywoływać skrypt co jakiś czas a mi chodzi o automat.
crontab nie wchodzi w grę chyba że da się zrobić jakiś żeby sie co jakiś czas na widzie odpalał skrypt.


Nie. Przed wyświetleniem strony zostaje wykonany zawarty wyżej przykładowy kod, więc wyświetlone zostaną zaktualizowane dane.
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.