Per PHP Onlinestatus eines Benutzers überprüfen

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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...

marco19999 
Fragesteller
 30.10.2013, 00:02

Habe meine Benutzer so geregelt bis jetzt;:

$SESSION['user'] = Benutzername $SESSION['userid'] = UserID

0
Elmo2999  30.10.2013, 00:06
@marco19999

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 ;)

0
marco19999 
Fragesteller
 30.10.2013, 00:09
@Elmo2999

Bei mir funktioniert garnichts... Bin Anscheinend zu blöd

Jap, das hatte ich gemerkt :D

0
marco19999 
Fragesteller
 30.10.2013, 00:11
@marco19999

Fatal error: Call to undefined function mysqlnumresults() in /home/a5639353/public_html/save.php on line 740

Wird mir unteranderem auch angezeigt.

0
Elmo2999  30.10.2013, 00:13
@marco19999

mach mal

mysql_num_rows() 

draus... Faselfehler meinerseits :D

0
marco19999 
Fragesteller
 30.10.2013, 00:13
@Elmo2999

DAnn ist der Fehler schonmal weg :D aber Wie kann ich hinter dem Name dann das [Online] anzeigen lassen?

0
marco19999 
Fragesteller
 30.10.2013, 00:15
@marco19999

Bzw. bei mir rtägt er nichts in die Datenbank ein...

0
Elmo2999  30.10.2013, 00:16
@marco19999

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.

0
marco19999 
Fragesteller
 30.10.2013, 00:16
@Elmo2999

Das Problem ist, bei mir wird in die Datenbank nichtmal etwas eingetragen.

0
Elmo2999  30.10.2013, 00:17
@marco19999

hmm dann schreib mal am ende vom Code

echo mysql_error();

hin und gucke obs ein SQLfehler ist.

0
Elmo2999  30.10.2013, 00:18
@marco19999

jo

echo mysql_error();

am ende eintragen (falls das jezt oben überließt.)

0
marco19999 
Fragesteller
 30.10.2013, 00:18
@marco19999

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');");
0
marco19999 
Fragesteller
 30.10.2013, 00:19
@marco19999

Und bei dem Feld "timestamp" trägt er garnichts ein, da ist in deinem Script auch keine Variable dafür ^^

0
Elmo2999  30.10.2013, 00:20
@marco19999

ja :D Und noch einen $timestamp zu $t

Man man man

Ok hast du ebend auch rausgefunden, das klappt heute noch ;)

0
marco19999 
Fragesteller
 30.10.2013, 00:21
@Elmo2999

So, jetzt hab ich schonmal uID und Timestamp in der Datenbank :D

JEtzt gehts mit den nächsten Problemen weiter lach

Was jetzt machen? ^^

0
Elmo2999  30.10.2013, 00:25
@marco19999

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.

0
marco19999 
Fragesteller
 30.10.2013, 00:26
@Elmo2999

Bei mir steht da offline, obwohl das meine uID ist und ich online bin :o

Mache eben oid mit Primär & co.

0
Elmo2999  30.10.2013, 00:28
@marco19999

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...

0
marco19999 
Fragesteller
 30.10.2013, 00:30
@Elmo2999
$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.

0
marco19999 
Fragesteller
 30.10.2013, 00:33
@marco19999

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 ;-)

0
Elmo2999  30.10.2013, 00:34
@marco19999

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...

0
marco19999 
Fragesteller
 30.10.2013, 00:36
@Elmo2999

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
0
marco19999 
Fragesteller
 30.10.2013, 00:36
@marco19999

Prüfe gerade mit einem 2. Account ob das auch mit Offline funktioniert

0
marco19999 
Fragesteller
 30.10.2013, 00:40
@marco19999

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 ;)

0
Elmo2999  30.10.2013, 00:41
@marco19999

Jo, ich guck hier immer mal lang... falls nochn Problem ist...

0
marco19999 
Fragesteller
 30.10.2013, 00:41
@marco19999

@Offtopic: Morgen um die Uhrzeit = Hilfreichste Antwort ;)

0
marco19999 
Fragesteller
 30.10.2013, 00:41
@Elmo2999

Okay :D Werd ich bei meinem Glück auch noch brauchen :D

0
marco19999 
Fragesteller
 30.10.2013, 00:42
@marco19999

Achso, hab noch eine andere Frage gestellt, kannste mri bei der auch helfen? ^^

0
marco19999 
Fragesteller
 30.10.2013, 00:44
@marco19999

._. So wie es aussieht, will er nicht offline gehen... Bleibt bei online stehen

0
Elmo2999  30.10.2013, 00:45
@marco19999

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 :)

0
marco19999 
Fragesteller
 30.10.2013, 00:46
@Elmo2999

Ok... Jettz isser online, bleibt aber darauf... Offline will er anscheinend nicht :(

0
Elmo2999  30.10.2013, 00:47
@marco19999

$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.

0
Elmo2999  30.10.2013, 00:48
@marco19999

jo guck mal hoch :D Und wenn das nicht hinhaut, dann musste mal selbst rechnen.. keine Lust dadrauf gerade.

0
marco19999 
Fragesteller
 30.10.2013, 00:50
@Elmo2999

Ne, ist nicht < timestamp

Hab ich schon in

< t

geändert. Wie soll ich das rechnen das er nach 3 Minuten als Offline anzeigt?

0
Elmo2999  30.10.2013, 00:53
@marco19999

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.

0
marco19999 
Fragesteller
 30.10.2013, 00:55
@Elmo2999
mysql_query("DELETE FROM online WHERE $t + (5 * 60) < t");

in

mysql_query("DELETE FROM online WHERE $timestamp + (3 * 60) < $t");

umändern`?

0
Elmo2999  30.10.2013, 00:59
@marco19999

Nein in:

mysql_query("DELETE FROM online WHERE timestamp + (3 * 60) < $t;");

Hab auf deine andere Frage geantwortet... :)

0
marco19999 
Fragesteller
 30.10.2013, 01:00
@marco19999

Woooooooooooooooooooow....

Du bist echt der beste, jetzt funktionierts. Jetzt auch ich mal ob die andere Frage jetzt auch funktioniert :D

0
Elmo2999  30.10.2013, 00:03

mysql_query("DELETE FROM online WHERE $t + (5 * 60) < $timestamp");

^^Fehler... Richtig so:

mysql_query("DELETE FROM online WHERE $t + (5 * 60) < timestamp");

0
//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).

Elmo2999  29.10.2013, 23:41

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
}
0
marco19999 
Fragesteller
 29.10.2013, 23:44

Hi,

Und wie gebe ich das [Online] hinter dem Name aus, bzw. das [Offline]?

0

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.

marco19999 
Fragesteller
 29.10.2013, 23:24

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?

0