WebWork Magazin - Webseiten erstellen lassen, Online Medien, html

Webhoster, Webhosting Provider und Domain registrieren

Home | Registrieren | Einloggen | Suchen | Aktuelles | GSL-Webservice | Suleitec Webhosting
Reparatur-Forum | Elektro forum | Ersatzteilshop Haushalt und Elektronik


Homepage und Webhosting-Forum

Scripte und Programme für PHP, MYSQL. Diskussionen zur Programmierung im Web. Fragen zu CMS, Blogsoftware, Shops, Newsletter und vielen weiteren Scripten.


Forum » PHP & MySQL » Datensatz nach 3 Tagen automatisch löschen. » Antworten
Benutzername:
Passwort: Passwort vergessen?
Inhalt der Nachricht: Fett | Kursiv | Unterstrichen | Link | Bild | Smiley | Zitat | Zentriert | Quellcode| Kleiner Text
Optionen: Emailbenachrichtigung bei Antworten
 

Datensatz nach 3 Tagen automatisch löschen.
von Lexia
Tausend Dank, hat alles super geklappt!
von raiserle
soll nicht in spamm ausarten... aber

nach dem prinzip wie der code dort steht ist natürlich absolut inakzeptabel, wegen den haufen selects bzw. update´s

das kann man wirklich nur als cronjob machen wobei ja nen ... Update delete from <tabelle> where datum_als_timestamp <= mein_timestamp

deswegen, überlegt vielleicht nochmal wirklich das script etwas umzubauen... entweder auf den unixtimestamp oder auf die von mysql angebotene date funktion
wobei mysql datefunktion die beste wahl wäre, wenn man mit dem datum arbeiten will.
von languitar
timestamp ist natürlich schöner, aber so sollte es auch gehen, wenn ich das Problem richtig verstanden hab.
von raiserle
sorry languitar, dann habe ich das von dir überlesen, oder eher nicht so verstanden.

aber dann weis Lexia ja immer noch nicht wie er das machen sollte. wobei ja dabei wieder
richtig ist, SELECT
1: 
2: 
3: 
4: 
5: 
6: 
7: 
8: 
9: 
10: 
11: 
12:
<?php
$del_tage=30;    // tage nach denen gelöscht werden soll
$datum_heute=mktime(0,0,0,date('n',time()),date('j',time()),date('Y',time()));
$result=mysql_query("SELECT datum,id FROM <tabelle>Order BY id");
while($row=mysql_fetch_assoc($result)){
    $datum_sql=explode(".",$row['datum']);
    $datum_sql=mktime(0,0,0,$datum_sql[1],$datum_sql[0],$datum_sql[2]);    // datumsformat 11.09.2006
    if($datum_sql<=($datum_heute-(86400*$del_tage))){
        mysql_query("DELETE FROM <tabelle> WHERE id='".$row['id']."'");
    }
}
?>


so in etwa sollte es aussehn, oder meintest du es noch etwas anders

wobei ich für das einmalige wäre, eine neue spalte in die sql wo der timestamp drin steht.
und dann einmal nur nen script drüber laufen lassen, der aus dem vorhandenen datums zeitformat nen timestamp setzt.
von languitar
Du kannst doch auch problemlos immer per PHP das Datumsformat da temporär für die Berechnung in eine timestamp umwandeln. Wie ich halt schon sagte. Nicht so schön, aber damit kann man dann rechnen und es funktioniert.
von raiserle
fakt nr.1 : wenn du das dort als varchar in dem format wie 2006-09-11, oder 11.09.2006 speicherst, wirds eher schwer werden.
man möge mich berichtigen, aber nen alphanumerischer vergleich von sowas ist sehr unsicher und kann zu unerwarteten fehler, löschen führen.
fakt nr.2 : wenn du die mysql-date funtion benutzt, musst du auch in dem delete mit der selbigen funktion rechnen.
fakt nr.3 : wenn das feld in der mysql zwar varchar ist, du dort aber mit einem timestamp speicherst, sollte das was hier schon geschrieben stand, problemlos ansetzen können.
fakt nr.4 : man sollte sich schon im vorfeld gedanken machen, welche spalten, mit welcher eigenschaft man benötigt.

das einzige was mir jetzt dazu einfallen würde, noch eine spalte in die datenbank mit aufzunehmen und über ein script anhand von deinem vorhandnen datum ein timestamp in die spalte zu schreiben.
von Lexia
raiserle schrieb am 11.09.2006 18:55
warum die frage, was verstehst du nicht. steht doch oben schon alles richtig da.
vorrausgesetzt, du speicherst als timestamp.
du brauchst dort kein mktime(); und richtig hast dus selber erkannt, du musst vorher kein select aus der db machen.


Siehe meinen Post davor:
Und wenn das Datum einfach als Varchar gespeichert wurde?
Also 06.09.2006 ?

Das muss ich ja erst umwandeln in einen timestamp und ich bekomme bei der Darstellung so wie sie jetzt da ist eine Fehlermeldung (irgendwas mit der Variable Oldtime, ich kopier die Fehlermeldung morgen mal hier rein).

Also, ich mach dann erstmal die Abfrage um überhaupt auf den Wert zugreifen zu können den ich in einen Timestamp umwandeln will, richtig?
$abfrage = "SELECT datum FROM blackboard";
Dann muss er umgewandelt werden... ist der Wert datum automatisch in der Variable $datum gespeichert nach dem Select? Wenn nicht, wie kriege ich den da rein? Fragen über Fragen...

Vielen Dank schonmal für deine Hilfe!
von raiserle
hmm
warum die frage, was verstehst du nicht. steht doch oben schon alles richtig da.
vorrausgesetzt, du speicherst als timestamp.

du brauchst dort kein mktime(); und richtig hast dus selber erkannt, du musst vorher kein select aus der db machen.
time() liefert doch den aktuellen timestamp. davon kannste ja nun deine differenz abziehen
86400*tage

mktime() macht nur sinn, wenn du genau auf beginn des heutigen tages hinaus willst.

$heute_zur_geisterstunde=mktime(0,0,0,date('n',time()),date('j',time()),date('Y',time()));
von Lexia
Sorry aber ich glaub da bin ich echt zu blöd für...

also sagen wir mal ich hab hier erstmal die verbindung:

$link = mysql_connect( $dbhost, $dbuser, $dbpw );
if (! $link)
die("Keine Verbindung zum MySQL-Server");
mysql_select_db($dbname)
or die ("Konnte Datenbank \"$dbname\" nicht öffnen:".
mysql_error() );


ok, klappt bis dahin auch ganz wunderbar.
dann will ich den wert "datum" auslesen (oder theoretisch muss ich das ja gar nicht um den zu ändern oder?)
$abfrage = "SELECT datum FROM blackboard";
$ergebnis = mysql_query($abfrage,$link);

So und von jetzt an weiss ich gar nichts mehr... hab leider echt wenig Ahnung von php... wäre super, wenn mir jemand helfen könnte:
$datumoriginal = mktime(0,0,0,32,12,2000);
$oldtime = $datumoriginal() - (90 * 86400);
$sql = "DELETE FROM $table WHERE datum < '$oldtime'";
mysql_query($sql,$link);

Viele Grüße,
Lexia
von languitar
Kannst du dir das ganze erst mit mktime in eine timestamp umwandeln und dann die üblichen Rechnungen drauf anwenden.
von Lexia
Und wenn das Datum einfach als Varchar gespeichert wurde?
Also 06.09.2006 ?
von Talk-Server
Ist doch voll easy :smile

Er arbeitet mit dem Format
JJJJMMTTHHMMSS

Das heißt er muss das noch passend umwandeln

$datum = date("YmdHis", $oldatum);
und dann die überprüfung mit SQL


---
Mfg Neo Track

Visit: Talk-Server.com
von subjective
Ich habe natürlich auch die falsche Funktion erwischt. Korrekt wäre time() um den aktueen Timestamp zu erhalten.

Das was du da zeigst ist das anderes Datumsformat. Wir meinen den Unix-Timstamp. Das sind die Sekunden seit dem 1.1.1970. Mit diesem Wert läßt sich am einfachsten rechnen.

Thomas


---
Weaverslave
von michael
du guckst ob der timestamp+die anzahl sekunden die ein monat hat (60x60x24x30) kleiner ist als die aktuelle timestamp.
von KeyLF
Naja das klingt ja alles ganz logisch aber wenn ich einen Timestamp erstellenlasse so sieht der z.B. so aus: 20020214150349

und wie kommen den dann die 84000 zustande, vielleicht hab ich nen denkfehler, naja vielleicht kann mir dabei noch jemand weiterhelfen!?
von michael
ach fuck- das meinte ich doch... arrg - naja mathe war noch nie meine stärke
von soeren

Michael schrieb am 2002-02-13 18:47 :
Ein Monat hat 86400 Sekunden (-> Timestamp besteht auch nur aus sekunden)

Die Timestamp sollte ein Integer-Wert sein.


:confused
der tag hat 86400 sekunden
deshalb steht ja da 30*86400
mathe kann aber auch schwer sein.



---
mfg
Sören
von michael
Ein Monat hat 86400 Sekunden (-> Timestamp besteht auch nur aus sekunden)

Die Timestamp sollte ein Integer-Wert sein.
von KeyLF
Nur fürs Verständnis, was bedeutet die 86400 und welches Format muß der TimeStamp haben?

KeyLF
von subjective
Jep also in einem Feld die aktuelle Zeit speichern und dann:

...
$oldtime = date() - (30 * 86400);
$sql = "DELETE FROM tabelle WHERE time < '$oldtime'";
...

Am besten kommt es wenn das Teil über einen Cron-Job läuft. Ansonsten wäre es beim Anzeigen auch möglich, kostet aber mehr Performance.

Thomas


---
Weaverslave
von michael
mit einem cron-job der regelmäßig ausgeführt wird und die beiträge auf aktualität prüft... oder du setzt ne abfrage ob ein beitrag ein gewisses alter erreicht hat in eine funktion die häufig aufgerufen wird.

bei beidem wird einfach nur geprüft ob die timestamp die der beitrag hat (die der beitrag haben dann muss ) älter als 30 tage ist.
von KeyLF
Hallo mal wieder.

Wie kann ich in einer SQL Datenbank einen Datensatz nach 30 Tagen automatisch löschen lassen, sodas dieser nicht mehr angezeigt wird. Z.B. in einem GB.

MFG

KeyLF

Nach oben