Anzeige

Daten nach ein Bestimmte lebensdaur automatisch gelöscht

#1
Hallo Leute,

ich möchte die Daten nach einem Bestimmten Lebensdauer aus der Tabelle (variants) löschen ich habe dafür den Datensatz ts genannt und als timestamp definiert so sieht das aus,ich weise darauf hin, jede variant hat eine eindeutige id.

ts timestamp
on update CURRENT_TIMESTAMP Nein CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

ich habe das script so implementiert wie unter steht, leider klappt es nicht nach 2 Minuten (120 Sekunden) die daten zu löschen.
PHP:
<?php
require_once __DIR__ . '/connection.php';

$variants_remove='SELECT * FROM variants';

$req = $dbConnect->query($variants_remove);



while ($remove = $req->fetch(PDO::FETCH_ASSOC))
{
    $datum = $remove['ts'];
    $aktuelleDatum = time();
    $differenz = $datum - $erstellungsDatum;
    $lebensdauerInSekunden = 120; 
    if ($differenz > $lebensdauerInSekunden)
    {
    $id = $remove['id'];
    mysql_query('DELETE FROM variants WHERE id='$id'');
    }
}

?>
kann jemandem mir helfen.
Danke im Voraus.
http://localhost/phpmyadmin/tbl_structure.php?db=kantteile&table=variants&token=61730fcaa52ea40a3c09a451d2204abe&goto=tbl_structure.php&back=tbl_structure.php&field=ts&change_column=1
 
#3
Die Zeile $differenz = $datum - $erstellungsDatum; ist falsch. Es müsste $differenz = $aktuellesDatum - $datum; sein, denn $erstellungsDatum hast Du nirgends befüllt.
ich habe geändert, leider klappt es nicht, ich habe die folgende Daten heute um 08:22:04 und 08:23:23 erzeugt, es sollte eigentlich von meiner Tabelle gelöscht werden

INSERT INTO `variants` ( `a`, `b`, `c`, `d`, `e`, `alpha`, `beta`, `ts`) VALUES
( 123, 120, 56, 500, 448, 900, 789, '2016-09-19 08:22:04'),
( 23, 589, 56, 768, 800, 28, 789, '2016-09-19 08:23:23');


PHP:
<?php
require_once __DIR__ . '/connection.php';
$variants_remove='SELECT * FROM variants';
$req = $dbConnect->query($variants_remove);
while ($remove = $req->fetch(PDO::FETCH_ASSOC))
{
    $datum = $remove['ts'];
    $aktuelleDatum = time();
    $differenz = $aktuelleDatum - $datum;
    $lebensdauerInSekunden = 120;
    if ($differenz > $lebensdauerInSekunden)
    {
    $id = $remove['id'];
    mysql_query('DELETE FROM variants WHERE id='$id'');
    }
}
?>
 

Bratkartoffel

gebratene Kartoffel
Premium-User
#4
Hi,

bei deinem Script fallen mir gleich mehrere "Unschönheiten" auf:
- Du verwendest die deprecated mysql_* Funktionen. Diese wurden mit PHP 7 entfernt!
- Du führst einen SELECT, und für jeden Treffer einen einzelnen DELETE aus. Das ist äusserst unperformant und kann auch innerhalb einer SQL-Query erledigt werden. Ausserdem selektierst du Daten (*), welche du gar nicht brauchst.
- Du vermischt hier SQL-Timestamp und PHP-time(). time() liefert die Anzahl der Sekunden seit der Unix-Epoch, SQL-Timestamp ist allerdings (quasi) ein String

Schau dir mal die MySQL-Datefunctions an und überlege dir, wie du das Script oben als eine Query (DELETE FROM variants WHERE ts < xxxxxx) abfeuern kannst.

Grüsse,
BK

Als Hint kann ich dir hier die DATE_SUB-Funktion empfehlen.
 
Zuletzt bearbeitet:
#7
Hi,

bei deinem Script fallen mir gleich mehrere "Unschönheiten" auf:
- Du verwendest die deprecated mysql_* Funktionen. Diese wurden mit PHP 7 entfernt!
- Du führst einen SELECT, und für jeden Treffer einen einzelnen DELETE aus. Das ist äusserst unperformant und kann auch innerhalb einer SQL-Query erledigt werden. Ausserdem selektierst du Daten (*), welche du gar nicht brauchst.
- Du vermischt hier SQL-Timestamp und PHP-time(). time() liefert die Anzahl der Sekunden seit der Unix-Epoch, SQL-Timestamp ist allerdings (quasi) ein String

Schau dir mal die MySQL-Datefunctions an und überlege dir, wie du das Script oben als eine Query (DELETE FROM variants WHERE ts < xxxxxx) abfeuern kannst.

Grüsse,
BK

Als Hint kann ich dir hier die DATE_SUB-Funktion empfehlen.
was mache ich denn falsch hier ?

PHP:
<?php
require_once __DIR__ . '/connection.php';

$datum = date('Y-m-d', $daten['ts']);
$variants_remove='DELETE FROM variants  WHERE "$datum" < DATE_SUB(CURRENT_DATE,INTERVAL 2 MINUTE)';
$req = $dbConnect->query($variants_remove);
$daten = $req->fetch(PDO::FETCH_ASSOC);
?>
 

Bratkartoffel

gebratene Kartoffel
Premium-User
#9
Hallo Henrigo007,

in deinem obigen Code verweist du auf $daten['ts'], welches aber anscheinend nirgends definiert wird.
Dein SQL ist schon fast richtig:
SQL:
DELETE FROM variants  WHERE ts < DATE_SUB(NOW(), INTERVAL 2 MINUTE)
Ich weiss nicht, ob deine "query"-Methode auf deiner Connection das macht, was ich vermute (kann die auch UPDATEs?), aber das
$req->fetch(PDO::FETCH_ASSOC) ist definitiv falsch. Was erwartest du von einem DELETE?

Folgende Seite beschreibt, wie du mit verschiedenen Methoden ein DELETE Statement abschicken kannst:
http://www.w3schools.com/php/php_mysql_delete.asp

Grüsse,
BK
 
#10
Hallo Henrigo007,

in deinem obigen Code verweist du auf $daten['ts'], welches aber anscheinend nirgends definiert wird.
Dein SQL ist schon fast richtig:
SQL:
DELETE FROM variants  WHERE ts < DATE_SUB(NOW(), INTERVAL 2 MINUTE)
Ich weiss nicht, ob deine "query"-Methode auf deiner Connection das macht, was ich vermute (kann die auch UPDATEs?), aber das
$req->fetch(PDO::FETCH_ASSOC) ist definitiv falsch. Was erwartest du von einem DELETE?

Folgende Seite beschreibt, wie du mit verschiedenen Methoden ein DELETE Statement abschicken kannst:
http://www.w3schools.com/php/php_mysql_delete.asp

Grüsse,
BK
auch so klappt es leider nicht

PHP:
<?php
require_once __DIR__ . '/connection.php';

$daten = $_POST['ts'];

$datum = date('Y-m-d', $daten);
$variants_remove='DELETE FROM variants  WHERE "$datum" < DATE_SUB(CURRENT_DATE,INTERVAL 2 MINUTE)';
$req = $dbConnect->query($variants_remove);
$daten = $req->fetch(PDO::FETCH_ASSOC);
?>
 

Bratkartoffel

gebratene Kartoffel
Premium-User
#11
Hi,

bitte lies dir meinen Post nochmal durch, schau dir mein SQL an und gleiche das mit deiner Problembeschreibung ab.
Wo kommt jetzt das $_POST['ts'] her?
Warum ist in dem SQL das $datum von "" umschlossen? Warum gibt das einen Syntaxfehler?
Warum willst du den Timestamp unbedingt von aussen reingeben?
Was macht deine $dbConnect->query()?
Warum verwendest du CURRENT_DATE? (Als Konstante, nicht als Funktion?) Warum ist das für dein Problem das falsche?
Warum postest du nur "Es geht nicht" und keine MySQL-Fehlermeldungen? (error, errno)

Grüsse,
BK
 
Zuletzt bearbeitet:

Bratkartoffel

gebratene Kartoffel
Premium-User
#13
Hi,

die Fehlermeldungen landen nicht im Mysql-Log, sondern können über deine Connection abgeholt werden:
http://jason.pureconcepts.net/2013/04/common-debugging-php-mysql/
http://www.peterkropff.de/site/php/mysqli_fehler.htm
http://stackoverflow.com/a/15275823/1164913

Bitte lasse dir nicht alle Informationen aus der Nase ziehen. Solang du nicht meine Posts durchgehst und (alle) meine Fragen beantwortest werde ich hier nichts mehr schreiben. Ich habe weder Zeit, noch Lust weiterhin in meiner Glaskugel nach deinem Fehler zu suchen.

Grüsse,
BK
 
#14
Hi,

die Fehlermeldungen landen nicht im Mysql-Log, sondern können über deine Connection abgeholt werden:
http://jason.pureconcepts.net/2013/04/common-debugging-php-mysql/
http://www.peterkropff.de/site/php/mysqli_fehler.htm
http://stackoverflow.com/a/15275823/1164913

Bitte lasse dir nicht alle Informationen aus der Nase ziehen. Solang du nicht meine Posts durchgehst und (alle) meine Fragen beantwortest werde ich hier nichts mehr schreiben. Ich habe weder Zeit, noch Lust weiterhin in meiner Glaskugel nach deinem Fehler zu suchen.

Grüsse,
BK
Sorry, ich bin sehr gut an meiner Datenbank verbunden, Ich bin zwar neuer in Php aber ich glaube das ist was alle hier können.
Sonst vielen Dank für deine Mühe
 
Anzeige

Neue Beiträge

Anzeige