Timestamp wird nicht eingetragen

ScorK

Grünschnabel
Hallo :)
Ich bastel momentan an einer User-Online-Anzeige und es funktioniert auch fast. Es zeigt an, welche User Online sind und welche net. Nur funktioniert das Auto-Ausloggen nicht.

Ich habe eine Spalte "LastAction" in der Datenbank vom Typ "Timestamp". Diese wird nur leider nicht aktualisiert. Es wird immer der Wert "000000000000" eingetragen.
Hier mein Script:

PHP:
<?php
 // ... Uhrzeit und Dauer des "Online-Limits" bestimmen
 $zeit2 = time();
 $onlinedauer = 5*60;
 $online = $zeit2 - $onlinedauer;

 // ... Verbindung zur MySQL-Datenbank herstellen ... \\
 mysql_connect($host,$user,$pw) OR die(mysql_error());
 mysql_select_db($db) or die(mysql_error());

 // ... Wenn der User eingeloggt ist -> LastAction updaten ... \\
 if(isset($_SESSION['nick'])) {
  $nick = $_SESSION['nick'];
  $update_action = "UPDATE user SET LastAction = '$zeit2', Status = 'Online' WHERE Nick = '$nick' ";
  $update2_action = mysql_query($update_action) or die (mysql_error());
 }

 // ... Datenbank Abfrage ... \\
 $query = "SELECT * FROM user";
 $result = mysql_query($query) OR die(mysql_error());

 // ... Für jeden User ... \\
 while($row = mysql_fetch_assoc($result)) {
  $nick2 = $row['Nick'];
  $laction = $row['LastAction'];

  // ... Wenn die Letzte Aktion länger her ist, als das Limit erlaubt -> User Offline setzen ... \\
  if($laction >= $online) {
   $update = "UPDATE user SET Status = 'Offline' WHERE Nick = '$nick2' ";
   $update2 = mysql_query($update) or die (mysql_error());
  }
 }
?>

Ich finde den Fehler leider nicht. Vielleicht habe ich auch grundlegende Fehler gemacht.

Vielen Dank für eure Hilfe.
 
Habe das Problem gefunden und gelöst =) ^^
Irgendwie kam er mit der Abfrage nicht klar ^^ Habe zwei ' entfernt =)
Da er dann noch den Status falsch gemacht hat, habe ich ne kleine Abfang Variable eingebaut ^^ Ist nicht die eleganteste Lösung aber es funktioniert wunderbar :)

Hier der neue Quellcode für alle die auch ein solches Script wollen ^^

PHP:
<?php
 // ... Uhrzeit und Dauer des "Online-Limits" bestimmen
 $zeit2 = time();
 $onlinedauer = 5*60*2;
 $online = $zeit2 - $onlinedauer;
 $setted = 0;

 // ... Verbindung zur MySQL-Datenbank herstellen ... \\
 mysql_connect($host,$user,$pw) OR die(mysql_error());
 mysql_select_db($db) or die(mysql_error());

 // ... Wenn der User eingeloggt ist -> LastAction updaten ... \\
 if(isset($_SESSION['nick'])) {
  $nick = $_SESSION['nick'];
  $update_action = "UPDATE user SET LastAction = $zeit2, Status = 'Online' WHERE Nick = '$nick' ";
  $update2_action = mysql_query($update_action) or die (mysql_error());
  $setted = 1;
 }

 if($setted == 0) {
  // ... Datenbank Abfrage ... \\
  $query = "SELECT * FROM user";
  $result = mysql_query($query) OR die(mysql_error());

  // ... Für jeden User ... \\
  while($row = mysql_fetch_assoc($result)) {
   $nickname = $row['Nick'];
   $laction = $row['LastAction'];

   // ... Wenn die Letzte Aktion länger her ist, als das Limit erlaubt -> User Offline setzen ... \\
   if($laction >= $online) {
    $update = "UPDATE user SET Status = 'Offline' WHERE Nick = '$nickname' ";
    $update2 = mysql_query($update) or die (mysql_error());
   }
  }
 }
?>
 
Ich habe ein neues Problem gefunden ^^ Die Anzeige stimmt nicht wirklich. Wäre also nett, wenn da ma eben jemand drüber gucken könnte =)
 
PHP:
while($row = mysql_fetch_assoc($result)) {
   $nickname = $row['Nick'];
   $laction = $row['LastAction'];

   // ... Wenn die Letzte Aktion länger her ist, als das Limit erlaubt -> User Offline setzen ... \\
   if($laction >= $online) {
    $update = "UPDATE user SET Status = 'Offline' WHERE Nick = '$nickname' ";
    $update2 = mysql_query($update) or die (mysql_error());
   }
  }
 }
Das ist ja total blöder Code ^^ Du kannst das auch gleich mit einem einzigen SQL-Query lösen:
PHP:
$sql = "UPDATE user SET status = 'Offline' WHERE status = 'Online' AND lastaction > online ".$online;
Das spart dir viel Zeit bei jedem Seitenaufruf
 
Zuletzt bearbeitet:
Was für eine Anzeige meinst du genau.
Dann schaue ich sehr gerne darüber.

Tobee

Also er setzt den Status falsch vom User. Habe eine Ausgabe gebaut (habe ich grad nicht hier, bin net daheim) wo mit ner while-Schleife überprüft wird, bei welchem User der Status online gesetzt ist und gibt diese aus. Nur gibt er bei dem obigen Script ein Fehler das der Status falsch gesetzt ist. Er schreibt den Status ja schon falsch in die Datenbank. Weiß jemand, wo der Fehler stecken könnte?

PHP:
while($row = mysql_fetch_assoc($result)) {
   $nickname = $row['Nick'];
   $laction = $row['LastAction'];

   // ... Wenn die Letzte Aktion länger her ist, als das Limit erlaubt -> User Offline setzen ... \\
   if($laction >= $online) {
    $update = "UPDATE user SET Status = 'Offline' WHERE Nick = '$nickname' ";
    $update2 = mysql_query($update) or die (mysql_error());
   }
  }
 }
Das ist ja total blöder Code ^^ Du kannst das auch gleich mit einem einzigen SQL-Query lösen:
PHP:
$sql = "UPDATE user SET status = 'Offline' WHERE status = 'Online' AND lastaction > online ".$online;
Das spart dir viel Zeit bei jedem Seitenaufruf

Hatte das ganze in Bausteinen zusammen gebaut und dann immer drum herum gebastelt und da kam halt das bei raus =) Werde das aber ändern. Vielen dank für den Hinweis =)
 
Also er setzt den Status falsch vom User. Habe eine Ausgabe gebaut (habe ich grad nicht hier, bin net daheim) wo mit ner while-Schleife überprüft wird, bei welchem User der Status online gesetzt ist und gibt diese aus.
Du liest jeden User einzeln aus?
Dann solltest du auch da folgendes machen:
SQL:
SELECT username FROM user WHERE status = 'Online';
Geschickte Abfragen machen das Leben leichter ;)
 
Ich habe eine Spalte "LastAction" in der Datenbank vom Typ "Timestamp". Diese wird nur leider nicht aktualisiert. Es wird immer der Wert "000000000000" eingetragen.
Bei PHP und MySQL wird der Begriff Timestamp meist unterschiedlich interpretiert. Während bei PHP unter einem Timestamp die Anzahl der Sekunden seit Beginn der Unix-Epoche bis zu einem Zeitpunkt (also eine natürliche Zahl) verstanden wird, ist bei MySQL „TIMESTAMP“ ein eigener Datumsdatentyp mit unterschiedlichen Darstellungslänge (6, 8, 12 oder 14 Stellen).
Ein Unix-Zeitstempel kann also nicht einfach in einer TIMESTAMP-Datenspalte gespeichert werden ohne vorher formatiert zu werden.
 
Habs das Problem nun gelöst und es läuft alles so wie ich das will ^^
Ist zwar nicht die eleganteste Lösung usw aber ist mir momentan egal. Feintuning kommt später ^^. Habe jetzt einfach aus dem Timestamp Feld nen Int Feld gemacht und lasse den Wert aus $zeit2 eintragen. Nun funktionert es alles und ich bin happy :D
 
Zurück