Loptr hat geschrieben:So eine spontane Idee von mir:
- neues DB Feld anlegen
- Datum in unix timestamp umrechnen und ins DB Feld schreiben (am besten beim INSERT gleich diesen verwenden
time() /
now())
Es gibt keinen Grund, hier das beschränkte Timestamp-Format zu benutzen, ein echter Datumstyp ist bei SQL schließlich vorhanden.
muntafuner hat geschrieben:$istdatum = date("d.m.Y");
$abfrage = "SELECT * FROM kalender WHERE meinid = '$meinid' AND datum > '$istdatum' ORDER BY 'datum' ASC";
datum ist das selbe Format. 01.02.2010 usw.
So ist das Ergebnis.
14.01.2010
14.06.2010
19.04.2010
Du hast deine Daten als Texte abgelegt und genau so sortiert MySQL auch, als Text, d.h. nach Alphabet und Ziffern. Dabei kommt selbstverständlich "19.04" nach "14.06", so wie "Berta.Hummelsbach" nach "Anton.Xylophon" kommt, obwohl der Nachname eine andere Reihenfolge vorgeben könnte. Die Unterteilung interessiert hier aber nicht, weder nach Vor- und Nachname noch nach Tag, Monat und Jahr, ein Textvergleich geht stur Zeichen für Zeichen vor.
Wenn du möchtest, dass MySQL nach Datum, also zeitlicher Abfolge sortiert, musst du für Daten auch eine Spalte vom dafür gedachten Typ
Date anlegen, keine Textspalte.
Um deine vorhandene Tabelle zu korrigieren, gehe wie nachfolgend vor. Schau dir am Besten nach jedem Schritt die Tabelle an, um nachzuvollziehen, was dort passiert.
0. Alte Tabelle sichern! Falls dir was schiefgeht, kannst du dann den alten Zustand über die Sicherungskopie wiederherstellen. Falls du Zugriff auf phpMySQL oder etwas ähnliches hast, kannst du eine Sicherung mit der Exportfunktion (Export nach SQL) anlegen.
1. Alte Spalte datum in datumalt umbenennen:
alter table kalender change datum datumalt varchar(64);
2. Neue Spalte namens datum vom Typ Date anlegen, und zwar der Schönheit wegen hinter der Spalte datumalt:
alter table kalender add datum date after datumalt;
3. Daten von der alten Spalte in die neue kopieren. Dabei muss das Format mit der Funktion
str_to_date() konvertiert werden, denn mit Texten im Format tt.mm.jjjj kann MySQL nichts anfangen:
update table kalender set datum=str_to_date(datumalt,"%d.%m.%Y");
4. Alte Spalte datumalt löschen:
alter table kalender drop datumalt;
Wenn du nach dieser Aktion ein select duchführst und die Daten wie gehabt mit
order by datum sortierst, werden sie auch in der richtigen zeitlichen Abfolge erscheinen und nicht mehr nach Alphabet und Ziffern sortiert.
Wenn du zukünftig Daten in die Tabelle schreibst, musst du die Teile Tag, Monat und Jahr vorher in die richtige Reihenfolge bringen. MySQL erwartet das Datum im Format jjjjmmtt, zB 20100113 für den 13. Januar 2010. Für diese Formatierung kannst du entweder in SQL die Funktion str_to_date() verwenden, falls deine Daten als Text ankommen, oder PHP-seitig die Funktion date() zusammen mit dem Muster
Ymd, falls deine Daten als Timestamp vorliegen.
Für die where-Klausel beim select gilt das Gleiche: Auch hier musst du das Datum in das richtige Format bringen. Dein eingangs zitiertes Beispiel müsste so aussehen:
$istdatum = date("Ymd");
$abfrage = "select * from kalender where meinid = '" . mysql_real_escape_string($meinid) . "' AND datum > " . $istdatum . " order by datum";
PS: Bitte benutze immer, wenn du Variablen in eine SQL-Anweisung einfügst, die Funktion
mysql_real_escape_string(), um den Inhalt der Variablen zu entschärfen! Dies gilt doppelt und dreifach, wenn die Daten von draußen kommen, zB über ein Webformular!
Das Einschmuggeln von manipulierten Daten über ungesicherte SQL-Anweisungen ist die Sicherheitslücke überhaupt.
[/i]