paco: komisches Problem ein Datum in ein DATE-Feld zu speichern

Hallo,
ich versuche ein Datum, das ich per jQuery-Kalender-widget in ein Formularfeld eintragen lasse, in einer mysql-tabelle zu speichern.

Jetzt mußte ich feststellen dass in der Datenbank immer nur 0000-00-00 gespeichert wurde.

Hab mir den übergebenen String ausgeben lassen, wie auch die ganze SQL-query und alles scheint in Ordnung.

Dann hab ich eine UPDATE anweisung mit phpmyadmin gemacht, mit dem gleichen Ergebnis.

Erst mit
UPDATE tabelle SET datum = 20110101

statt

UPDATE tabelle SET datum = 2011-01-01

wurde das Datum korrekt gespeichert (lustigerweise in phpmyadmin dann aber wieder mit Bindestrichen dargestellt..)

Ich möchte ungern den Datumsstring nochmal anpacken müssen, da er aus einem Array kommt, außerdem hab ich eben noch in der mysqldoku gelesen, dass es anscheinend sogar mit noch ganz anderen trennzeichen funktionieren sollte (zb 2011#01#01)

Weiß jemand Rat?

Danke,
Paco

  1. Hi,

    UPDATE tabelle SET datum = 2011-01-01

    also lautet das Statement effektiv:

    UPDATE tabelle SET datum = 2009

    Das könnte als Jahreszahl interpretiert werden, wird es jedoch nicht, weil ein komplettes Datum erwartet wird.

    Ich möchte ungern den Datumsstring nochmal anpacken müssen,

    Vielleicht solltest Du aus der Zahlenberechnung zunächst mal einen Datumsstring machen, das könnte helfen.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. ach scheiße

      1. verzeihung.. die Wortwahl...
        Manchmal ist es aber auch schrecklich!
        Naja, beruhigen, abhaken und Cheatah danke sagen für den subtilen Hinweis.

        @Cheatah: Danke für den subtilen Hinweis!

        ach scheiße

        1. ok, jetzt brauch ich aber doch nochmal Hilfe mit diesen vermaledeiten accent graves..

          Mein SQL sieht folgendermaßen aus:

            
          $sql = "INSERT INTO tabelle (" . implode(", ", array_keys($array)) . ", zusatzfeld ) VALUES (" . implode(", ", $array) . ", " . "'$serialized_array2'" . ")";
          

          In $array steckt das Datum drin, dass ich irgendwie als String kennzeichnen möchte, aber ich weiß nicht wie..

          1. In $array steckt das Datum drin, dass ich irgendwie als String kennzeichnen möchte, aber ich weiß nicht wie..

            Oh mann, geschafft! Recht simpel und ohne accent graves ;-)

            Falls es noch jemanden interessiert:

            ... VALUES (" . "'" .  implode("', '", $array) . "'" . ", " . "'$serialized_array2'" . ") ...

            Puhh, schwere Geburt, ich glaub ich brauch mal ne Pause..

            Danke euch,
            paco

            1. Moin Moin!

              In $array steckt das Datum drin, dass ich irgendwie als String kennzeichnen möchte, aber ich weiß nicht wie..

              Oh mann, geschafft!

              Nein.

              ... VALUES (" . "'" .  implode("', '", $array) . "'" . ", " . "'$serialized_array2'" . ") ...

              Puhh, schwere Geburt, ich glaub ich brauch mal ne Pause..

              Nein, Platzhalter. Die lösen auch das andere Problem.

              Alexander

              --
              Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
              1. Nein, Platzhalter. Die lösen auch das andere Problem.

                Alexander

                Sehr schön :-)
                Sowohl Strip als auch das Zitat! Was ich da baue ist nur für den internen Gebrauch, da müßte schon ein sehr guter KollegeIn injecten, aber ich werd mir das mit den Platzhaltern auf jeden Fall anschauen.

                Was ist denn mit "Some drivers support placeholders and bind values" gemeint?

                Vielen Dank auf jeden Fall,
                Paco

                1. Moin Moin!

                  Sowohl Strip als auch das Zitat! Was ich da baue ist nur für den internen Gebrauch, da müßte schon ein sehr guter KollegeIn injecten,

                  Erstens muß es ja gar nicht absicht sein, einmal falsch Copy&Paste und das Unglück ist passiert.

                  Und zweitens kommen gerüchteweise die meisten Angriffe auf Firmensysteme von INNEN. Manche pinkeln in die Kaffeekanne, andere hinterlassen Malware. Und wieder andere demolieren einfach alles, was ihnen in die Finger kommt.

                  Ein wenig Mißtrauen gegenüber dem User schadet nicht. Und insbesondere nicht in Netzwerken. Daher: 1039. Selbst wenn man nur für sich selbst schreibt.

                  aber ich werd mir das mit den Platzhaltern auf jeden Fall anschauen.

                  Was ist denn mit "Some drivers support placeholders and bind values" gemeint?

                  (Zitat aus der DBI-Doku)

                  Das bezieht sich nach meinem Verständnis eher auf die (Hersteller-)Treiber der jeweiligen Datenbank denn auf DBI oder die DBI-Datenbank-Treiber (DBD::*). Nicht jede Datenbank-Schnittstelle unterstützt Platzhalter, einigen wenigen muß man tatsächlich jedes Mal einen einzelnen String mit SQL und Werten übergeben. Andere kennen außer positionierten Parametern auch noch benannte Parameter, wieder andere kennen NUR benannte Parameter. Aber das schöne am DBI ist, dass man sich darum ÜBERHAUPT NICHT kümmern muß, wenn man brav die Fragezeichen als positionierte Platzhalter benutzt. Die Kombination aus DBI und dem Datenbank-spezifischen DBD::irgendwas kümmert sich darum, dass die Fragezeichen ggf. durch passend gequotete Werte, benannte Platzhalter oder andere positionierte Platzhalter ersetzt werden, KOMPLETT TRANSPARENT natürlich.

                  Das ist überhaupt der riesige Pluspunkt beim DBI: Es ist (bis auf Details des jeweiligen SQL-Dialekts und DB-spezifische Besonderheiten wie Large Objects, Sequenzen und automatisch vergebene IDs) vollkommen egal, mit welcher Datenbank (angefangen bei CSV-Dateien und Berkeley-Datenbanken über SQLite, MySQL, bis hin zu High-End-Datenbanken wie PostgreSQL, DB2, Oracle) man arbeitet. Außerdem gibt es "Brücken" zu ODBC (was wiederum tonnenweise RDBMS anbindet, mit etwas mehr Overhead) und JDBC, und zwei verschiedene Proxy-DBDs, um über Host- und Plattform-Grenzen hinweg an plattformspezifische DBDs anzudocken (z.B. mit BSD oder Linux auf eine Access-DB unter Windows, via Proxy und ODBC).

                  Egal wie man an die jeweilige Datenbank kommt, die DBI-Schnittstelle zum Programm hin bleibt unverändert, nur die Parameter für die connect()-Methode (Datenbank, Username, Passwort) müssen verändert werden.

                  PHPs PDO ist ein schwacher Abklatsch des DBI, mehr Schreibarbeit für weniger unterstützte Datenbanken. Aber immerhin kann PDO auch mit Platzhaltern umgehen.

                  Alexander

                  --
                  Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
          2. Moin Moin!

            ok, jetzt brauch ich aber doch nochmal Hilfe mit diesen vermaledeiten accent graves..

            Mein SQL sieht folgendermaßen aus:

            Das ist kein SQL, das ist irgendeine Script-Sprache, die ein SQL-Statement zusammenfrickeln soll.

            $sql = "INSERT INTO tabelle (" . implode(", ", array_keys($array)) . ", zusatzfeld ) VALUES (" . implode(", ", $array) . ", " . "'$serialized_array2'" . ")";

            
            >   
            > In $array steckt das Datum drin, dass ich irgendwie als String kennzeichnen möchte, aber ich weiß nicht wie..  
              
            [Bobby Tables](http://bobby-tables.com/) kennst Du?  
              
            Nimm [Platzhalter](http://search.cpan.org/~timb/DBI-1.616/DBI.pm#Placeholders_and_Bind_Values), dann mußt Du Dich NIE WIEDER um das jeweils korrekte Quoting kümmern.  
              
              
            Alexander
            
            -- 
            Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
            
          3. Tach!

            ok, jetzt brauch ich aber doch nochmal Hilfe mit diesen vermaledeiten accent graves..

            Es sind nur einfache Anführungszeichen ' und keine Gravis `

            Mein SQL sieht folgendermaßen aus:
            $sql = "INSERT INTO tabelle (" . implode(", ", array_keys($array)) . ", zusatzfeld ) VALUES (" . implode(", ", $array) . ", " . "'$serialized_array2'" . ")";

            Das ist kein SQL, sondern PHP-Code. Sinnvoll wäre es, das als PHP und nicht als SQL auszuzeichnen.

            In $array steckt das Datum drin, dass ich irgendwie als String kennzeichnen möchte, aber ich weiß nicht wie..

            Du brauchst vor dem ersten und nach dem letzten Element einen Anfang und ein Ende, also ein ' und zwischen zwei Elementen Ende, Komma und Anfang, also ','

            Wenn die Datumswerte allerdings aus Benutzereingaben stammen, musst du noch irgendwie die Kontextbehandlung hinzufügen.

            dedlfix.