Online / Offline Anzeige
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
aktuellen zeitpunkt
anzeigen
benutzer
code
date
datensatz
eintragen
interessante entdeckung
letzte aktion
minute
problem
profil
sekunde
set
status
tabelle
team
update
wissen
zeit
-
Guten Abend,
mein Problem ist, dass ich nicht wirklich weiß, wie ich folgendes umsetzte:
Wenn sich ein User einloggt, wird in die Mysql Tabelle "online" geschrieben. Loggt der User sich aus (über die Logout Link), wird in die Mysql Tabelle "offline" geschrieben.
Da aber leider nicht jeder User über den Logout rausgeht, sondern entweder den Browser schließt etc. wird nicht "offline" in der Mysql Tabelle gespeichert und der User als "online" angezeigt.
Wie könnte ich das problem lösen?
Viele Grüße
Beitrag zuletzt geändert: 7.1.2010 19:15:50 von gpweb -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Entweder die unschöne Lösung über Cronjobs, oder die etwas elegantere:
Bei jeder Useraktion wird der aktuelle Timestamp in die DB geschrieben. Wenn du jetzt wissen willst, welche User online sind, fragst du einfach ab bei welchem User die letzte aktion nicht mehr als (z.B. 10min) vor dem aktuellen Zeitpunkt ist.
Grüße,
Prog
Beitrag zuletzt geändert: 7.1.2010 19:20:04 von prog -
prog schrieb:
Entweder die unschöne Lösung über Cronjobs, oder die etwas elegantere:
Bei jeder Useraktion wird der aktuelle Timestamp in die DB geschrieben. Wenn du jetzt wissen willst, welche User online sind, fragst du einfach ab bei welchem User die letzte aktion nicht mehr als (z.B. 10min) vor dem aktuellen Zeitpunkt ist.
Grüße,
Prog
Das wäre dann beim aufruf von z.b. Home dieser Code:
UPDATE users SET time = aktuelle Zeit
Das müsste ich jetzt auf jeder Seite einfügen oder ginge das auch etwas simpler? -
Ja, du müsstest den Teil überall bei jeder Seite einfügen.
Es gibt genug Systeme, wo du es nur einmal Eintragen musst, aber in deinem Fall wäre dann wohl eine include-Datei wo der Code drin steht das Beste.
Vergiss nicht die Benutzer die inaktiv waren zu löschen / ihren Status zu verändern!
Gruß,
dex (qap2-Team) -
Guten Abend,
ich habe es erfolgreich gelöst.
$now = date("d.m.Y H:i:s"); $löschen = "UPDATE user SET status = 'offline' WHERE letzteaktion < '$now'"; mysql_query ($löschen) or die (mysql_error());
Danke für eure Hilfe. Klappt wunderbar per Cronjob. Ihr zwei steht auf der Liste die Karma bekommen, falls ich man welches vergeben kann.
Viele Grüße
Beitrag zuletzt geändert: 7.1.2010 19:54:03 von gpweb -
Für andere, die das ganze mittels eines Attributes "lastaction" (oder ähnlich) in der User-Relation lösen wollen. lastaction ist ein TIMESTAMP.
UPDATE user SET lastaction = CURRENT_TIMESTAMP WHERE name = :name
Das sollte klar sein ... Bei jedem Seitenaufruf den Timestamp updaten...
Wenn man nun alle User anzeigen will, die online sind, wird's etwas knifflig, wenn man das auf reinem SQL basieren lassen will (deswegen schreib ich's ja auch hier :D):
SELECT name FROM user WHERE lastaction > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 5 MINUTE)
Das MySQL-INTERVAL Feature ist übrigens eine interessante Entdeckung, falls man mit Zeiten rechnet ;)
Beitrag zuletzt geändert: 7.1.2010 20:00:13 von nikic -
nikic schrieb:
Das MySQL-INTERVAL Feature ist übrigens eine interessante Entdeckung, falls man mit Zeiten rechnet ;)
Genauso mache ich es auch. Die Datumsfunktionen von Mysql sind wirklich genial.
Ich würde an deiner Stelle nicht die umständliche Lösung per Cron machen und auch nicht diese:
$now = date("d.m.Y H:i:s"); $löschen = "UPDATE user SET status = 'offline' WHERE letzteaktion < '$now'"; mysql_query ($löschen) or die (mysql_error());
Das brauchst du nämlich garnicht, wenn du die Lösung von nikic nimmst. Bei deiner muss MySql nämlich evtl. sehr viele db-Einträge updaten, bei nikics reicht ein Update und ein SELECT -
Hallo prog,
da mögst du vielleicht recht haben, aber ich möchte nicht alle online User anzeigen sondern im Profil ganz einfach online stehen haben. Aber ich werde mir mal das MySQL-INTERVAL Feature genauer anschauen.
Viele Grüße -
Dann machst du es einfach so: Bei jeder Aktion das Timestamp updaten, d.h. bei jedem Seitenaufruf, und wenn man auf ein Profil eines Users klickt, gibt es einen Select-Befehl, mit einer Where-Bedingung, die dafür sorgt, dass nur der Datensatz des ausgewählten Users geholt wird, dann bekommst du die Werte in PHP, und prüfst, ob $row['letzte_aktion'] > time() - 600 ist, und wenn ja, dann war er in den letzten 10 Minuten (=600 Sekunden) aktiv, und ist somit online. Beim Logout trägst du anstelle des Timestamps einfach 0 ein.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage