Per PHP Onlinestatus eines Benutzers überprüfen
Guten Abend,
Ich möchte per PHP den online-Status eines Benutzers überprüfen und diesen auf meiner Webseite anzeigen lassen. Ist der User online, so soll hinter seinem Name [Online] stehen, ist er offline steht eben [Offline] dort.
Meine Idee war, sobald nach 5 Minuten keine Reaktion kommt, ist der Benutzer offline. Doch wie realisiere ich diese Idee?
Bitte eine genaue Beschreibung, auch mit dem timestamp, das verstehe ich bis jetzt noch garnicht.
Mit freundlichem Gruß,
Marco
3 Antworten
Ich würde es so machen, also ganz in Ruhe nochmal...
Du brauchst ne UserID oder sowas, Struktur von der Tabelle "online":
| oID | uID | timestamp |
Script:
// $userID vom angemeldeten Benutzer, der Seite aufruft (jeder)...
$t = time();
$erg = mysql_query("SELECT oID FROM online WHERE uID = '$userID' LIMIT 1;");
if (mysql_num_results($erg)){
mysql_query("UPDATE online SET timestamp = '$t' WHERE uID = '$userID';");
} else {
mysql_query("INSERT INTO online ('uID', 'timestamp') VALUES ('$userID', '$timestamp');");
{
mysql_query("DELETE FROM online WHERE $t + (5 * 60) < $timestamp");
Auslesen:
//$uid von dem Nutzer der Geprüft werden soll...
$erg = mysql_query("SELECT oid FROM online WHERE uID = '$uid' LIMIT 1;");
if (mysql_num_rows($erg)) {
echo "online";
} else {
echo "offline";
}
Natürlich ungetestet...
mysql_query("DELETE FROM online WHERE $t + (5 * 60) < $timestamp");
^^Fehler... Richtig so:
mysql_query("DELETE FROM online WHERE $t + (5 * 60) < timestamp");
Ja genau und da wo die Usernamen ausgibst die geprüft werden sollen, zb Forum an den Posts.. da ließt du ja aus wer den Post geschrieben hat.. dann nimmst du dem seine uID aus der Datenbank und prüfst die mit meinem Auslesescript.
Oder z.B. auf einer Profilseite von xyz da nimmst die id von xyz also dem, dem die Profilseite gehört.
Und jeder User trägt sich aber mit seiner id, mit der er eingeloggt ist in die Tabelle ein.
Ach und nach dem 2. else muss die Klammer zugehen nicht auf also } statt {
Wirst du wohl merken ;)
Fatal error: Call to undefined function mysqlnumresults() in /home/a5639353/public_html/save.php on line 740
Wird mir unteranderem auch angezeigt.
DAnn ist der Fehler schonmal weg :D aber Wie kann ich hinter dem Name dann das [Online] anzeigen lassen?
Bzw. bei mir rtägt er nichts in die Datenbank ein...
Wie oben geschrieben... mein Codeteil wo Auslesen drüber steht... Da misst du aber nicht ide id vom eingeloggten Nutzer sondern die von dem Typ der geprüft werden soll.
Das Problem ist, bei mir wird in die Datenbank nichtmal etwas eingetragen.
hmm dann schreib mal am ende vom Code
echo mysql_error();
hin und gucke obs ein SQLfehler ist.
Du hattest noch einen Fehler :D
mysql_query("INSERT INTO online ('uID', 'timestamp') VALUES ('$userID', '$timestamp');");
zu
mysql_query("INSERT INTO online (uID, timestamp) VALUES ('$userID', '$timestamp');");
Und bei dem Feld "timestamp" trägt er garnichts ein, da ist in deinem Script auch keine Variable dafür ^^
ja :D Und noch einen $timestamp zu $t
Man man man
Ok hast du ebend auch rausgefunden, das klappt heute noch ;)
So, jetzt hab ich schonmal uID und Timestamp in der Datenbank :D
JEtzt gehts mit den nächsten Problemen weiter lach
Was jetzt machen? ^^
Was bzw. für was ist oID? Die bleibt bei mir leer.
Na komm ;) Also jetzt Updatet der von jedem Onlinetypen den timestamp (Vergangene Sekunden seit 1.1.1970) wenn der die Siete refresht und haut alle raus die das seit 5 Minuten nicht mehr gemacht haben... Nun nimmst du das Auslesescript und prüfst mit der uid von dem den du testen willst ob er online ist... das gibt dann schon online oder offline aus... ^^Zum 3. mal jetzt :D
Die oid sollte der Primärschlüssel sein,,, hättest du auf autoincrement stellen müssen und primary key.
Bei mir steht da offline, obwohl das meine uID ist und ich online bin :o
Mache eben oid mit Primär & co.
Kann net sein... hast es diesmal auch in $uid geschrieben? Naja, du müsstest den Sinn doch jetzt erkannt haben, also guck mal... ich seh keinen Fehler...
$userID = $_SESSION['userid'];
$t = time();
$erg = mysql_query("SELECT oID FROM online WHERE uID = '$userID' LIMIT 1;");
if (mysql_num_rows($erg)){
mysql_query("UPDATE online SET timestamp = '$t' WHERE uID = '$userID';");
} else {
mysql_query("INSERT INTO online (uID, timestamp) VALUES ('$userID', '$t');");
}
mysql_query("DELETE FROM online WHERE $t + (5 * 60) < t");
$uID = $_SESSION['userid'];
$erg = mysql_query("SELECT oid FROM online WHERE uID = '$uid' LIMIT 1;");
if (mysql_num_rows($erg)) {
echo "online";
} else {
echo "offline";
}
Hab ich da einen Fehler gemacht? Bei mir kommt immer offline raus.
Hab bei der Abfrage die uID mit 1 ausgetauscht, praktisch meiner. JEtzt zeigt er online an thumbs up
Danke das du die halbe Nacht mit mir verbracht hast ;-)
Eigentlich nicht :/ Prüfe mal auf mysql error()
Also vom Sinn her hastet jetzt? (Sry ;D ) Also wenn da einer drinne steht mit seiner id ist der on... (Solange das mit Update und Delete funzt)...
Also ja, weiß nicht...
Naja, ist ja jetzt auch egal. Da ich ads nur für meine Teammitglieder benutzt, kann ich das im Auge behalten
Habe es nun so geregelt:
$uID = Nummer von der DB des Benutzers
Prüfe gerade mit einem 2. Account ob das auch mit Offline funktioniert
Sieht so aus, als wie wenn es funktioniert. Ca 2 Minuten, wenn der 2. Acc dann offline ist passt alles :D
Habe dir auch soeben noch ein Kompliment @Profil gemacht ;)
Jo, ich guck hier immer mal lang... falls nochn Problem ist...
@Offtopic: Morgen um die Uhrzeit = Hilfreichste Antwort ;)
Okay :D Werd ich bei meinem Glück auch noch brauchen :D
Achso, hab noch eine andere Frage gestellt, kannste mri bei der auch helfen? ^^
._. So wie es aussieht, will er nicht offline gehen... Bleibt bei online stehen
Ich guck gleich mal...ach und nochwas... wenn du ne Onlineliste willst, nimmst dann einfach jeden Eintrag aus der Tabelle (sry nur Nummer sicher, will nicht klugscheißen)
Und Thx wegem Kompliment :)
Ok... Jettz isser online, bleibt aber darauf... Offline will er anscheinend nicht :(
$t + (5 * 60) < t
ist
$t + (5 * 60) < timestamp
?
Ungegebenen falls mal nachrechnen, alles löchen wo t + 5*60 sekunden kleiner ist als die aktuelle zeit.
jo guck mal hoch :D Und wenn das nicht hinhaut, dann musste mal selbst rechnen.. keine Lust dadrauf gerade.
Ne, ist nicht < timestamp
Hab ich schon in
< t
geändert. Wie soll ich das rechnen das er nach 3 Minuten als Offline anzeigt?
muss aber timestamp sein.... Moment, habs verwürfelt glaube...
timestamp + (5 * 60) < $t
^^So ist richtig, 100 pro
Alte Zeit + 5 Minuten ist nun kleiner als aktuelle Zeit und damit länger als 5 Minuten her... Wenn du 3 Minuten willst, dann musste aus der 5 ne 3 machen.
mysql_query("DELETE FROM online WHERE $t + (5 * 60) < t");
in
mysql_query("DELETE FROM online WHERE $timestamp + (3 * 60) < $t");
umändern`?
Nein in:
mysql_query("DELETE FROM online WHERE timestamp + (3 * 60) < $t;");
Hab auf deine andere Frage geantwortet... :)
Woooooooooooooooooooow....
Du bist echt der beste, jetzt funktionierts. Jetzt auch ich mal ob die andere Frage jetzt auch funktioniert :D
//Hier: Herstellen der Datenbankverbindung
$ip = $_SERVER["REMOTE_ADDR"];
$min = 5; //timeout in minuten
$time = time();
$timeout = $time - ($min * 60);
//updaten der User
mysql_query("DELETE FROM online WHERE ip = '$ip' OR timestamp < $timeout");
mysql_query("INSERT INTO online(ip,timestamp) VALUES('$ip', $time)");
//auslesen der User die online sind
$sql = mysql_query("SELECT COUNT(0) FROM online");
$online = mysql_fetch_array($sql);
$online enthält alle user (IP) die sich in den letzten $min Minuten gemeldet haben.
Du brauchst auf deiner Datenbank eine Tabelle "online" mit den Spalten ip (varchar), timestamp (int).
Hi,
Und wie gebe ich das [Online] hinter dem Name aus, bzw. das [Offline]?
Naja man müsste noch prüfen ob der User der es aufruft schon drinne steht und statt eines INSERT dann ein UPDATE machen, sonst trägt sich jeder genauso oft ein wie oft er in 5 Minuten die Seite aufruft.
also ca... schnell hingeklatcht jetzt wegen editierzeit...
$erg=mysql_query("select from online where ip =$ip;");
if (mysql_num_rows($erg)) {
//update
} else {
//insert
}
Du speicherst in einer Datenbank für jeden Benutzer den Zeitstempel des letzten Seitenaufrufs und schaust bei der Anzeige ob [Online] bzw. [Offline] ob der letzte Zeitstempel länger als 5 Minuten zum aktuellen Zeitstempel zurück liegt.
Da geht es schon los. Wie gesagt, Zeitstempel hatte ich noch nicht. Wie soll ich die denn speichern? In der DB wird es ja nicht "UPDATE ON CURRENT TIMESTAMP" sein, wird über PHP laufen, richtig?
Habe meine Benutzer so geregelt bis jetzt;:
$SESSION['user'] = Benutzername $SESSION['userid'] = UserID