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 |