PHP Registrierte User

martl92

Lieutenant
Registriert
Feb. 2009
Beiträge
598
Hallo,

ich brauche mal eben Hilfe =):

Ich habe nun ein kleines Projekt für mich selbst erstellt, dass ein Forum, News, usw. enthält. Dabei gibt es auch ein Login und einen eigenen Bereich für Registrierte User. Nun möchte ich alle registrierten User auf der Website auflisten. Leider habe ich bisher keine Lösung im Kopf und brauche deshalb jemand der mir nen Tipp geben kann.
Habe mir mal überlegt mit Datenbank das zu machen. Da würden die User beim Login eingetragen und beim Logout wieder gelöscht, doch wenn ich den Browser einfach schließe bleibt der User drinnen ...

Jemand nen Vorschlag???

mfg
 
Du könntest bei jedem Zugriff eines Users auf die Seite in der DB einen zeitstempel mit aktueller zeit für den User speichern und dann über SQL Abfrage alle User ausgeben die z.B. innerhalb der letzten 10 min auf de Seite zugegriffen haben.
 
Würd ich auch so machen. Damit hast du auch gleichzeitig deine "last online"-Liste.
 
Ja aber mit dem rauslöschen wenn klappts dann aber nicht oder??

mfg
Ergänzung ()

Und mit dem rauslöschen aus der DB wieder???
Einfach beim eintragen auch abfragen ob einige zu löschen sind oder wie?!

mfg
 
wieso willst du denn was rauslöschen? du hast doch vermutlich zu jedem user deiner seite einen eintrag in einer usertable o.ä. wo du mindestens name und passwort für die anmeldung speicherst. Dort legst du dann einfach eine spalte state_login als bool an die angibt ob der user sich angemeldet hat und last_action mit typ timestamp um die letzte aktivität zu speichern. dann definierst du
eingeloggt := (state_login && last_action+10min < now)
ausgeloggt := (!eingeloggt)
löschen musst du dann nichts...
 
ok jetzt hab ich`s. Thanks werd es gleich mal ausprobieren.

mfg
 
Man kann eh nicht richtig ermitteln, welcher User gerade Online ist. Dafür ist das HTTP Protokoll auch nicht gedacht, da nur eine TCP Verbindung aufgebaut wird, um die Seite zu laden. Wenn sie geladen ist, wir die TCP Verbindung beendet.
Foren, wie z.B. vBulletin und andere speichern immer einen Zeitstempel der letzten Aktivität der User und dann wird einfach eine Liste der User ausgegeben, wo die letzte Aktivität weniger als 10 Minuten her ist.
 
Es ist halt die frage was man mit online meint. wenn es nur darum geht ob die seite noch im browser geöffnet ist könnte man clientseitig alle x minuten über ajax eine rückmeldung implementieren. wenn die dann irgendwann ausbleibt ist das browserfenster geschlossen worden oder die verbindung unterbrochen. ob das sinnvoll ist ist natürlich eine andere frage...
 
Ok habe es jetzt folgendermaßen erledigt:

Bei jedem Aufruf (Tätigkeit) des Users wird in der Datenbank eine Spalte mit der Zeit aktualisiert. Die aktuelle Zeit wird jedoch mit 15min addiert. So brauch ich nur abfragen ob die Zeit in der DB größer ist und somit bekomme ich auch schon die User die in den letzten 15 min online waren.

Nochmal dank für eure Antworten!!!

mfg
 
ich würds lieber anders rum machen
und dann
"SELECT * FROM users where (lastaction+600) >= ".time()

is einfach sinnvoller, und wenn du später mal zeigen willst wer so in der letzen stunde on war musst nich wieder alles umschreiben
 
Es funktionieren beide Versionen wunderbar, also kann man sich dann entscheiden wie man es lösen will ...

mfg
 
Klar funktioniert beides.

Was olzibambolzi sagen wollte ist einfach das es für andere, möglicherweise folgende Abfragen sinnvoller ist nur den Timestamp und nicht die Summe zu speichern, weil du für alle anderen Berechnungen diese aufsummierte Zeit sonst erst wieder abziehen musst.
z.B. wenn du herausfinden willst wann die letzte Aktivität in deinem Forum war. Oder wann ein User zuletzt aktiv war.

Ausserdem kannst du dann viel einfacher durch ändern der SQL Abfrage den Zeitraum verändern in dem ein User als eingeloggt gilt. Bei deiner Version müsste man erst alle Daten der Datenbank nochmal aktualisieren. Deshalb ist olzibambolzi's Vorschlag langfristig vermutlich besser.

Normalerweise ist es immer vorteilhafter Werte in einer DB zu speichern die eine grundlegende Bedeutung haben und als Berechnungsgrundlage zu verwenden als zwischenergebnisse einer Berechnung. Zumindest solange sich der Aufwand der Berechnung im konstanten Rahmen bewegt.

Aber wie gesagt: Funktionieren tut beides.
 
Wäre es im Übrigen nicht besser, das Ergebnis der Zeit vorher auszurechnen, als die Datenbank jedes Ergebnis noch ausrechnen zu lassen? (Oder ist eine MySQL-Datenbank intelligent genug, die 600 selbst auf die andere Seite zu bringen?)
Also
"SELECT * FROM users where lastaction >= ".(time()-600)

Und das ist eindeutig die sinnvolle Variante, da flexibler...
 
Es würde mich schon ein wenig wundern wenn der Optimierer in MySQL soetwas ignorieren würde... Andererseits ist der Geschwindigkeitsvorteil durch weglassen von ein paar Additionen in diesem Zusammenhang vermutlich nicht mal messbar.
 
Zurück
Oben