Problem bei zeitabhängigem Table-Update

LN5

Mitglied
tach zusammen

auf meiner Homepage möchte ich mit diesem Code:

PHP:
	$tenmins = date("Y-m-d H:i:s", time() - 600);

  	mysql_query("UPDATE community SET online = 'Nein' WHERE action < '$tenmins'");

alle User auf Offline stellen, welche in den letzten 10 Minuten nichts mehr auf der Homepage gemacht haben. In der index.php-Datei, welche jedesmal aufgerufen wird, da die Seiten includet werden, wird bei jedem Neuladen die Spalte 'action' aktualisiert.

Nun ja, lange Rede kurzer Sinn: Wie muss die korrekte Query lauten, die mir die gennanten User (ich arbeite mit Sessions) auf Offline stellt in der DB? :confused:

Danke für die Hilfe..
 
Ich seh jetzt keinen Fehler in der Syntax aber könnte mir denken es liegt an deiner Speicherart.
Wenn du in der Datenbank nen String(Zeichenkette) hast der so aussieht wie dein Date kann es nicht funktionieren.
Wenn du sowieso mit date() arbeitest speicher in der DB doch einen Unix Timestamp der beleg auch nur 2 Byte.
 
Zuletzt bearbeitet:
ok, habe jetzt die spalte als timestamp definiert. Wie muss das update jetzt aussehen? keine Ahnung wie man 'nen aktuellen Timestamp macht? And what about the Query? Danke dir..
 
LN5 hat gesagt.:
ok, habe jetzt die spalte als timestamp definiert. Wie muss das update jetzt aussehen? keine Ahnung wie man 'nen aktuellen Timestamp macht? And what about the Query? Danke dir..


PHP:
$now=date("YmdHis");  :confused:

PHP:
$dif = date("YmdHis", time() - 600);

 mysql_query("UPDATE community SET online = 'Nein' WHERE action < '$dif'");

etwa so?
 
Ich hatte ebend ein ähnliches Problem , den Timestamp zu nehmen von MySQL ist nen bissel quatsch wenn man nen Datum / Zeit vergleichen will , weil der Wert um einiges über das Ziel hinausschiesst.

20.051.123.163.217 timestamp der MySQL DB (punkt nur mal um das zu zeigen)
1.231.283.981 <- normaler timestamp (nur 1.23 Milliarden geht noch bei int mit durch)

Da s heisst der MySQL Timestamp als Zahl sind so ~ 20 Billionen. Jedesmal wenn Du überprüfen möchtest ob der TS in der DB +- den aktuellen Timestamp +- 3600 abgelaufen ist würdest Du ein paar Probleme bekommen.

Also würde ich mir in der DB den Wert als DATETIME speichern , Und diesen dann zerlegen , ein paar Threads unter deinen ist das ja nun gemacht worden.

Diesen dann in mktime in einen Timestamp umwandeln und diese beiden vergleichen.

Hier mal der ausschnitt aus meiner IP Sperre die mit DATETIME arbeitet.

PHP:
<?php
   function delete_Old_Ip(){
   
     $abgelaufen = time()-60*60;
     
     for($i= 0; $i < $this->rows;$i++){
     
      // DatumZeit = "2005-11-23 11:43:21";    

       $DatumZeit = explode(" ", $this->ergeb[$i]['tsIP']);
       $Datum     = explode("-", $DatumZeit[0]);
       $Zeit      = explode(":", $DatumZeit[1]);
       
       $tsIP = mktime($Zeit[0],$Zeit[1],$Zeit[2],$Datum[1],$Datum[2],$Datum[0]);
       $id = $this->ergeb[$i]['ID'];
           
       if( ($tsIP - $abgelaufen < 0) ){

          mysql_query("UPDATE 
                             IP 
                       SET 
                             blockedIP='empty',
                             tsIP = NOW() 
                       WHERE 
                             ID = $id"); 
       }
     }
   }//Methode delete_Old_Ip schliessen
?>
 
Ich habe ja auch nicht gemeint er soll den Mysql Timestamp nehmen(erinnere mich nur dunkel).
Irgendwann wird er ja die zeit aktualisieren müssen.(denke ich mal)
Nun liefert time(); dir doch schon deinen Unix Timestap den speicherst du als Integer(2 Byte) in der Tabelle und dann sollte dein Vergleich schon funktionieren das date(); fällt dann auch noch weg.
 
ich habe das nun so gelöst und it works.

PHP:
      	  	$nein= mysql_query("SELECT * FROM community");
			$now=date("Y-m-d H:i:s");
			
		  $abgelaufen = time()-10*60;

			while ($row=mysql_fetch_array($nein))
			{
		   $datetime=$row["datetime"];
		   $id=$row["id"];
		   	$DatumZeit = explode(" ", $datetime);
       		$Datum     = explode("-", $DatumZeit[0]);
       		$Zeit      = explode(":", $DatumZeit[1]);
            $tsNein = mktime($Zeit[0],$Zeit[1],$Zeit[2],$Datum[1],$Datum[2],$Datum[0]);

		   	   if( ($tsNein - $abgelaufen < 0) ){

          mysql_query("UPDATE 
                             community 
                       SET 
                             online = 'Nein' 
                       WHERE 
                             id = '$id'"); 
       }

		   }
 
Ich will ja keine Kritik üben aber Sinn des Programmierens sollte nicht sein den Server mehr arbeiten zulassen als nötig.

Du hast es doch am Anfang garnicht so falsch gemacht.
Ich kann mir denken das du irgendwo beim Login oder bei Seitenaufruf "action" in der Tabelle setzt um festzustellen ob der User noch da ist.
Nimm da doch diese Zeile:
<?php
mysql_query
("UPDATE community SET action = time() WHERE id = '$id' "); //action muss den Typ Integer haben
?>

Dann bei deinen Prüfskript:
<?php
$tenmins
= time() - 600;
mysql_query("UPDATE community SET online = 'Nein' WHERE action < '$tenmins'");
?>

Das ist wesentlich kurzer und schont den Webserver.
 
Zuletzt bearbeitet:
PHP:
 mysql_query("UPDATE community SET action = time() WHERE nick = '$SESSION_User'");
$tenmins = time() - 600;
mysql_query("UPDATE community SET online = 'Nein' WHERE action < '$tenmins'");

so gemacht.. aber in der DB steht nun in der Spalte action einfach "2005".. :confused:
 
LN5 hat gesagt.:
PHP:
 mysql_query("UPDATE community SET action = time() WHERE nick = '$SESSION_User'");
$tenmins = time() - 600;
mysql_query("UPDATE community SET online = 'Nein' WHERE action < '$tenmins'");

so gemacht.. aber in der DB steht nun in der Spalte action einfach "2005".. :confused:


ach ja.. und als Spaltentyp habe ich int(20) gewählt.
 
Zurück