MySQL
Michael
- php
Hallo leute,
ich möchte aus einer MySQL Tabelle einen Datensatz in einer sortierten reihenfolge auslesen.
Da das Datenfeld jedoch ein Datum ist geht die ORDER funktion nicht so wirklich.
Habt Ihr noch ne einfache Lösung für mich ohne das ich die variable zerlegen (STRING) muss ?
Hier mein code:
$sql = "SELECT * FROM x ORDER BY date ASC";
$ergebnis = mysql_query($sql) or die("Fehler in x beim Lesen");
while ($row = mysql_fetch_array($ergebnis))
{
$date =$row["date"];
$time =$row["time"];
$titel =$row["titel"]; $text =$row["text"]; $quelle =$row["quelle"];
$link =$row["link"];
$insert = "INSERT INTO temp (date, time, titel, text, quelle, link ) VALUES ('$date', '$time', '$titel', '$text', '$quelle', '$link')";
$check = mysql_query($insert) or die ("Fehler in temp beim Schreiben");
}
echo $begrüßung;
Da das Datenfeld jedoch ein Datum ist geht die ORDER funktion nicht so wirklich.
Doch doch...
Habt Ihr noch ne einfache Lösung für mich ohne das ich die variable zerlegen (STRING) muss ?
Verwende ein Feld vom Typ DATE oder DATETIME!
echo "$verabschiedung $name";
echo $begrüßung;
Da das Datenfeld jedoch ein Datum ist geht die ORDER funktion nicht so wirklich.
Doch doch...
Habt Ihr noch ne einfache Lösung für mich ohne das ich die variable zerlegen (STRING) muss ?
Verwende ein Feld vom Typ DATE oder DATETIME!
echo "$verabschiedung $name";
Das mit DATE ist nur deshalb doof da es JJJJ-MM-DD
Format hat. Kann ich das auf TT.MM.JJJJ umstellen ?
Hi Michael,
Das mit DATE ist nur deshalb doof da es JJJJ-MM-DD
Format hat. Kann ich das auf TT.MM.JJJJ umstellen ?
Was ist daran blöd? Du kannst das bei der Ausgabe mittels DATE_FORMAT() beliebig formatieren. Siehe dazu auch MySQL Referenz, Datums- und Zeitfunktionen, DATE_FORMAT.
MfG, Dennis.
Hi Michael,
Das mit DATE ist nur deshalb doof da es JJJJ-MM-DD
Format hat. Kann ich das auf TT.MM.JJJJ umstellen ?Was ist daran blöd? Du kannst das bei der Ausgabe mittels DATE_FORMAT() beliebig formatieren. Siehe dazu auch MySQL Referenz, Datums- und Zeitfunktionen, DATE_FORMAT.
Ich werd allein leider daraus nicht schlau.
Also ich hab das Problem das die Tabelle mittels einem Textfeld gefüttert wird. Der User gibt das Datum im tt.mm.jjjj Format ein.
dann wird es in der Tabelle gespeichert und wieder heraus gelesen und erneut gespeichert.
Wie kann ich das realisieren ?
bin nicht so fit in PHP/MySQL sorry. Aber danke für die hilfe.
MfG, Dennis.
Hi Michael,
Also ich hab das Problem das die Tabelle mittels einem Textfeld gefüttert wird. Der User gibt das Datum im tt.mm.jjjj Format ein.
So würde ich es _nicht_ machen. Denn ich kenne viele Leute, die ein Datum auch im Format tt/mm/jj oder jj-mm-tt oder auch einfach nur tt.mm.jj angeben - dann kriegst du da ja nie ein System rein!
Deshalb stelle ich den Usern immer drei Select-Listen zur Verfügung, die lassen sich bequem mit PHP erzeugen:
echo "<select name=\"date[day]\">\n";
for($x = 1; $x <= 31; $x ++)
{
echo "<option value=\"$x\">$x.</option>\n";
}
echo "</select>\n<select name=\"date[month]\">\n";
for($x = 1; $x <= 12; $x ++)
{
echo "<option value=\"$x\">$x.</option>\n";
}
echo "</select>\n<select name=\"date[year]\">\n";
for($x = 1920; $x <= intval(date("Y")); $x ++)
{
echo "<option value=\"$x\">$x</option>\n";
}
echo "</select>\n";
Hier wird das Datum in der Form tt.mm.dddd angegeben, im obigen Beispiel kann man Jahre zwischen 1920 und dem aktuellen Jahr auswählen (das oben noch etwas erweitert, habe ich an einer Stelle genutzt, wo der User sein Geburtsdatum eingeben konnte.
Serverseitig muss man dann (nach dem Prüfen des Datums auf Gültigkeit) nur noch die einzelnen Werte zusammensetzen:
$entered_date = $_POST['date']['year']."-".$_POST['date']['month']."-".$_POST['date']['day'];
dann wird es in der Tabelle gespeichert und wieder heraus gelesen und erneut gespeichert.
Wie kann ich das realisieren ?
Beim Auslesen gehst du einfach so vor:
SELECT
foo,
bar,
sontiges,
DATE_FORMAT(datumsspalte, '%d.%m.%Y') AS datum_formatiert
FROM
tabelle
Wenn du dann anschließend mit PHP den MySQL Result Wert ausliest ...
$row = mysql_fetch_assoc($return)
... hast du in $row['datum_formatiert'] das fertig für die Ausgabe formatierte Datum drin stehen :-)
MfG, Dennis.
Hallo Dennis,
Also ich hab das Problem das die Tabelle mittels einem Textfeld gefüttert wird. Der User gibt das Datum im tt.mm.jjjj Format ein.
So würde ich es _nicht_ machen. Denn ich kenne viele Leute, die ein Datum auch im Format tt/mm/jj oder jj-mm-tt oder auch einfach nur tt.mm.jj angeben - dann kriegst du da ja nie ein System rein!
Ich habe mir eine Funktion geschrieben, die versucht aus dem eingegebenen String ein Datum zu erkennen, dabei erkennt sie jedes Datum in der Form DD.MM.(JJ)JJ oder (JJ)JJ.MM.DD (wobei der . für \D+ steht und das Jahr mit einem optionalen Parameter ergänzt wird wenn es nur 2-stellig ist). Wenn das Datum erkannt wird, gibt die Funktion true zurück und verändert den übergebenen Wert so, das er im Format "DD.MM.JJJJ" ist.
Deshalb stelle ich den Usern immer drei Select-Listen zur Verfügung, die lassen sich bequem mit PHP erzeugen:
Das halte ich aber für eine sehr dämliche und umständlich zu bedienende Lösung ... - ich habe wesentlich schneller z.B. 4r5r06 eingegeben (was meine Funktion zu 04.05.2006 macht) als mir in einem select-Feld die richtigen Werte zusammengefummelt. Zusätzlich baue ich auch noch http://www.mattkruse.com/javascript/calendarpopup/ mit ein, womit man ein Datum auch relativ bequem eingeben kann.
for($x = 1920; $x <= intval(date("Y")); $x ++)
Suchst du gerne einen Eintrag aus einem Select-Feld das über 80 Einträge enthält? Und was machst du wenn du ein Jahr in der Zukunft brauchst?
Serverseitig muss man dann (nach dem Prüfen des Datums auf Gültigkeit) nur noch die einzelnen Werte zusammensetzen:
$entered_date = $_POST['date']['year']."-".$_POST['date']['month']."-".$_POST['date']['day'];
Um das Datum Datenbanktauglich zu bekommen, verwende ich
$datum = preg_replace('~^([0-9]{2})\.([0-9]{2})\.([0-9]{4})$~',"$3-$2-$1",$_POST['datum']);
(Nach dem Prüfen ist das Datum ja schon in dem Format das der reguläre Ausdruck erwartet) - man könnte natürlich auch die Felder per explode() auseinanderdröseln und wieder zusammenkleben - das wäre vermutlich sogar schneller ...
Grüße aus Nürnberg
Tobias
Hi Tobias,
Ich habe mir eine Funktion geschrieben, die versucht aus dem eingegebenen String ein Datum zu erkennen, dabei erkennt sie jedes Datum in der Form DD.MM.(JJ)JJ oder (JJ)JJ.MM.DD (wobei der . für \D+ steht und das Jahr mit einem optionalen Parameter ergänzt wird wenn es nur 2-stellig ist). Wenn das Datum erkannt wird, gibt die Funktion true zurück und verändert den übergebenen Wert so, das er im Format "DD.MM.JJJJ" ist.
Beispiel: 04.05.06
Wie willst du erkennen, ob das JJ.MM.DD oder DD.MM.JJ ist?
Deshalb stelle ich den Usern immer drei Select-Listen zur Verfügung, die lassen sich bequem mit PHP erzeugen:
Das halte ich aber für eine sehr dämliche und umständlich zu bedienende Lösung ...
Ich nicht - sonst hätte ich es auch nicht so geschrieben ;-)
Der Vorteil den ich darin sehe ist, dass es leicht zu bedienen ist und man dem User auch statt den Zahlen für den Monat auch die Monatsnamen anbieten kann. Es bedarf keiner eigenen Erklärung für DAU's wie man das formatieren muss und beim nächsten Laden der Seite (z.B. ein Benutzerprofil) ist natürlich das alte ausgewählte Datum wieder vorselektriert.
ich habe wesentlich schneller z.B. 4r5r06 eingegeben (was meine Funktion zu 04.05.2006 macht) als mir in einem select-Feld die richtigen Werte zusammengefummelt.
Wenn es nur für dich ist, oder wenn viele Daten eingegeben werden sollen, hast du mit deiner Begründung sicherlich Recht, auf einer Seite, bei der man nicht ein gewisses Midestniveau der Besucher vorraussetzen kann, halte ich dies allerdings für zu kompliziert.
Bedenke, wie viele Möglichkeiten es gibt, ein Datum zu formatieren:
Das sind allein schon mal für, wegen der Jahreszahl eigentlich sogar 10, und wenn man davon ausgeht, dass man statt 06 auch 6 schreiben kann sogar noch mehr Möglichkeiten - und bestimmt noch nicht alle.
Zusätzlich baue ich auch noch http://www.mattkruse.com/javascript/calendarpopup/ mit ein, womit man ein Datum auch relativ bequem eingeben kann.
Den zweiten und dritten davon finde ich brauchbar - allerdings in der aktuellen Form nicht für z.B. ein Geburtsdatum, da es dort ewig dauern würde, bis man z.B. beim Jahr 1960 angelangt ist ;-)
Bei den meisten Kalender willst du ein PopUp öffnen, was mein Firefox blockt. Seltsamerweise sehe ich bei Klick auf die Block-Leiste keine Auswahl, irgedetwas zu öffnen, wie es sonst der Fall ist...
for($x = 1920; $x <= intval(date("Y")); $x ++)
Suchst du gerne einen Eintrag aus einem Select-Feld das über 80 Einträge enthält?
Das geht verhältnismäßig schnell.
Und was machst du wenn du ein Jahr in der Zukunft brauchst?
Das ist bei einem Geburtsdatum nie der Fall ;-)
Um das Datum Datenbanktauglich zu bekommen, verwende ich
$datum = preg_replace('~^([0-9]{2})\.([0-9]{2})\.([0-9]{4})$~',"$3-$2-$1",$_POST['datum']);
Hier ist nun aber ein Datum wie DD.MM.YY nicht erlaubt. Wenn du das nämlich auch erlauben würdest, würde das ganze nochmal deutlich komplizierter werden.
man könnte natürlich auch die Felder per explode() auseinanderdröseln und wieder zusammenkleben - das wäre vermutlich sogar schneller ...
Wäre vielleicht sogar sinnvoll, damit du eine Angabe wie 2005-17-69 entlarfen kannst ;-)
MfG, Dennis.
Hallo Dennis,
Beispiel: 04.05.06
Wie willst du erkennen, ob das JJ.MM.DD oder DD.MM.JJ ist?
Meine Funktion macht da den 4 Mai 2006 draus. Ein Hinweis wie das Datum eingegeben werden sollte, sollte natürlich schon darstehen, um uneindeutige Fälle richtig zu erkennen.
Es bedarf keiner eigenen Erklärung für DAU's wie man das formatieren muss und
Mit welchem Format DAUs besser zurecht kommen, weiß ich nicht, das müsste ich ausprobieren.
beim nächsten Laden der Seite (z.B. ein Benutzerprofil) ist natürlich das alte ausgewählte Datum wieder vorselektriert.
_davon_ gehe ich sowieso aus :-)
ich habe wesentlich schneller z.B. 4r5r06 eingegeben (was meine Funktion zu 04.05.2006 macht) als mir in einem select-Feld die richtigen Werte zusammengefummelt.
Wenn es nur für dich ist, oder wenn viele Daten eingegeben werden sollen, hast du mit deiner Begründung sicherlich Recht, auf einer Seite, bei der man nicht ein gewisses Midestniveau der Besucher vorraussetzen kann, halte ich dies allerdings für zu kompliziert.
Ich setze es im Moment hauptsächlich für eine Seite ein, auf die nur ein sehr eingeschränkter Nutzerkreis Zugriff hat (Mitgliederverwaltung eines Sportvereines) - ich weiß also, wer das hinbekommt und wer nicht (Wobei die Ober-DAUs das Daten-Eingeben sowieso mich machen lassen :-))
Bedenke, wie viele Möglichkeiten es gibt, ein Datum zu formatieren:
- DD.MM.(YY)YY
- (YY)YY.DD.MM
- (YY)YY-MM-DD
- DD/MM/(YY)YY
- (YY)YY/MM/DD
Aus Sicht meiner Funktion sind die 1. und 4. sowie die 3. und 5. Möglichkeit jeweils identisch, die 2. Möglichkeit kennt es nicht (die ist allerdings hier auch eher ungebräuchlich).
Zusätzlich baue ich auch noch http://www.mattkruse.com/javascript/calendarpopup/ mit ein, womit man ein Datum auch relativ bequem eingeben kann.
Den zweiten und dritten davon finde ich brauchbar - allerdings in der aktuellen Form nicht für z.B. ein Geburtsdatum, da es dort ewig dauern würde, bis man z.B. beim Jahr 1960 angelangt ist ;-)
Es gibt auch eine Option bei der das Jahr in einem input-Feld steht (das 8. Beispiel)
Bei den meisten Kalender willst du ein PopUp öffnen,
wieso ich? das Script stammt nicht von mir :-) Du kannst aber alles auch so wie das 2. und 3. Beispiel unter dem Input-Feld aufklappen lassen - ich habe auch keine Popups verwendet.
was mein Firefox blockt.
blockt der auch angeforderte Popups?
Suchst du gerne einen Eintrag aus einem Select-Feld das über 80 Einträge enthält?
Das geht verhältnismäßig schnell.
du sagst es: "verhältnismäßig" aber bestimmt nicht schneller, als ich das Jahr von Hand eingegeben habe :-P
Und was machst du wenn du ein Jahr in der Zukunft brauchst?
Das ist bei einem Geburtsdatum nie der Fall ;-)
Aber bei Feldern in denen angegeben werden soll, bis wann z.B. ein Attest gültig ist ...
$datum = preg_replace('~^([0-9]{2})\.([0-9]{2})\.([0-9]{4})$~',"$3-$2-$1",$_POST['datum']);
Hier ist nun aber ein Datum wie DD.MM.YY nicht erlaubt.
nein, hier ist nur DD.MM.YYYY erlaubt - aber genau das gibt ja meine Datumsprüffunktion zurück :-)
Wäre vielleicht sogar sinnvoll, damit du eine Angabe wie 2005-17-69 entlarfen kannst ;-)
wie gesagt: wenn jemand so ein Datum eingibt, kommt das Script überhaupt nicht bis zu der Stelle, an der das preg_replace verwendet wird.
Grüße aus Nürnberg
Tobias