To jest tylko wersja do druku, aby zobaczyć pełną wersję tematu, kliknij TUTAJ
phpBB2 by Przemo
Support forów phpBB2 modified by Przemo

HTML/PHP/AJAX/JS - Logowanie - jak sprawdzić czy jest dostępny?

maniek.a - 14-03-2010, 17:46
Temat postu: Logowanie - jak sprawdzić czy jest dostępny?
Witam! Mam pytanie jak radzicie sprawdzać czy user jest zalogowany (skrypt na sejsach + mysql)?
Czy zrobić tabele
Kod:
timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
i jako aktywnego dawać tego kto ma tą datę mniejszą od aktualnej o np. 5 min? Czy może macie jakiś inny pomysł?

Bo robienie przy logowaniu wpisu do tabelki online jest wg. mnie bez sensu z prostego powodu - nie każdy korzysta z wylogowania, niektórzy po prostu wyłączają przeglądarkę. Chyba że można jakoś do tego zmusić usera?

kevin_ - 14-03-2010, 17:50

maniek.a napisał/a:
Bo robienie przy logowaniu wpisu do tabelki online jest wg. mnie bez sensu z prostego powodu - nie każdy korzysta z wylogowania, niektórzy po prostu wyłączają przeglądarkę. Chyba że można jakoś do tego zmusić usera?


Źle rozumujesz działanie takiego mechanizmu, bądź ja kiedyś źle doczytałem.
Otóż też uważałem jak Ty - co z gościem, który NIE WYLOGUJE SIĘ, przecież będzie on Online 24/h :F - NIE.

Użytkownik się loguje do serwisu, do tabeli "Online" jest dodawany rekord (+data kiedy się zalogowałi) - pamiętaj mamy to w bazie.

Przychodzi drugi użytkownik do serwisu, a ten pierwszy poszedł sobie i nie wylogował się. Cały czas jest wpis w bazie i teraz dopisujesz kolejny warunek coś w stylu:

> loguje się 2 użytkownik i od razu sprawdzasz (drugie zapytanie) wpisy gdzie data ostatniej aktywności przekroczyła X czasu. I wtedy gościa usuwamy z tabeli USERS_ONLINE i mamy tylko jednego online.

Rozumiesz?

UPDATE:

Zjadłem drugą cześć działania mechanizmu. :FFF
Oczywiście jeżeli czas ostatniej wizyty jest OK (czyli jest mniejszy (?) niż te X minut) to wtedy dajemy mu
+5 kolejnych minut i tak w kółko :F

maniek.a - 14-03-2010, 18:03

Czyli tak: Robię tabelkę online z polami: id, data_ostatnie aktywnosci(timestamp) i idusera. Potem przy logowaniu dodaje rekord i za każdym razem gdy coś ważniejszego klika dodaje rekord do tej tabelki. Zaraz po tym jak drugi user zrobi coś to wysyłany jest jego rekord i przy okazji sprawdzane inne rekordy?


Martwi mnie tylko ilość zapytań -Dodanie,-Sprawdzenie,-usunięcie.


Wolałbym zrobić plik php który sam co 5 minut będzie sprawdzał i wywalał starsze niż 5 minut rekordy. Tylko jak?

kevin_ - 14-03-2010, 18:09

maniek.a napisał/a:
Czyli tak: Robię tabelkę online z polami: id, data_ostatnie aktywnosci(timestamp) i idusera.


Tak. Możesz też zrobić coś jak jest w phpBB2, że będziesz mógł stworzyć konto "Gość", ale to już nieobowiązkowy proces.

maniek.a napisał/a:
. Potem przy logowaniu dodaje rekord i za każdym razem gdy coś ważniejszego klika dodaje rekord do tej tabelki.


Nie zrozumiałem tekstu od "i za każdym razem ..."
Co do reszty postu: TAK.

Zresztą podejrzyj sobie np. plik z phpbb ./includes/sessions.php

maniek.a - 14-03-2010, 18:29

Cytat:
i za każdym razem
Chodziło mi o to żę przy każdej aktywności "odświeżam" mu datę.

Co do pliku z phpbb - mało z tego rozumiem :/


Kurde muszę jakoś ten pliczek sobie zrobić mógłby ktoś pomóc (jak zrobić żeby sam się uruchamiał)

kevin_ - 14-03-2010, 19:41

maniek.a napisał/a:
Kurde muszę jakoś ten pliczek sobie zrobić mógłby ktoś pomóc (jak zrobić żeby sam się uruchamiał)


Jeżeli masz strukturę plików podobną do phpBB czyli header.php & footer.php to po prostu w header.php daj to całe sprawdzanie. Jeżeli HEADER.php dołączasz do każdego pliku (strony) to nie widzę problemów.

maniek.a - 14-03-2010, 22:00

I co tam dać sprawdzanie czasu i jak będzie to godzina podzielna przez 5 minut to zapytanie?
Chyba bym nie umiał takiego czegoś zrobić.



Wole chyba zainwestować w hosting z cronem i mieć spokój :)

Krabny - 15-03-2010, 11:40

maniek.a napisał/a:
Bo robienie przy logowaniu wpisu do tabelki online jest wg. mnie bez sensu z prostego powodu - nie każdy korzysta z wylogowania, niektórzy po prostu wyłączają przeglądarkę. Chyba że można jakoś do tego zmusić usera?


To po prostu wysyłaj cookie o określonym czasie trwania sesjii i potem to sprawdzaj . W czym problem ?

maniek.a - 15-03-2010, 17:53

A cookie są na serwerze czy u usera w przeglądarce? ...
No właśnie.



Dzisiaj jadąc sobie tramwajem wpadłem na super pomysł.
W tabeli user - pole o jakim pisałem w 1 poście.

I później przy profilu -
Kod:
$data=date('j.n.y, H:i');
$dataa = $pobranazsql['data'];
if( $data-$dataa > 00.00.00, 00:05)
{
echo'offline';
}else{echo 'online';}


Ograniczona liczba zapytań i w ogóle prostota budowy :) . Teraz tylko jakoś kod napiszę (bo tak pewnie nie będzie działało) i gotowe 8) .


Myślę jeszcze o zrobieniu tabeli aktywnosc - ale to tak tylko jak mi się będzie nudziło :)

maminowiec - 15-03-2010, 18:54

i tak musisz pobrać tą wartość daty. Więc zapytanie i tak będzie
maniek.a - 15-03-2010, 20:03

@maminowiec: Tak ale policz je, - wchodzisz w profil usera - select * from user where id=xxx - mam jedno zapytanie do wszystkiego, w drugiej możliwości 2 - dane + online. Teraz druga opcja - np. oglądanie "rankingu" - mój wybór- 1 jedna zapytanie które ściąga wszystkie dane, drugi wybór - 1 zapytanie które ściąga nicki/id/inne_dyrdymały i pętla do wykonania tylu zapytań ile jest userów w rankingu do ściągnięciu dostępności.(Ewentualnie 2 , ale wtedy pewnie bym się pogubił w kodzie do wyświetlania)

Powiedzmy 100 userów:
1. opcja: 1 zapytaine
2. opcja: 101 zapytań

To jest główny powód mojego wyboru.

Anonymous - 15-03-2010, 22:39

Ja zrobilem to nieco inaczej chociaz sam mechanizm jest bardzo podobny.
Do tabeli zalogowany czy tez szpieg i jak kto woli Masz id, time() zalogowania, oraz
mozesz nawet dodac podstrona pod warunkiem, ze na kazdej podstronie przed
header w ktorym bedzie umieszczony skrypt obslugujacy te tabele umiescisz
w jakiejs stalej zmiennej nazwe podstrony, ktora wywoluje uzytkownik.
Teraz w header, ktore jest ladowane na kazdej podstronie :
1. Sprawdzasz czy jest w tej tabeli wpis tyczacy sie danego usera (id).
Moze to tez byc uzytkownik niezalogowany wiec lepiej jesli rozpoznawanie
zrobisz np na podstawie IP uzytkownika, ale jesli ktos wejdzie z tej samej sieci, ale
na dwoch roznych komputerach to bedzie bida. Wiec najlepiej jesli przy pierwszym
wejsciu na stronie do zmiennej sesji sobie wpiszesz jakies niepowtarzalne ID i na
jego podstawie bedziesz identyfikowac uzytkownika.
Przyjmij sobie, ze dajmy na to miedzy kliknieciami moze uplynac max 3 min czyli 180 sek.
a. Tak wiec jesli jest dany user w tabeli to tylko odswierzasz wpis w tabeli z nowym
czasem i podstrona, ktora aktualnie oglada.
b. Jesli go juz nie ma to dodajesz nowy wpis do bazy.
2. Wszystkie przedawnione wpisy czyli takie od ktorych juz uplynelo 180 sekund
kasujesz jednym wpisem z tabeli. Czyli wszystkie takie ktore sa mniejsze niz time() - 180.

Teraz podstrona z wyswietlaniem juz ludkow jest prosta i moze wygladac np tak :


Wszystko robisz max przy pomocy 2 zapytan. Jedno ewentualnie dla wznowienia wpisu i drugie dla
skasowania przedawnionych wpisow. Zalogowanych i niezalogowanych uzytkownikow mozesz
rozroznic polem w tabeli.

maniek.a - 16-03-2010, 18:16

Trochę to skomplikowane - zrobię tak ale najpierw się zajmę resztą :)
Anonymous - 16-03-2010, 18:42

E tam skomplikowane.
Dokladniej robisz to tak :
1. UPDATE sprawdzenie czy dany wpis z id_sesji jest w bazie, albo mozesz
od razu sprobowac zrobic update bazy. Jesli wpis jeszcze istnial to zostanie zapisany
z nowymi czasami i danymi. Jesli nie to i tak sie nic nie stanie.
Sprawdzeniem operacji na bazie mozesz od razu sprawdzac czy operacja zostala
wykonana poprawnie na bazie. Wynik daje Ci w tym momencie obraz czy
uzytkownik istnieje juz w bazie czy jeszcze nie i dalej w zaleznosci od wyniku
podejmujesz dalej odpowiednie reakcje.
2. INSERT INTO Jesli nie bylo wpisu to robisz nowy wpis.
3. DELETE FROM . WHERE time() - 180 > dana_z_tabeli Kasowanie wszystkich.

maniek.a - 16-03-2010, 20:21

Czyli po mojemu:
Każde logowanie ma swoje id sesji, przy każdym działaniu - update do bazy, przy logowaniu - nowy wpis.
Do np. panelu admina po zalogowaniu się automatycznie usuwam starsze rekordy niż 180s.


Jeśli dobrze zrozumiałem to to nie jest głupie :) .
Tylko czy nie lepiej zamiast id_sesji dać po prostu id_usera?


Tak przy okazji - jak w headerze sprawdzić jaka jest odpalona podstrona?



Powered by phpBB modified by Przemo © 2003 phpBB Group