Otto Wyss: Datum mit PDO (Prepare/Execute)

Nach der Umstellung auf PDO kann ich kein Datum mehr ändern. Wenn ich mit Prepare eine Umwandlung angebe, bekomme ich immer einen Fehler bei Execute

Prepare:
  SET Geburtsdatum = STR_TO_DATE (:Geburtsdatum, '%e.%c.%Y')

Fehler bei Execute:
  syntax to use near '('2.2.2000', '%e.%c.%Y')

Ich habe auch schon
  SET Geburtsdatum = STR_TO_DATE (:Geburtsdatum, '%e.%c.%Y')

ausprobiert, aber es geht auch nicht. Wenn ohne Umwandlung arbeite
  SET Geburtsdatum = :Geburtsdatum // wobei :Geburtsdatum = '2000-02-02'

dann funktioniert mein Statement. Hat da irgend jemand eine Idee?

  1. Hi!

    Prepare:
      SET Geburtsdatum = STR_TO_DATE (:Geburtsdatum, '%e.%c.%Y')
    Fehler bei Execute:
      syntax to use near '('2.2.2000', '%e.%c.%Y')

    Da du nicht angegeben hast, welches DBMS du verwendst, nehme ich MySQL an. In dem Fall sind gleich zwei Fehler im Statement

    • Benutzerdefinierte Variablennamen beginnen mit einem @.
    • Funktionsnamen folgt unmittelbar die öffnende Klammer. Bei Leerzeichen dazwischen nimmt MySQL an, es sei ein anderer Bezeichner gemeint, beispielsweise ein Tabellenname oder Spaltenname.

    Lo!

    1. Hallo,

      zeig doch bitte, was du genau in deinem PDO Objekt stehen hast.

      Gruß

      Sipatshi

      1. Hi!

        zeig doch bitte, was du genau in deinem PDO Objekt stehen hast.

        Naja, ein var_dump()-Abzug bringt keine Erkenntnisse. Ein PDO-Objekt hält sich sehr bedeckt:

        object(PDO)#1 (0) { }

        Aber mein Testcode zum Nachvollziehen des Falles im Ausgangsposting sah so aus:

        <?php  
        $dbh = new PDO('mysql:host=localhost;dbname=test', 'test', 'test');  
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);  
          
        $stmt = $dbh->prepare("SET Geburtsdatum = STR_TO_DATE (:Geburtsdatum, '%e.%c.%Y')");  
        $stmt->bindValue(':Geburtsdatum', '13.2.2010');  
        $stmt->execute();
        

        Das ergab im ersten Anlauf:

        Warning: PDOStatement::execute(): SQLSTATE[HY000]: General error: 1193 Unknown system variable 'Geburtsdatum' in ...

        Nach dem Hinzufügen des @ ergab sich

        Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1305 FUNCTION test.STR_TO_DATE does not exist in ...

        Nach dem Entfernen des Leerzeichens löste sich das Problem in Wohlgefallen auf. Wenn der OP ein anderes hat - und das kann gut sein, weil seine Fehlermeldung anders lautete - muss er sich nochmal konkret äußern.

        Lo!

        1. Nach dem Entfernen des Leerzeichens löste sich das Problem in Wohlgefallen auf.

          Vielen Dank, es war tatsächlich das überzählige Leerzeichen.