kostenloser Webspace werbefrei: lima-city


Online / Offline Anzeige

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    g***b

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Jeder Datensatz eines Bentzers wird auf die aktuelle Zeit gelegt, sofern der Benutzer eine Seite aufruft / aktiv ist.
    Sobald ein Benutzer für x Minuten inaktiv ist, wird er aus der Tabelle gelöscht.
    Plan verstanden? - Dann los ;)
    Gruß,
    dex (qap2-Team)
  4. 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
  5. Autor dieses Themas

    g***b

    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?
  6. 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)
  7. Autor dieses Themas

    g***b

    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
  8. 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
  9. 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
  10. Autor dieses Themas

    g***b

    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
  11. 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.
  12. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!