[php] Loginstatus

quicksilver

Lt. Junior Grade
Registriert
Jan. 2004
Beiträge
363
Hallo ich habe ein kleines problem.. und zwar hab ich so ein kleines Adminsystem (mini cms) gecoded.. und dort kann man sich per sessions einloggen und dort "arbeiten" Ich möchte aber nun so ein Kleinen Statusbereich erstellen in dem man sehen kann er eingeloggt ist. Mein Problem ist dabei das ich z.b. nicht in Flag in der Datenbank setzen möchte weil wenn derjenige einfach den Browser schliesst das flag dann nicht zurückgesetzt wird. Wie könnte ich das sonst Realisieren?

Danke für eure Hilfe.
 
Meines Wissens kannst du das NUR über Flags in der DB machen!

Ich habe dazu auf meinen HPs in der DB einen Wert wo gespeichert wird, wann der letzte Klick von dem jeweiligen User gemacht wurde (wird bei der Setzung der Rechte und der Kontrolle der Login-Daten bei jeder PHP-Skript-Generation ausgeführt) und nach (bei mir 30 min) gewisser Inaktivität werden die Leute gekickt.
-> Ein bissel lascher wäre es natürlich, wenn du für eingeloggte leute halt nur die Leute zählst, die dann z.b. in den letzten 3 oder 5 min geklickt haben :)
 
du kannst einfach die Sessions auswerten. Wenn eine gesetzt ist --> eingeloggt, wenn nicht ...

/edit

hab das bei mir so gemacht:
PHP:
if (isset ($_SESSION["user_id"])) {
   echo ("Eingeloggt als: <a href=\"index.php?section=user\">".$_SESSION['user_nick']."</a>");
} else {
   echo ("Nicht eingeloggt");
}
und das wird oben rechts angezeigt.
 
Zuletzt bearbeitet:
Ok meolus .. dann muss ichs wohl auch so machen..

Fingol.. wie kann ich denn von allen usern gleichzeitig die sessions auswerten? Weil ich dachte ihc kann immer nur von dem Aktuellen user die Daten auslesen.
 
ah von allen... scheisse hab ich verlesen :D

ne weiss ich auch nicht. Probier mal Meolus's Lösung ;)
 
Ich habs bei mir ähnlich gemacht. User mit der aktuellen sessioníd in der Datenbank
gespeichert. Wenn er online ist wird auf jeder aufgerufenen Seite sein status aktualisiert,
sobald er eine bestimmte Zeit nichts macht wird er durch das updatescript automatisch
nicht mehr als online angezeigt...

Ist ja auch eine Frage der Sicherheit: Jemand loggt sich in die Admin ein, macht 5 Minuten
nichts mehr. Jemand anderes geht an den Rechner und bastelt lustig in der Admin rum.
Solche Benutzer werden bei meinem script automatisch ausgeloggt da die letzte Aktion
zu weit zurückliegt. Explizites Ausloggen geht natürlich auch...
 
Naja Syntec das ist ja sone sache.. Also ich denke mal der Programmierer der Homepage ist nicht dafür verantwortlich wer an den Rechner geht :) da muss schon der User selber aufpassen. Aber dann werde ich das wohl so realisieren.. Aber wie vergleiche ich denn die zeit?
 
Du speicherst einfach die Zeit zusammen mit der aktuellen sessionid und dem Status des Users in der Datenbank. Dann machst Du eine Vergleichsabfrage der aktuellen Zeit mit
der zuletzt gespeicherten Zeit. Wenn diese dann größer ist als die erlaubte Zeitspanne
fliegt er halt raus weil der Status auf offline gesetzt wird.

Ungefähr so:

$aktuell_unix = mktime();
$auszeit = $aktuell_unix + 600; // 10 Minuten Auszeit

$remove_timeout = "UPDATE userdata SET onlinestatus = 0 WHERE '$aktuell_unix' > timeout";

Somit sorgt jeder User auf der Seite dafür dass jeder andere rausfliegt dessen "Zeit
abgelaufen ist" :D (super Formulierung).
 
Achja, was nicht aufgeführt war. Du musst natürlich auch ein kleines updatescript
basteln welches die timeout immer wieder aktualisiert wenn der User sich auf
der Seite bewegt. Sonst fliegt er ja trotzdem immer raus.

Beim einloggen zeit setzten, beim erneuten aufruf der Seite erst kontrollieren ob die
letzte Bewegung zu lange her ist, ansonstn timeout aktualisieren. So wäre es
wohl richtig..
 
Kann es sein das mktime(); nicht auf windows rechnern funktioniert? Weil teste das gerade auf meinem Pc.

*edit*
In welchem format muss ich das in der Sql Datenbank speichern? Weil bei mir speichert er immer 00000000 aber bei einer ausgabe kommt immer 123121241 usw :)
 
Zuletzt bearbeitet:
Mktime sollte auch unter Windows funktionieren, die scripte laufen bei mir tadellos
unter WinXP und Fedora. Beim speichern darauf achten das Hochkommata bei der
Speicherung von Datumswerten benutzt werden.

Als Feld kannst Du einfach ein INT Feld machen mit max 14 Zeichen INT(14).
 
Ja geht unter windows. Lag am Falschen feld. Aber irgendwie bin ich glaub ich zu doof. Ich habe das nun mal so probiert aber irgendwie setzt er immer alle auf 0.

login.php:
PHP:
  $aktuell_unix = mktime();
  $onlinestatus = "INSERT INTO $online_table (user, timestamp, online) VALUES ('".$_SESSION["user_id"]."', '".$aktuell_unix."', '1')";
  mysql_query($onlinestatus);

check.php ( wird bei jeder seitenbewegung ausgeführt)
PHP:
$aktuell_unix = mktime();
$update_timeout = "UPDATE $online_table SET timestamp = '".$aktuell_unix."' WHERE user='".$_SESSION["user_id"]."'";
mysql_query($update_timeout);

$auszeit = $aktuell_unix + 60; // 1 Minuten Auszeit

$remove_timeout = "UPDATE $online_table SET online = 0 WHERE '$aktuell_unix' > timestamp";
mysql_query($remove_timeout);

Weil irgendwie weiss ich nicht wo ich da die auszeit einbauen soll. Muss ich vorher nochmal den timestamp abfragen? und den dann mit der Auszeit vergleichen? und wenn das so ist online auf 0 setzen? Wenn muss ich das aber user spezifisch machen oder? also immer where user_id= user?

Mein Table sieht so aus:

Code:
id
user
timestamp
online
 
1. Alles rausschmeissen was abgelaufen ist
2. Vergleichen ob der aktuelle User noch berechtigt ist die Zeit upzudaten
3. Wenn ja, dann Zeit updaten
 
Hm also erst 0 setzen und dann wieder 1 oder wie ?

Weil ich weiss nicht wie und wo ich die $auszeit abfragen soll.
 
Auf 0 werden nur alle die gesetzt, die abgelaufen sind weil sie länger als 60 Sek nix gemacht haben.

Dann schauen mit "Select blah from users WHERE onlinestatus = 1 AND userid = $userid"

Wenn Du dann mysql_num_rows($result) == 1 hast, dann ist der User berechtigt
die Zeit erneut hochzusetzen was Du dann anschließend machst.

Dann fällt er beim nächsten Mal oben wieder nicht in das raster und wird nicht ausgeloggt
weil er immer schön seine Zeit updatet.

Ich arbeite immer mit der aktuellen Sessionvariable die speichere, Du machst das über die
UserID.

EDIT:
Ich muss jetzt auch leider los, die Vespa von meiner Freundin fit machen (Wetter
ausnutzen!). Ansonsten schaue ich später nochmal rein. :cool_alt:
 
Zuletzt bearbeitet:
Ja syntec :> mein problem ist ja ich weiss nicht wie ich das abfrage ob der user abgelaufen ist :):)

oben sind doch meine abfragen. Schau doch anhand der dinger mal bitte.
 
Menno, hatte ich doch gerade oben geschrieben :D

select id from users WHERE onlinestatus = 1 AND userid = $_SESSION['userid']

und dann

if(mysql_num_rows($result) == 1)
// aha, jetzt zeit updaten
else
// nix machen, ist eh ganz oben schon rausgeflogen

Ansonsten speichere doch noch die aktuelle SessionID zusätzlich in der Datenbank,
dann kann man sich nur einmal einloggen.
 
grml ich glaub ich peils nicht .. aber ich probiers mal so moooment !

Ja aber du schreibst ja else.. nix machen der ist ja gaanz oben schon rausgeflogen !! aber das ist ja der knackpunkt die abfrage fehlt mir :>
 
Zuletzt bearbeitet:
quicksilver schrieb:
grml ich glaub ich peils nicht .. aber ich probiers mal so moooment !

Brrr - ganz ruhig Brauner... :evillol:

Denk nochmal ganz in ruhe nach und schau in Dein Postfach. Da ist mein komplettes Script
welches funktioniert.
 
Zurück
Oben