Novi: PDO Null-Werte werden konvertiert.

Hallo,

ich verwende seit kurzem PDO für den Zugriff auf eine MySql-Datenbank. Nun bietet PDO die Möglichkeit die abzufragenden Spalten jeweils an eine Variable zu binden und dabei gleich den Datentyp mit anzugeben.

Im Gegensatz zu MySqli, werden Zahlen also auch als Integer zurückgegeben.

$Statement->bindColumn(1, $Id, PDO::PARAM_INT);

Jedoch kann es vorkommen, dass bestimmte Spalten Null-Werte enthalten. Diese werden leider auch konvertiert. Also aus Null wird dann einfach zur Zahl 0 bzw. zum Leerstring. Dadurch lässt sich später nicht mehr feststellen, ob in der Spalte nun ein Null-Wert stand oder ob es sich um die Zahl 0 handelt.

Gibt es eine Möglichkeit, dieses Verhalten von PDO zu ändern?

Zurzeit lasse ich mir Zahlen als String zurückgeben und interpretiere einen Leerstring als Null bzw. aufeinander folgende Ziffern als Zahl.

Schon mal Vielen Dank für eure Antworten

Ich habe die gleiche Frage schon im Entwickler-Forum gestellt, jedoch noch keine Antwort erhalten. Sollte dort jemand eine Antwort schreiben, die bei der Lösung des Problems weiterhilft, werde ich dies natürlich auch hier beschreiben. Ich erhoffe mir hier aufgrund der größeren Community eher eine Antwort.

--
"(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)
  1. Hi!

    Jedoch kann es vorkommen, dass bestimmte Spalten Null-Werte enthalten. Diese werden leider auch konvertiert. Also aus Null wird dann einfach zur Zahl 0 bzw. zum Leerstring.

    Das glaube ich nicht. Lass dir die Variable mal mit var_dump() anzeigen.

    Dadurch lässt sich später nicht mehr feststellen, ob in der Spalte nun ein Null-Wert stand oder ob es sich um die Zahl 0 handelt.

    is_null() oder ein typsicherer Vergleich mit null ($foo === null) sollte gehen.

    Lo!

    1. Hallo,

      Das glaube ich nicht. Lass dir die Variable mal mit var_dump() anzeigen.

      Gut ich hab mal versucht einen kleinen Test zu machen:

      <?php  
      const DB_HOST = 'localhost';  
      const DB_NAME = '*********';  
      const DB_PASSWORD = '*********';  
      const DB_USERNAME = '*********';  
        
      function getDsn($host, $name) {  
          return 'mysql:host='.$host.';dbname='.$name;  
      }  
        
      $Dsn = getDsn(DB_HOST, DB_NAME);  
      $Database = new PDO($Dsn, DB_USERNAME, DB_PASSWORD);  
      $Database->setAttribute(PDO::ATTR_ERRMODE           , PDO::ERRMODE_EXCEPTION);  
      $Database->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_BOUND);  
        
      $Sql = <<<SQL  
          SELECT Null  
      SQL;  
        
      $Statement = $Database->prepare($Sql);  
      $Statement->bindColumn( 1, $Id, PDO::PARAM_INT);  
      $Statement->execute();  
      $Statement->fetch();  
      var_dump($Id);  
      ?>  
      
      

      Ausgabe:
      int(0)

      Viele Grüße Novi

      --
      "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)
      1. Hello,

        mit PDO::PARAM_STR funktioniert die Unterscheidung zwischen NULL und einem Wert, der als String wiedergegeben wird.

        Wird wohl eher ein Bug sein.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hallo,

          Hello,

          mit PDO::PARAM_STR funktioniert die Unterscheidung zwischen NULL und einem Wert, der als String wiedergegeben wird.

          Wird wohl eher ein Bug sein.

          Ich hab es auch eben nochmal getestet. Du hast recht!

          Viele Grüße Novi

          --
          "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)
      2. Hi!

        $Statement->bindColumn( 1, $Id, PDO::PARAM_INT);

        In meinem Versuch hab ich das Beispiel aus der Handbuchseite zu bindColumn() verwendet, da ist der dritte Parameter ($type) nicht angegeben. In dem Fall erhielt ich NULL - aber auch Strings. Dann bleibt dir (neben einer Fehlermeldung in Richtung PHP) wohl nur, ohne Typangabe zu binden und die Strings zu Fuß zu casten oder mit ihnen weiterzuarbeiten. Das sollte ja PHPs automatischer Typkonvertierung eigentlich nicht schwerfallen.

        Lo!

        1. Hallo,> Hi!

          $Statement->bindColumn( 1, $Id, PDO::PARAM_INT);

          In meinem Versuch hab ich das Beispiel aus der Handbuchseite zu bindColumn() verwendet, da ist der dritte Parameter ($type) nicht angegeben. In dem Fall erhielt ich NULL - aber auch Strings. Dann bleibt dir (neben einer Fehlermeldung in Richtung PHP) wohl nur, ohne Typangabe zu binden und die Strings zu Fuß zu casten oder mit ihnen weiterzuarbeiten. Das sollte ja PHPs automatischer Typkonvertierung eigentlich nicht schwerfallen.

          Lo!

          Oder halt mit der Typangabe String, wie ich es jetzt ja auch schon machen muss.

          Ich werde den Bug mal melden bzw. gucken ob er schon gemeldet wurde.

          Viele Grüße Novi

          --
          "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)
          1. Hello,

            Oder halt mit der Typangabe String, wie ich es jetzt ja auch schon machen muss.

            Ich werde den Bug mal melden bzw. gucken ob er schon gemeldet wurde.

            Wir sollten vorher nochmal gucken, was mit den anderen Typen ist.
            Die Typzuweisung "PDO::PARAM_NULL" halte ich für vollkommen fragwürdig, weil sie immer NULL liefert.

            Dafür benötige ich keine Datenbindung; das kann ich in der API direkt festlegen.
            Diese ganze Schnittstelle erscheint mir wenig durchdacht bezüglich der mehrschichtigen Auswertung (Werte, Typen, Gültigkeiten).

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de