Kalle: Unterscheidung zwischen NULL und 0

Hallöle,

ich werde noch zum Elch, probiere schon eine Stunde mit NULL, is_null(), empty() und so weiter.

$bild_nr = NULL;

Warum zum Kuckuck sind BEIDE Abfragen TRUE:

if ( $bild_nr == NULL OR empty($bild_nr) ) echo "TRUE";
if ( $bild_nr == 0 ) echo "TRUE";

Ich muß zwischen dem Wert 0 und der Leere NULL unterscheiden. Wie?

LG Kalle

  1. Hi Kalle,

    Ich muß zwischen dem Wert 0 und der Leere NULL unterscheiden. Wie?

    in PHP entspricht NULL dem Wert 0, hat aber nicht den gleichen Typ. NULL hat keinen Typ, 0 ist vom Typ Integer. Du musst also noch den Typen prüfen, was mit einem geeigneten Vergleichsoperator geschieht. Schau Dir am besten außerdem noch die Typen-Vergleichs-Tabelle von PHP an.

    Gruß,
    Andreas.

    1. Hi Andreas,

      in PHP entspricht NULL dem Wert 0, hat aber nicht den gleichen Typ. NULL hat keinen Typ, 0 ist vom Typ Integer. Du musst also noch den Typen prüfen, was mit einem geeigneten Vergleichsoperator geschieht. Schau Dir am besten außerdem noch die Typen-Vergleichs-Tabelle von PHP an.

      Danke. Ich übergebe einen Wert per Parameter (Index eines Arrays), kann also eine gültige 0 sein. Diese 0 ist dann vom Typ string und ich wandle ihn in integer um ...
        if ( gettype( $bild_nr ) == string ) $bild_nr = $bild_nr *1; // integer erzwingen

      ... damit ich richtig mit === vergleichen kann:
        for ( $i=0; $i<count( $bilder ); $i++ ) {
          echo "<br><input type='radio' name='bild_nr' value='".$i."'";
          if ( $bild_nr === $i ) echo " checked";
          echo "> ".$bilder[$i][0]."\n";
        }

      So, das klappt. Puhhh ...

      Kalle

      1. echo $begrüßung;

        Ich übergebe einen Wert per Parameter (Index eines Arrays), kann also eine gültige 0 sein. Diese 0 ist dann vom Typ string und ich wandle ihn in integer um ...
          if ( gettype( $bild_nr ) == string ) $bild_nr = $bild_nr *1; // integer erzwingen

        Recht umständlich.
        Ist string eine von dir definierte Konstante? Wenn nicht, solltest du Stringbegrenzer ('', "") um Strings verwenden.
        Besser wäre hier jedoch die Funktion is_string($bild_nr). Für das Umwandeln muss man auch keine Rechenoperation bemühen. Durch einen Typecast kommt viel besser zum Ausdruck was du eigentlich vorhast.
        Und noch besser wird es, wenn du die Funktion intval() verwendest. Die liefert auf alle Fälle eine Integer-0 bei Werten die keine Zahl darstellen, auch wenn man sie mit einem Array oder einem Objekt füttert.

        for ( $i=0; $i<count( $bilder ); $i++ ) {
            echo "<br><input type='radio' name='bild_nr' value='".$i."'";
            if ( $bild_nr === $i ) echo " checked";

        Wenn du das intval($bild_nr) gleich hier einbaust, kannst du dir die obige Prüfung ganz sparen.
              if (intval($bild_nr) == $i)
                echo " checked";

        echo "> ".$bilder[$i][0]."\n";
          }

        Aus welchem Grund wird $bild_nr eigentlich NULL?
        Verlässt du dich etwa auf den register_globals-Mechanismus oder hast du eine Initialisierung von $bild_nr mit einem definierten Wert "vergessen"? Wenn ja, dann sind deine Korrektur- und Typ-Test-Versuche nur Bemühungen, das Kind aus dem Brunnen zu holen. Dann solltest du dich lieber um ordentliches Variablenhandling bemühen.

        echo "$verabschiedung $name";

        1. Hallo, dedlfix,

          danke dir für deine ausführlichen Erklärungen.

          Hatte schon den Verdacht, dass meine Art recht umständlich ist.

          Genaugenommen habe ich mich um PHP auch nicht sonderlich bemüht, war für mich nur Schnittstelle zur Datenbank, mit der einige begrenzte Aufgaben zu erledigen waren. Aber nun steht die Umsetzung eines langelebigen ProgrammSystems ins Haus.

          Da muss ich das Konzept von PHP verstehen, etwa Objektorientierung.

          LG Kalle

  2. Ich muß zwischen dem Wert 0 und der Leere NULL unterscheiden. Wie?

    if($variable === NULL) echo 'NULL';
    if($variable === 0) echo '0';