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