Daten jede X Stunden löschen

pl_90

Angesehenes Mitglied
Hey..
Ich möchte Daten aus der MySQL jede X Stunden löschen dabei soll das Script erst checken ob ein Datensatz schon X Stunden "lebt"
biggrin.gif
... Ich habe bis jetzt so etwas, aber irgendwie funtioniert das nicht, es zeigt mir "OK" aber es wird nichts gelöscht. Es sollte durch time() geschehen, denn das gilt für einen Bestätigungscode der nach X Stunden ablaufen soll.
wink.gif


Mein Code ist:

CODE
$cron_zeit = 24;
$sekunden = (($cron_zeit-1)*60*60);
$zeitnow = time();

$dbabfr = mysql_query("SELECT * FROM `TABELLE`");


while ($dbrow = mysql_fetch_array($dbabfr)) {

$minus = floor($zeitnow-$dbrow['TIME']);
$where = ($sekunden < $minus);

$delete = mysql_query("DELETE FROM `TABELLE` WHERE TIME = ".$where) or die("Fehler!");

if ($delete) {
echo "OK, ".date("d.m.Y, H:i:s")."<br>";
}

}



Ist das überhaupt richtig? kann mir jemand bitte helfen. Danke schön..
smile.gif
 
CODE
$xStunden=5;//alles was älter als 5 Stunden ist
mysql_query("DELETE FROM `TABELLE` WHERE TIME < ".time()-$xStunden*3600);



Ich würde aber eher mit NOW() in sql arbeiten, also:

CODE
//einfügen
mysql_query("Insert INTO table (Date) VALUES (NOW())");
//Date ist dabei z. B. vom Typ Datetime

//löschen
mysql_query("Delete FROM table WHERE Date<DATE_SUB(NOW(),INTERVAL 5 HOUR)");




Severin

edit: kleine Anmerkung zu deinem Code

CODE $where = ($sekunden < $minus);

das liefert entweder true oder false zurück

dann wird
CODE = ".$where
nie funktionieren
du meinst wahrscheinlich:

CODE if($sekunden < $minus)
{
$delete = mysql_query("DELETE FROM `TABELLE` WHERE TIME = ".$dbrow['TIME']) or die("Fehler!");
...


 
QUOTE WHERE TIME = ".$where


ohne deinen code jetzt im detail nachzuvollziehen, sagt mir mein gefühl das das mit dem "=" nicht richtig sein kann. du willst doch ein "<" ?!

machs einfach:


CODE
DELETE FROM TABELLE WHERE TIME < DATE_ADD(NOW(), INTERVAL -X HOUR);



Für X trägst du die gewünschten Stunden ein.

http://dev.mysql.com/doc/refman/5.1/de/dat...-functions.html
 
QUOTE (Severin Fink @ So 12.08.2007, 14:34)
CODE
$xStunden=5;//alles was älter als 5 Stunden ist
mysql_query("DELETE FROM `TABELLE` WHERE TIME < ".time()-$xStunden*3600);



Ich würde aber eher mit NOW() in sql arbeiten, also:
[...]

Ich nicht, ich möchte i.d.R. die Last vom DB-Server nehmen und so soll er sich nicht mit unnötigen Funktionen abkämpfen, sondern nach Möglichkeit nur stumpf nach Datensätze suchen. Drum würde ich auch nur in sehr wenigen Ausnahmefällen die MD5() Funktion von MySQL nutzen.
Außerdem gibt es teilweise Problembestellungen, die sich besser mit einer Programmiersprache überbrücken lassen als mit einer Datenbankabfrage, welche teilweise erst beim Umzug erhebliche Probleme bereiten können.
 
Achso ja...
Wie kann man es jede X Stunden den ^^ Befehl ohne Cronjob ausführen lassen?
 
QUOTE (pl_90 @ So 12.08.2007, 16:37)hm? was hat jetzt md5 damit zu tun? verstehe ich nicht ganz was du meinst..

Last auf den MySQL-Server für die Erstellung des MD5-Hashes:

CODE $sql = 'select * from userid = ' . intval($userid) . ' AND password = MD5(' . mysql_real_escape_string($password) . ')';



Gleiche Funkionalität nur ist hier die Last auf den Webserver:

CODE $sql = 'select * from userid = ' . intval($userid) . ' AND password = ' . md5($password);



Gleiches gilt bei time() und NOW().



Nur als schlechter Workaround, so dass es nicht automatisch zu der entsprechenden Zeit gestartet wird: einfach als Bild aufrufen (bspw. von einer statischen HTML-Seite) oder bei Seitenaufruf mitausführen lassen (bei einen dynamischen Seite).
 
Achso.. Danke
smile.gif

Aber das mit dem Bild will ich irgendwie nicht machen, den wenn eine Seite oft aufgerufen wird, dann das Script auch so oft die Tabelle und das ist noch schlimmeres Last als mit Now() oder so... Gibt es nicht eine andere Methode?

Und wie würdest du das ganze machen, damit der MySQL nicht so ausgelastet wird...?
 
Cronjob oder notfalls wie im Workaround auf eine lokale Datenbankdatei (SQLite, DBM oder DBA) zugreifen, um zu ermitteln, wann der letzte Aufruf des Scriptes war, so wird bei einen Betreib mit mehreren Server eher der Anwendungsserver belastet statt der DB-Server, und das komplette Script nur ausgeführt, wenn die Zeit dazu gekommen ist.

Ich habe aber nicht diese Probleme, dafür habe ich meinen eigenen Server.
wink.gif
 
QUOTE (pl_90 @ So 12.08.2007, 23:10) Ich meinte das eigentlich mit dem NOW() und so.. hehe...
wink.gif


Dann weiß ich nicht was Du von mir willst, solange Du Dich in den Punkt nicht klar ausdrückst.
 
Hi.. Ich weiß, ich hab schon ein Cronjob...
wink.gif
Ich frag das nur so: Ob es man jede X Stunden irgendwie ausführen könnte, zB durch ein Serverprozess oder so..
wink.gif
 
Zurück
Oben