marco1234
Goto Top

PHP Übersicht der angemeldeten User - wie User-Anzeige löschen beim Verlassen der Seite?

echo $freundliche_begruessung;

Ich möchte gerne eine Übersicht der Benutzer, die auf meiner Seite angemeldet sind, erstellen. Das Herausfinden des Users ist ja kein Problem. Jeder User, der sich anmeldet, kann ich ja einfach in eine Datenbank schreiben. Wenn sich der User wieder (korrekt) abmeldet – die Sessions geschlossen wird – könnte ich den User auch wieder löschen. Alles kein Problem!

Nur, was ist, wenn der User das Browser-Fenster einfach schliesst? (Was ja leider oft der Fall ist xD) Dann bleibt mein Eintrag ja in der DB vorhanden. Und mit JavaScript irgendwie abfragen, ob das Fenster geschlossen ist, hilft mir ja auch nicht viel, da ich aus JavaScript keine SQL Abfragen senden kann.
An einen Timer, der den User nach einer gewissen Zeit löscht, habe ich auch schon gedacht. Nur wo soll dieses Script laufen?

Kennt jemand eine Lösung? Wie macht man das sonst so? Es gibt ja viele Seite (hier im Forum ja auch), wo man sieht, wer angemeldet ist.

Danke und Gruss
Marco

Content-ID: 146992

Url: https://administrator.de/contentid/146992

Ausgedruckt am: 19.11.2024 um 20:11 Uhr

godlie
godlie 15.07.2010 um 15:54:57 Uhr
Goto Top
Hallo,

mit AJAX könntest du aus Javascript heraus einen Call auf eine php Datei machen welche dir dann deinen Eintrag aus der DB wieder entfernt.
Aber ich glaube du bist mit dem window_onbeforeunload event eher besser bedient...
marco1234
marco1234 15.07.2010 um 16:58:32 Uhr
Goto Top
Ja aber kann ich mit JavaScript dann noch ein PHP-File aufrufen, das ausgeführt wird? :-S
Coder2007
Coder2007 15.07.2010 um 17:50:49 Uhr
Goto Top
Mach das doch mit Sessions, so lange die Session existiert ist der User online. Wird das Fenster geschlossen wird nach einer gewissen Zeit ja auch die Session beendet. Ich hatte sowas mal irgendwann realisiert, ist aber schon ewig her.

Coder
EvilMoe
EvilMoe 15.07.2010 um 18:14:51 Uhr
Goto Top
Wie du schon sagtest, beim login -> DB schreiben.
Logout -> aus der DB löschen.

Das sollte klar sein. Nun brauchst du eine art "Cronjob". Du musst zusätzlich ein "Timestamp" speichern wann der User die letzte Seite geladen hat. Diese bei jedem Seitenaufruf aktualisieren.
Wenn die Zeit größer ist als z.B. 2min kann man davon ausgehen das er nicht mehr online ist -> aus der DB löschen.

Den Cron dann z.B. jede Minute einmal aufrufen lassen.
Oder einfach bei jedem Seitenaufruf, so intensiv ist das SQL Statement nun auch nicht ;)
dog
dog 15.07.2010 um 19:31:49 Uhr
Goto Top
Wo ist das Problem?
Du fügt in der DB einen Timestamp last_seen hinzu und suchst dann bei den angemeldeten usern nach WHERE last_seen > (NOW() - 5)
Den Timestamp aktualisierst du bei jedem Seitenaufruf.

Viel mehr lässt sich eigentlich darüber streiten ob es Sinn macht hierfür extra einen Haufen aufwändiger DB-Abfragen zu stellen...
marco1234
marco1234 16.07.2010 um 09:03:39 Uhr
Goto Top
Hallo zusammen

Vielen Dank für eure Antworten. Sind alles gute Ideen. Aber das Problem ist somit nicht ganze gelöst. Ich kann schon ein Job laufen lassen, der alle 2min den User löscht. Aber woher weiss ich, dass dieser User jetzt wirklich nicht mehr auf der Seite ist?

Immer die aktuelle Zeit eintragen, wenn der User die Seite wechselt geht nicht gut, da ich genau eine Datei habe und alles weitere hineingeladen wird. Dann müsste ich ja hinter jedem Button und jedem Link eine SQL Abfrage einrichten, welche die Zeit verlängert… sehr umständlich… :-S

Geht’s nicht einfacher?

@dog
Wie würdest du es machen? Mir fällt ausser DB eigentlich nichts sinnvolles ein…

Gruss
Marco
godlie
godlie 16.07.2010 um 13:33:05 Uhr
Goto Top
Hallo ja das kannst du mit AJAX realisieren.
Einfach ein wenig googeln stichwort jquery oder scriptacolous
EvilMoe
EvilMoe 16.07.2010 um 15:57:11 Uhr
Goto Top
Warum für jede Seite ein SQL abfrage? Du sagst doch eben selber das du eine Datei hast und den rest "includest". Dann brauchst du nur in der einen Datei den SQL Befehl eintragen, mehr nicht.
Der SQL Befehl wird nichtmal eine Millisekunde dauern, das sollte nicht das Problem sein.

Umständlich ist das rein garnicht. Kinderkram ist das, du machst es dir nur einfach zu schwierig.
Man könnte es noch mit JavaScript kombinieren, aber nicht jeder hat es aktiviert.
marco1234
marco1234 06.09.2010 um 16:50:35 Uhr
Goto Top
Hab’s jetzt so gelöst:

Wenn ein User sich anmeldet, wird sein Benutzername und die Zeit in die DB eingetragen. Wenn er sich korrekt via Logout abmeldet, wird er aus der DB gelöscht.

Jedes mal, wenn ein User die Seite öffnet, werden alle User aus der DB abgerufen und es wird überprüft, ob die letzte Aktivität älter als 20min ist. Wenn ja, wird dieser User gelöscht bzw. abgemeldet.

Die Zeit des entsprechenden Users wird bei jeder Aktualisierung der Seite (POST etc.) aktualisiert. Somit aktualisiert der User beim Benützen der Seite immer seine Lifetime.

Lg