php: SQL Eintrag automatisch löschen

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Für jede Aktion in der Datenbank benötigt man einen Auslöser. Normalerweise ist dieser Auslöser das Starten einer Prozedur. Es gibt so etwas wie Trigger, die man für sowas benutzen kann, habe aber keine Erfahrung damit. Ich nehme als Auslöser immer die Benutzer. Entweder beim Starten oder Beenden der Session wird eine Prozedur aufgerufen, die z.B. wie in Deinem Fall Sätze mit abgelaufener Uhrzeit löscht. So eine Bereinigungsprozedur ist dann ein recht einfacher SQL-Aufruf. Problematisch wäre das nur, wenn die Löschung exakt zum angegebenen Zeitpunkt erfolgen müsste. Ich habe z.B. bei mir eine Zählung, die immer zum Jahresbeginn erfolgen muss. Diese wird ausgelöst von dem Bearbeiter, der im neuen Jahr als Erster die Datenbank aufruft.

Das Arbeiten mit der Datenbank ist an sich nicht schwierig. Man muss nur logisch vorgehen. Man muss sich vorstellen können, wie eine Aufgabe gelöst werden muss und muss dann versuchen, mit den Mitteln der Datenbank das umsetzen. Dazu sollte man die gängigen SQL-Anweisungen kennen, die übrigen in der Dokumentation nachlesen oder irgendwo erfragen können. Der häufigste Fehler (im Extrenfall) ist die Vorstellung, man könne die Daten wie Müll in die Datenbank kippen und die Datenbank würde damit was vernünftiges anfangen. Die Datenbank macht aber grundsätzlich nichts ohne eine klare Anweisung. Jeder Schritt muss minuziös festgelegt werden. Ein weiterer Fehler ist, dass man bei der Konzipierung die spätere Verwendung der Datenbank nicht oder zu wenig berücksichtigt. Das scheitert mitunter auch daran, dass man gar nicht alle künftigen Anforderungen kennt. Erst wenn die Datenbank steht, tauchen die Anforderungen so nach und nach auf. Ich habe das Problem so gelöst, dass ich mir Hilfsmittel geschafft habe, eine Datenbankänderung innerhalb einer halben Stunde durchziehen zu können. Das mache ich seit 20 Jahren so und habe einen Kunden mit mitlerweile 55 Datenbanktabellen in einer anspruchsvollen Arbeitsumgebung. Auf Anhieb könnte man so eine Anwendung gar nicht konzipieren.

Nun zu Deinem Problem: Ich würde im Datensatz eine Spalte "Verfallszeit" vorsehen, wo gleich die Lebensdauer dieses Satzes bei der Erstellung festgelegt wird. Dann ist es kein Problem, egal wie, die abgelaufenen Sätze zu löschen. Du kannst damit sogar verschiedene Satzarten mit unterschiedlicher Verfallszeit bedienen, die dann zentral gelöscht werden.

Also dann praktisch sowas wie

INSERT INTO daten (id, name, erstelldatum, verfallsdatum) VALUES(null, "name", now(), now() + INTERVAL 5 Minute);

und dann später:

DELETE FROM daten
WHERE verfallsdatum < now();

muss ich sagen, ist ne sehr extravagante Lösung, aber vermutlich höchst zweckmäßig *g.

1
@Alextoexplain

Beim Testen und Fehlersuchen sind die sog. eleganten Lösungen oft nachteilig, weil man Dinge einem übergeordneten System anvertraut, wo man deren Ablauf nicht immer verfolgen kann. Ich versuche daher, mit einfachen aber überschaubaren Formulierungen auszukommen. Ich benutze auch keinen JOIN, sondern stelle die Verknüpfung per WHERE-Bedinungen her. Ob das generell eine gute Lösung ist, kann ich nicht sagen, für mich bedeutet das in gerade komplizierten Verknüpfungen eine größere Transparenz.

Beim Programmieren z.B. habe ich ein ausgezeichnetes Testsystem. Wenn ich eine aus mehreren einzelnen Bedingungen bestehende Prüfung als elegante Formulierung zu einem einzigen IF zusammenfasse, dann sehe ich ich beim Test nur, ob die Gesamtbedingung erfüllt ist oder nicht. Wenn ich die komplexe Bedingung in einzelne IFs auflöse, kann ich sehen, wie das Gesamtergebnis zustandegekommen ist.

Letztlich muss das jeder für sich entscheiden.

0
@wotan38

Wow, vielen Dank für diese tolle und ausführliche Antwort!

Jetzt verstehe ich langsam auch, worauf ich achten muss - vielen Dank!

Ich habe das jetzt vorerst mal so gelöst, dass cronjob.de eine Seite aufruft, auf der ein Script ist, welches den Inhalt der Tabelle löscht. Das ist eigentlich absolut ausreichend für mich.

Auch vielen Dank für diese obigen Scriptbeispiele!

Beste Grüße, Hummel

0

Hello there,

auch hier, wie ich dir schon per Mail ausgeführt habe, es macht absolut Null Sinn auf einer "Seite" ein PHP-Skript laufen zu lassen, das das ausführt.

Cronjobs sind genau was du brauchst, in Form eines MySQL-Events - eine Funktionalität die seit kurzem in MySQL zur Verfügung steht. Wenn dus nicht hinbekommst, kann ich dir helfen:

CREATE EVENT cleartable
    ON SCHEDULE EVERY 1 HOUR

DO 
   DELETE FROM tabelle WHERE Uhrzeit < Adddate(now(), INTERVAL -5 Minute);

Das funktioniert vermutlich aber nicht so richtig, wegen deiner Aufspaltung der Uhrzeit und des Datums. Führ die beiden mal zusammen und du hast genau was du brauchst.

MfG

Alex

Hallo Alex,

ich habe das jetzt wie folgt gelöst:

Auf cronjob.de habe ich einen Account erstellt und lasse eine bestimmte Seite auf meinem Server aufrufen. Auf dieser Seite ist dann ein Script, welches die Einträge löscht, ist also genau das was ich wollte.

Mit Cronjobs wollte ich nie etwas zutun haben, weil man dafür -soweit ich weiß- einen Shell Zugang braucht und wieder etwas Neues lernen muss... Diese Alternative von cronjob.de ist wirklich klasse!

Grüße, Hummel

1

Ist es Zufall das bei den 2. Eintrag "beate" da steht (siehe mein Name) ? :x

Warum möchtest du kein Cronjob nutzen? Ich nutze auch Cronjob auf dem Mainserver und bin eigentlich zufrieden. Es gibt alternativen aber um die zu finden brauch ich ewig^^

Hallo Beate,

das nächste Mal nehme ich Herbert ;-)

Ich habe noch nie mit Cronjobs gearbeitet und weiß auch nicht richtig, wie sie funktionieren...

Gibt es da nicht eine einfachere Methode? Evtl. ein Script auf einer Seite, welche diesen Eintrag löscht?

Grüße, Jonas

0
@hummelxy

Außerdem...du weißt doch auch bei den meisten anderen Sachen nicht wie sie funktionieren, also machs doch mit unserer Anleitung gleich richtig *grins ;D

1