Fasaro: Datum in MYSQL speichern

Ich bin wirklich am verzweifeln!

Ich möchte eine Datum in einer MYSQL Datenbank speichern! In der Datenbank habe ich dafür das Feld "datum" vom Typ "date".

1. Zum bekommen des Datums habe ich:

$datum = date("d.m.Y",time());

2. Das Datum wird umgewandelt mit:

$date = date_german2mysql($datum);

  • Funktion :

function date_german2mysql($datum) {
list($tag, $monat, $jahr) = explode(".", $datum);

return sprintf("%04d-%02d-%02d", $jahr, $monat, $tag);
}

3. Das Datum wird in MYSQL-DB gespeichert mit dem Befehl:

$sql = "INSERT INTO datum (datum)
 VALUES ($date)";
mysql_query($sql) OR die("'".$sql."' : ".mysql_error());

So sollte es eigentlich funktionieren. Ich lese schon seit Tagen Foren bezüglich dieses Problem und überall diese Lösung.

Doch in der Tabelle steht nach ausführen dieses Vorgangs 0000-00-00 - und nicht das Datum, was ich dort haben will!

Kann mir vielleicht jemand helfen???

VG Fasaro

  1. Hi,

    Kann mir vielleicht jemand helfen???

    ein guter Einstieg wäre sich per echo mal das wirkliche Statement ausgeben zu lassen und das direkt auf der Datenbank auszuführen. Dann sieht man schonmal, ob ein Syntaxfehler o.ä. drin ist.

    In deinem Fall könnte ich mir vorstellen, dass um die Wertangabe die ' fehlen, womit du versuchst xxxx-yy-zz einzugeben, also
    2006-08-01 = 1997 - das ist kein gültiges Datum...

    MfG
    Rouven

    --
    -------------------
    There's no such thing as a free lunch  --  Milton Friedman
    1. 1997 - das ist kein gültiges Datum...

      doch, schon... nur nicht das richtige :D

      mfg
      Micha

      1. echo $begrüßung;

        1997 - das ist kein gültiges Datum...
        doch, schon... nur nicht das richtige :D

        In deinen menschlichen Augen mag dies ein gültiges Datum darstellen, doch für MySQL ist das nicht ausreichend. Siehe Kapitel The DATETIME, DATE, and TIMESTAMP Types. MySQL erlaubt eine gewisse Anzahl an Datumswert-Formatierungen. Dabei sind nicht nur Strings sondern auch Werte vom Typ NUMBER erlaubt. Es wird dann versucht, sie wie einen String zu interpretieren. 4 Stellen sind dabei zu wenig. Bei 5 Stellen wurden in meinen Versuchen immer zwei fürs Jahr, zwei für den Monat und der Rest für den Tag gewertet.

        Der OP hat keinen String sondern etwas übergeben, das wie eine Formel aussah. MySQL hat diese berechnet und eine Zahl mit nur 4 signifikanten Stellen erhalten, was dann wegen Nichtinterpretierbarkeit zu dem "Zero" Value führte.

        echo "$verabschiedung $name";

  2. echo $begrüßung;

    Ein paar Anmerkungen:

    1. Zum bekommen des Datums habe ich:
      $datum = date("d.m.Y",time());

    Ruft man date() mit nur einem Parameter auf, wird die aktuelle Zeit verwendet. Der Aufruf von time() ist also überflüssig.

    1. Das Datum wird umgewandelt mit:
      $date = date_german2mysql($datum);
      function date_german2mysql($datum) {
      list($tag, $monat, $jahr) = explode(".", $datum);
      return sprintf("%04d-%02d-%02d", $jahr, $monat, $tag);
      }

    Meiner Meinung nach ist diese Vorgehensweise ungünstig und umständlich. Du solltest wann immer es möglich ist, mit Roh-Daten arbeiten. In dem Fall sollte innerhalb deines Scripts der Timestamp-Wert herumgereicht werden:

    $datum = time();

    Erst wenn für eine Ausgabe ein formatierter Wert benötigt wird, sollte dieser erzeugt werden. Wieder auf deinen Fall bezogen, kann die Formatierung einfacher mit date() erledigt werden:

    $sql = sprintf('INSERT INTO datum (datum) VALUES ("%s")', date('Y-m-d', $datum));

    oder auch nur date('Y-m-d') denn während der Laufzeit deines Script ist ein Datumswechsel eher unwahrscheinlich. Alternativ bietet sich auch noch an, einen Unix-Timestamp-Wert an MySQL weiterzureichen:

    $sql = sprintf('INSERT INTO datum (datum) VALUES (FROM_UNIXTIME(%s))', time());

    Da brauchts dann auch keine Anführungszeichen, weil dies ein numerischer Wert ist.

    echo "$verabschiedung $name";