'Wer ist online'-Script mit PHP/MySQL

Huiiii, mit now() funktioniert es :) Dankeschöööön. Jetzt kann ich endlich weitermachen. Das hatte mich doch richtig gewurmt das das nicht ging :D

Dankööö :)
 
Hmm, funktioniert doch nicht so wie ich dachte.

Also:

Wenn ich mit User-ID 1 online gehe, wird 'online' auf 1 gesetzt.
Wenn ich mit User-ID 1 offline gehe, wird nach 5 Minuten 'online' auf 0 gesetzt.

So weit so gut. ABER:

Wenn ich mit User-ID 1 UND 2 online gehe, wird 1 auf online gesetzt, 2 nicht.
Wenn ich dann mit 1 offline gehe, wird 1 auf offline, und in dem Moment 2 auf online gesetzt.

Es scheint also so, dass immer nur einer online sein kann =/ Und das ist doof ^^
 
Sicher ;)

Stell mal deinen Quellcode rein, wie du es jetzt gelöst hast, dann schau ich mir den mal an.

PS: Genrell ist es so, dass wenn du den selben Browser verwendest (wie Firefox 2.x) und das in einem anderen Tab machst, wird oft die selbe SessionID verwendet. Teste so etwas lieber mit 2 komplett verschiedenen Browsern (IE, Firefox, Opera, Safari).
 
lol ja klar, nach einer vergangenen Woche darf man ruhig pushen, selbst nach 24 stunden isses denk ich ma ok, denn bei der Anzahl an neuen threads landet man in der regel nach 24 stunden ohne neuen post auf seite2, und wer schaut da scho rein :D

Hm, ich würd an deiner stelle auf Radhad's ersten Vorschlag setzen und nicht mit MySQL-Zeitfunktionen etc setzen sondern per PHP "hardcoden", ich vermut mal dass das die bessere wahl ist...
 
Auf der Indexseite, d.h. dieser Code wird bei jedem Seitenaufruf mit aufgerufen, damit es möglichst immer aktuell bleibt. Eine andere Möglichkeit wüsste ich nicht, Cronjobs bekomm ich leider nur einmal die Stunde.
Die Funktion steht in einer anderen Datei, die vorher included wird. Hab ich mal zur Übersicht mit angegeben

Hier soweit der Code:

PHP:
// Prüfen, ob der User eingeloggt ist
         function logged_in()
	{
		$sql = "SELECT
                 		id
    			FROM
                         	login
    			WHERE session='".session_id()."'
    			LIMIT 1
                        ";

    		$result = mysql_query($sql);
                 return ( mysql_num_rows($result)==1);
	}

PHP:
// 'Letzte Online-Aktivität' aktualisieren
         if (logged_in())
         {
		$aktiv = "UPDATE
                 		profil_daten
    			  SET
                          	zuletzt_aktiv = now()
    			  WHERE
                         	(SELECT id FROM login WHERE session='".session_id()."' )  = profil_daten.id
                          ";

     		mysql_query($aktiv);
         }

                 $online = "UPDATE
                 		login
    			  SET
                          	online = 1
    			  WHERE
                         	(SELECT id FROM profil_daten WHERE DATE_SUB(NOW(), INTERVAL 5 MINUTE) <= zuletzt_aktiv LIMIT 1)  = login.id
                          ";

     		mysql_query($online);

                 $online = "UPDATE
                 		login
    			  SET
                          	online = 0
                           WHERE
                         	(SELECT id FROM profil_daten WHERE DATE_SUB(NOW(), INTERVAL 5 MINUTE) >= zuletzt_aktiv LIMIT 1)  = login.id
                          ";

     		mysql_query($online);
 
Also generell würde ich die Verwaltung, wer online ist in eine eigene Tabelle auslagern, die nur die eingeloggten User anzeigt und ca. folgende Struktur enthält:

Tabelle: users_online
Spalten:
UserID_FK (UserID abspeichern aus der Tabelle "Users")
SessionID (PHP SessionID -> das ist aber nicht gerade sicher, aber für das Grundverständnis ausreichend)
LastActivity (ich verwende hier einen Timestamp)

Wenn sich ein User einloggt, schreibt alle aktuellen Daten in diese Tabelle, also seine UserID, seine SessionID und den aktuellen Timestamp.

Bei jedem Aufruf der Seite wird erstmal nen Script ausgeführt, das alle Einträge löscht, wo die LastActivity länger als x Sekunden her ist (für 5 Minuten also 60 * 5).
SQL:
DELETE FROM users_online WHERE LastActivity < ".(time() - 60 * 5).";
Danach prüft man, ob man denn noch eingeloggt ist mit seiner SessionID, wenn ja, dann mach nen UPDATE auf "LastActivity" mit time() (quasi ein Refresh des Timers, bis wann man ausgeloggt wird). Wenn nicht, dann sollte man erstmal die aktuelle Session killen, alle Variablen auflösen und ne neue SessionID generieren, damit man definitiv ausgeloggt ist.

Da TchiboMann mir gerade noch auf die Sprünge hilft, wie man eine Session selber verwaltet, kann ich dabei nicht wirklich auf das Thema Sicherheit eingehen.
 
Es funktioniert einwandfrei, DANKE ;)


Hier nun die Lösung, wie ich es umgesetzt habe:


Beim Login:
PHP:
$sql = "INSERT INTO
                 		users_online
                      	(
                    		user_id,
                                 zuletzt_aktiv
                  	)
    	       		VALUES
                         (
                         	(SELECT id FROM login WHERE email='".$email."' LIMIT 1),
         	   		now()
                         )
                        ";

    		mysql_query($sql) OR die(mysql_error());

Dann auf jeder Seite:
PHP:
$online = "DELETE FROM
                 		users_online
                            WHERE zuletzt_aktiv < now() - 60 * 1
                           ";

     		mysql_query($online);

Und an entsprechender Stelle dann einfach
PHP:
$sql = "SELECT
                 	       *
    			FROM
                         	users_online
                        ";

    		$result = mysql_query($sql);

                 while($row = mysql_fetch_assoc($result))
         	{
                 echo $row['user_id'];
                 }

Die User_ID kann ich dann ja jetzt weiter verarbeiten, also entsprechende Namen der User auslesen usw. Das dürfte aber nun kein Problem mehr sein.
Vielen, vielen Dank, an alle die mir hier geholfen haben :)

MfG Linaloya
 
Zuletzt bearbeitet:
Zurück