C. Kiesling: Datum formatieren mit PHP/MySQL

Hallo liebe Community!

Habe da ein Problem und würde mich sehr über eure Hilfe freuen! Und zwar möchte ich mit PHP und einer MySQL DB ein Gästebuch erstellen, bei dem auch das Datum und die Zeit der Erstellung der jeweiligen Einträge in der DB-Tabelle gespeichert werden.

Dazu gleich meine erste Frage: Sollte ich lieber eine Spalte mit TIMESTAMP Format benutzen oder lieber DATE, TIME oder DATETIME?

Mir ist vor allem wichtig, das man das Datum dann für die Ausgabe auf der Webpage formatieren kann, z.B. "on 6th of January 2006 03:15pm..." (brauche es sowieso in englisch).

Wie gehe ich das am besten an? Kann man z.B. einen MySQL Timestamp mit DATE_FORMAT formatieren? Oder was wären andere gute Lösungen?

Wäre über eure Hilfe sehr froh!

Danke im Voraus und schöne Grüße,
Constantin

  1. Ich persönlich verwende am liebsten einfach den Timestamp, der mithilfe von date(U) in PHP die Sekunden seit dem 1.1.1970 angibt und speicher ihn als int.
    Mithilfe der date() Version kann man ihn als optionalen 2. Parameter sehr schön bearbeiten.
    Ich kenne mich mit den echten date-typen in MySQL nicht sonderlich aus, vllt gibt es dort noch besseres.
    Aber solange du keine Speicherplatzprobleme mit deiner Datenbank hast, denke ich spricht nicht viel schwerwiegendes [1] gegen diese Methode.

    werbeklaus
    [1] fals ich falsch liege, klärt mich bitte auf :-)

    1. Hallo Lukas (werbeklaus),

      [1] fals ich falsch liege, klärt mich bitte auf :-)

      Du liegst falsch. Beim Design von Datenbanken gilt der Grundsatz, dass man den Datentyp des Datenbankmanagementsystems (DBMS) verwendet, der den Daten angemessen ist. Bei einer Spalte, die eine Zeitangabe aus Datum und Zeit enthält, ist dies der Datentyp DATETIME, siehe Handbuch (erster Satz des zweiten Absatzes). Der Datentyp TIMESTAMP ist dann angebracht, wenn man den damit verbundenen Zauber benötigt.

      Freundliche Grüße

      Vinzenz

      1. Hallo Vinzenz,

        Beim Design von Datenbanken gilt der Grundsatz, dass man den Datentyp des Datenbankmanagementsystems (DBMS) verwendet, der den Daten angemessen ist. Bei einer Spalte, die eine Zeitangabe aus Datum und Zeit enthält, ist dies der Datentyp DATETIME, siehe Handbuch (erster Satz des zweiten Absatzes). Der Datentyp TIMESTAMP ist dann angebracht, wenn man den damit verbundenen Zauber benötigt.

        Das klingt an und für sich logisch, wozu sonst gäbe es das.
        Aber
        1. Wenn ich die Daten mit PHP auslese, hab ich doch eh wieder nur einen String, den ich dann
        2. Aufwändig exploden muss, um es zu formatieren.
        3. Woher bekomme ich dann zB ein "Montag" zu meiner Datumangabe?

        Klär mich wieder auf, falls es einfacher geht als ich hier denke :-)

        werbeklaus

        1. Hallo Lukas (ist doch Dein richtiger Name, oder?)

          Das klingt an und für sich logisch, wozu sonst gäbe es das.

          und noch mehr, es gibt wunderbare Datumsfunktionen, die sehr praktisch sind, siehe  MySQL-Handbuch, Date and Time Functions :-)

          1. Wenn ich die Daten mit PHP auslese, hab ich doch eh wieder nur einen String, den ich dann
          2. Aufwändig exploden muss, um es zu formatieren.

          Oh, nein - wer wird denn solch einen Aufwand betreiben. Wozu eine API verwenden, wenn das DBMS alles liefert, was man benötigt, siehe DATE_FORMAT.

          1. Woher bekomme ich dann zB ein "Montag" zu meiner Datumangabe?
            Klär mich wieder auf, falls es einfacher geht als ich hier denke :-)

          Für lokalisierte Wochentagsangaben schau Dir die Benutzerkommentare  zu den Datums- und Zeitfunktionen an.

          Was wird durch Deinen Ansatz ebenfalls extrem schwierig: Gib mir alle Gästebucheinträge in bestimmten Zeiträumen, oder einfach nur solche die in einem bestimmten Monat liegen (unabhängig vom Jahr). DATETIME ist da in Verbindung mit den Datums- und Zeitfunktionen viel flexibler.

          Freundliche Grüße

          Vinzenz

          1. Hi Vinzenz

            Hallo Lukas (ist doch Dein richtiger Name, oder?)

            Ja, ist er :-) du scheinst wohl schon mehrere Beiträge von mir gelesen zu haben ;)

            Das klingt an und für sich logisch, wozu sonst gäbe es das.

            und noch mehr, es gibt wunderbare Datumsfunktionen, die sehr praktisch sind, siehe  MySQL-Handbuch, Date and Time Functions :-)

            1. Wenn ich die Daten mit PHP auslese, hab ich doch eh wieder nur einen String, den ich dann
            2. Aufwändig exploden muss, um es zu formatieren.

            Oh, nein - wer wird denn solch einen Aufwand betreiben. Wozu eine API verwenden, wenn das DBMS alles liefert, was man benötigt, siehe DATE_FORMAT.

            1. Woher bekomme ich dann zB ein "Montag" zu meiner Datumangabe?
              Klär mich wieder auf, falls es einfacher geht als ich hier denke :-)

            Für lokalisierte Wochentagsangaben schau Dir die Benutzerkommentare  zu den Datums- und Zeitfunktionen an.

            Was wird durch Deinen Ansatz ebenfalls extrem schwierig: Gib mir alle Gästebucheinträge in bestimmten Zeiträumen, oder einfach nur solche die in einem bestimmten Monat liegen (unabhängig vom Jahr). DATETIME ist da in Verbindung mit den Datums- und Zeitfunktionen viel flexibler.

            Uiuiuiuiui, ich glaube ich unterschätze MySQL enorm :-) Vielen dank, dass du mir das so erklärst, ich kann in MySQL nicht viel mehr als INSERT, SELECT, DELETE und UPDATE und vllt noch einfache Joins.
            Werde ich ab jetzt wohl auch ein wenig die Date-Typen verwenden!

  2. Hallo Constatin,

    Habe da ein Problem und würde mich sehr über eure Hilfe freuen! Und zwar möchte ich mit PHP und einer MySQL DB ein Gästebuch erstellen, bei dem auch das Datum und die Zeit der Erstellung der jeweiligen Einträge in der DB-Tabelle gespeichert werden.

    Du möchtest also einen festen Zeitpunkt speichern, der sich nicht ändert, der sich nicht automatisch ändern soll?

    Dazu gleich meine erste Frage: Sollte ich lieber eine Spalte mit TIMESTAMP Format benutzen oder lieber DATE, TIME oder DATETIME?

    Nimm DATETIME, das ist der Datentyp, der Deine Angaben wunderbar aufnehmen kann und dafür vorgesehen ist, siehe MySQL-Handbuch, Date and Time Types. Da Du den mit TIMESTAMP verbundenen Zauber nicht benötigst (dieser wäre sogar kontraproduktiv) verwende DATETIME.

    Mir ist vor allem wichtig, das man das Datum dann für die Ausgabe auf der Webpage formatieren kann, z.B. "on 6th of January 2006 03:15pm..." (brauche es sowieso in englisch).

    DATE_FORMAT ist Dein Freund. PHP ist für Dein Problem völlig irrelevant.

    Freundliche Grüße

    Vinzenz

    1. Hallo Vinzenz!

      Danke vielmals für dein hilfreiches Posting! Habe eigentlich eh schon mit DATETIME geliebäugelt - jetzt habe ich mich fix dafür entschieden. Offensichtlich kann man DATETIME ja auch perfekt mit DATE_FORMAT formatieren!

      Danke und schöne Grüße,
      Constantin

    2. Hallo Vinzenz!

      Danke nochmal für deine gestrige Hilfe! Bei mir ist jetzt aber noch eine Unklarheit bezüglich der Abfrage der Daten aus der DB aufgetreten... vielleicht könntest du mir noch mal Rat geben?

      Normal sah ja meine Abfrage immer so aus:
      SELECT * FROM ... WHERE ... ORDER BY ...
      Das heißt, mit dem Sternchen wähle ich alle Zeilen aus (richtig?).

      Wie baue ich jetzt aber das DATE_FORMAT richtig in die Abfrage ein? Eigentlich wird es ja statt dem Sternchen hingeschrieben, aber gehen mir dann nicht irgendwelche Daten verloren? Worauf muss ich da achten? Würde mich sehr freuen, wenn du mir nochmal helfen könntest!

      lG,
      Constantin

      1. Hallo Constatin,

        Danke nochmal für deine gestrige Hilfe! Bei mir ist jetzt aber noch eine Unklarheit bezüglich der Abfrage der Daten aus der DB aufgetreten... vielleicht könntest du mir noch mal Rat geben?

        Normal sah ja meine Abfrage immer so aus:
        SELECT * FROM ... WHERE ... ORDER BY ...
        Das heißt, mit dem Sternchen wähle ich alle Zeilen aus (richtig?).

        nein, das ist nicht richtig. Du wählst alle Spalten aus. Das ist prinzipiell gesehen keine gute Idee, auch wenn sie sehr bequem aussieht. Sich genau die Spalten ausgeben zu lassen, die man benötigt, ist die bessere Idee, also statt

        ~~~sql SELECT * FROM
          SELECT spalte1, spalte2, funktion(spalte3) AS neue_spaltenbezeichnung FROM

          
        zu verwenden. Es erleichtert Dir den Umgang mit der Ergebnismenge, deren Spaltenreihenfolge Du somit festlegst, es macht Dich von der Tabellenstruktur unabhängiger, es vermeidet die Rückgabe von Spalteninhalten, die Du nicht benötigst.  
          
        
        > Wie baue ich jetzt aber das DATE\_FORMAT richtig in die Abfrage ein? Eigentlich wird es ja statt dem Sternchen hingeschrieben, aber gehen mir dann nicht irgendwelche Daten verloren?  
          
        s.o: zweite Version. Wähle genau die Spalten aus, die Du benötigst.  
          
          
        Freundliche Grüße  
          
        Vinzenz
        
        1. Hallo Vinzenz,

          ~~~sql

          SELECT * FROM

          SELECT spalte1, spalte2, funktion(spalte3) AS neue_spaltenbezeichnung FROM

            
          Ich habe schon oft gehört, dass ein \* verpönt ist, mit folgenden Argumenten:  
          1\. Man holt manches, was man nicht braucht  
          2\. Man ist abhängig von der Tabellenreihenfolge  
            
          Wenn ich aber  
          1\. fetch\_assoc (Ergebnis wird in einem assoziierten Array zurückgegeben mit Spaltenname => Inhalt) verwende, bin ich doch wieder unabhängig der Reihenfolge und manchmal sogar  
          2\. Jede Spalte brauche,  
          dürfte doch nichts mehr gegen den \* sprechen, oder nicht?  
            
          Danke,  
          werbeklaus oder Lukas für dich ;-)