Webdesign in Siegen

Useronline

Fragen zum Thema PHP können hier gestellt werden

Moderator: Basti

Useronline

Beitragvon =Max= am 07.04.2008, 13:41

Hallo,

bin gerade dabei, mir ein Usersystem zu bauen. Bin schon recht gut vorangeschritte, nun stehe ich aber vor dem Problem, das ich anzeigen möchte, welche User tatsächlich online sind. Habe verschiedene Theorieren (z.b. in einer Datenbank online oder offline zu speichern - geht aber nur, wenn sich der User ordnungsgemäß abmeldet ;) ).

Vielleicht hat ja einer von den Spitzen-Programmieren hier eine Ahnung :)

:dw:

Lg,
Max
=Max=
Mitglied
 
Beiträge: 404
Registriert: 14.01.2007

Re: Useronline

Beitragvon Manuel am 07.04.2008, 13:59

Hi Max!

Na dann lad dir doch mal das phpBB-Forum runter und schau wie es dort über die Sessions gemacht wurde. Denn prinzipiell klingt es ja recht einfach: "Zeige mir alle, die gerade online auf der Webseite sind". Ganz so einfach ist es dann aber doch nicht, weil es eine solch einfache Abfrage nicht gibt. Demnach muss jeder User, der auf die Webseite kommt über eine Session-Time registriert werden, auch die Anonymen. Somit hast du die Chance, über die Zeit dann zu testen, wer online ist und wer nicht.

Lg,
Manuel ;-]
Benutzeravatar
Manuel
Site Admin
 
Beiträge: 8776
Registriert: 10.12.2004
Wohnort: Asbach

Re: Useronline

Beitragvon =Max= am 07.04.2008, 14:08

Daran habe ich auch schon gedacht - aber der Code von PHPBB ist dann doch noch eine Stufe zu hoch für mich. Da gibt es so viel aufeinanderfolgendes und zusammenhängendes, dass ich schon am Anfang nicht mehr mitkomme!
=Max=
Mitglied
 
Beiträge: 404
Registriert: 14.01.2007

Re: Useronline

Beitragvon Eyecatcher am 07.04.2008, 14:31

Also, ich stell dir 2 Ansätze vor und du sagst mir welchen du haben willst, dann sehen wir weiter:

1.)
Grundprinzip ist, dass von jedem User auf deiner Seite die IP in einer Datenbank gespeichert wird und bei jedem Seitenaufruf die Timestamp Variable dazu. Nun wird widerrum bei jedem Seitenaufruf (egal von wem) geschaut, ob die entsprechende IP schon in der Datenbank vorhanden ist, wenn ja, wird die Zeit wieder heraufgezählt (zum Beispiel 3 Minuten (180s)). Für die Online Abfrage wird nun einfach geschaut, wieviele Datensätze in der Datenbank vorhanden sind. Die Datensätze, wo der Timestamp nach 3 Minuten nämlich Abgelaufen ist (time() > $db->last_click) werden gelöscht. Ist eigentlich relativ einfach, nur komm grad aus der Schule und hab mich mit Kaffee vollgepumpt und meine Grammatik ist, öh, äh, ach, ich weiß auch nicht...

2.)
Realisierung per Ajax
Vorteile: Überprüfung geschieht in Echtzeit, Realer/Exakter Wert
Nachteil: Benutzer braucht Javascript, Komplizierter zu Programmieren (helf dir gerne ;) )
“Freude an der Arbeit läßt das Werk trefflich geraten”
» Aristoteles
Benutzeravatar
Eyecatcher
Mitglied
 
Beiträge: 287
Registriert: 01.03.2008
Wohnort: Espelkamp

Re: Useronline

Beitragvon =Max= am 07.04.2008, 14:43

Da es immernoch einige gibt die JS nicht aktiviert haben und ich doch eigentlich mein PHP dadurch verbessern will ziehe ich Variante 1 vor :) Also im moment habe ich das so gelöst (was heißt "gelöst" :P)

Im moment speichere ich in der Tabelle mit_users die IP beim einloggen und bei jedem Seitenaufruf time() in der Spalte lastonline (name schlecht gewählt - lässt sich ändern) Mehr habe ich noch nicht gemacht, da ich ebend erstmal ein genaues Konzept brauche. Habe ich jetzt richtig verstanden, das ich also eine neue Tabelle (z. B. mit_online) brauche mit den Spalten:
ip und lastklick?
=Max=
Mitglied
 
Beiträge: 404
Registriert: 14.01.2007

Re: Useronline

Beitragvon Eyecatcher am 07.04.2008, 15:12

Ja das würd ich dir empfehlen, dadurch fängst du nicht nur die User auf, die sich registriert/eingeloggt haben, sondern jeden, da die anhand der IP ermittelt werden. Ausserdem lassen sich diese Datensätze wenn der Timestamp abgelaufen ist dann auch wieder problemlos löschen, und um die User zu erfahren brauchste nur alle Datensätze einmal durchzählen.
Muss erstma zum Augenarzt, dann kann ich mehr schreiben :lol: :lol:
“Freude an der Arbeit läßt das Werk trefflich geraten”
» Aristoteles
Benutzeravatar
Eyecatcher
Mitglied
 
Beiträge: 287
Registriert: 01.03.2008
Wohnort: Espelkamp

Re: Useronline

Beitragvon =Max= am 07.04.2008, 15:19

Ok, dann erstelle ich in der Zeit schonmal die Tabelle - und programmiere schon mal soweit, das die IP da eingetragen wird, und bei jedem Klick das geändert wird.

Muss ich dann einfach mit
$time = time();
$ip = $_SERVER["REMOTE_ADDR"];
UPDATE ... SET lastklick = '$time' WHERE ip = '$ip' ...

?
=Max=
Mitglied
 
Beiträge: 404
Registriert: 14.01.2007

Re: Useronline

Beitragvon Eyecatcher am 07.04.2008, 18:48

Das ist genau der richtige Ansatz, so jetzt denken wir das ganze mal weiter...
Als erstes möchten wir haben das Einträge, die über xx (wir nehmen mal 180) Sekunden alt sind gelöscht werden.

Dazu schreibst du:
$buffertime = time() - 180;
DELETE FROM ... WHERE lastklick < '$buffertime'

Nun nur noch alle Einträge in der DB zählen, und es sollte funktionieren ;)

Achja, noch was vergessen, du sollteste natürlich überprüfen ob die IP schon existiert, und dich erst dann für UPDATE entscheiden, oder eben alternativ mit INSERT arbeiten um einen neuen Datensatz einzufügen!
“Freude an der Arbeit läßt das Werk trefflich geraten”
» Aristoteles
Benutzeravatar
Eyecatcher
Mitglied
 
Beiträge: 287
Registriert: 01.03.2008
Wohnort: Espelkamp

Re: Useronline

Beitragvon =Max= am 07.04.2008, 18:50

Das könnte man ja über eine Funktion lösen ;) Ok dann bereite ich das mal so vor :P
=Max=
Mitglied
 
Beiträge: 404
Registriert: 14.01.2007

Re: Useronline

Beitragvon =Max= am 16.04.2008, 15:40

Neues Problem:

Habe die User_id noch gespeichert, um auch anzuzeigen WER online ist.

Problem:
User1 loggt sich ein und die Session läuft ab. Gleichzeitig loggt sich ein Freund von User1 mit User1 Userdaten ein. Zwei Datensätzein der Datenbank nur unterschiedliche IPS bei der Abfrage steht ja dann zweimal User1?

Mein Update-Code schaut derzeit folgendermaßen aus:

Code: Alles auswählen
if($_SESSION["status"] == true) {
   // Variablen bestimmen
   $ip = $_SERVER["REMOTE_ADDR"];
   $id = $_SESSION['id'];

   // Schauen, ob User bereits in der Online Datenbank vorhanden ist!
   $online_gucken = mysql_query("SELECT * FROM mit_online WHERE ip = '$ip' && user_id = '$id'");

   if(mysql_num_rows( $online_gucken ) > 0) {
      $buffertime = time();
      // Klick updaten
      $update = mysql_query("UPDATE mit_online SET lastklick = '$buffertime' WHERE user_id = '$id' && ip = '$ip'");

      if(!$update) {
         echo mysql_error();
      }
   } else {
      $time = time();
      $insert = mysql_query("INSERT INTO mit_online(ip, lastklick, user_id) VALUES ('$ip', '$time', '$id')");

      if(!insert) {
         echo mysql_error();
      }
   }
}


EDIT: Würde die Sache auch funktionieren, wenn man einfach die IP aus dem spiel lässt und diese Sache einfach mit der ID arbeitet das immer der Datensatz mit der id abgefragt wird? Dann würde bei zwei Leuten nur ein Datensatz geupdatet werden
=Max=
Mitglied
 
Beiträge: 404
Registriert: 14.01.2007

Re: Useronline

Beitragvon Eyecatcher am 16.04.2008, 16:01

Ja dein Ansatz würde auch funktionieren, also per ID. Also IP mit UserId vertauschen...
“Freude an der Arbeit läßt das Werk trefflich geraten”
» Aristoteles
Benutzeravatar
Eyecatcher
Mitglied
 
Beiträge: 287
Registriert: 01.03.2008
Wohnort: Espelkamp

Re: Useronline

Beitragvon =Max= am 13.05.2008, 18:30

So, wenn ich jetzt die User anzeigen will, wird aber immer nur EIN user angezeigt. Das ist dumm (:P)

So sieht der Code aus:

Code: Alles auswählen
function username($userid) {
   $res = mysql_query("SELECT username FROM mit_user WHERE id = '$userid'");

   $row = mysql_fetch_array( $res );

   return $row["username"];
}
  $buffertime = time() - 180;
   $onlinegucken = mysql_query("SELECT * FROM us_online WHERE lastklick > $buffertime");
   echo "<br><b>Folgende User sind online:</b><br />";
   if(mysql_num_rows ( $onlinegucken ) > 0) {
      while($row = mysql_fetch_assoc ( $onlinegucken )) {
      $username = username($row[user_id]);
      echo $username . ', ';
      }
   } else {
      echo "<i>Kein Benutzer online</i>";
   }


Was mache ich falsch?
=Max=
Mitglied
 
Beiträge: 404
Registriert: 14.01.2007


Zurück zu PHP

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast