Simpler Blackout: 7 Zeilen Code... Hilfe!

Hallo,

seit eine Stunden - Blackout. Lacht nicht. Warum ist die verdammte $a undefiniert?

<?
$a = "test";
if (($a==0)||($a==""))
    echo "nicht definiert";
else
    echo "definiert";
?>

Wie vergleiche ich denn eine Variable mit einer leeren Zeichenkette?

Danke.

  1. Wie vergleiche ich denn eine Variable mit einer leeren Zeichenkette?

    a == null

    oder ?

    1. a == null

      null hin, null her, aber wie kann man sowas erklären?

      <?
      $a="test";
      if ($a==0)
      {
          echo "nicht definiert";
          }
      else
          echo "definiert";
      ?>

      Es ist zum sterben, $a ist doch nicht gleich 0, oder verstehe ich da was nicht?

      1. Hi, Stromausfall ;-)

        $a="test";
        if ($a==0)

        Es ist zum sterben, $a ist doch nicht gleich 0, oder verstehe ich da was nicht?

        Vielleicht hilft dir http://forum.de.selfhtml.org/archiv/2002/4/8635/#m48146

        LG Orlando

      2. Ich verstehe zwar nicht viel von PHP, also fast nichts, dafür Java um so besser, und ich würde Sagen das der Vergleich $a==0 nicht funktioniert da "test" ein String und 0 eine Zahl (Integer) ist. Versuch mal folgendes if($a == "0")

        Ansonsnten ka..

        1. Versuch mal folgendes if($a == "0")

          Danke Erlöser, der nichts von PHP versteht.

          Der Blackout löst sich langsam auf. Die Bedingung sollte eigentlich so aussehen ($a==0 && $a==""), dann klappt's auch mit dem Nachbar :). Ich habe im Eifer des Gefechts das logische ODER wieder mal unterschätzt.

          Kiska

          1. Der Blackout löst sich langsam auf. Die Bedingung sollte eigentlich so aussehen ($a==0 && $a==""), dann klappt's auch mit dem Nachbar :). Ich habe im Eifer des Gefechts das logische ODER wieder mal unterschätzt.

            Das bringt auch nichts, da Du dann mit

            <?
            $a = "0";
            if ($a==0 && $a=="")
                echo "nicht definiert";
            else
                echo "definiert";
            ?>

            auch wieder "definiert" bekommst!! Mit $a = 0; allerdings "nicht definiert" wobei - das nur am Rande - eine Wertzuweisung von "0" oder auch von "" nichts mit definiert oder nicht definiert zu tun hat ;-)

            Clemens

            1. Das bringt auch nichts, da Du dann mit

              stimmt auch! Es sollte einfach in Anführungszeichen stehen.
              Die ultimative Endversion:

              <?
              $a = "test";
              if ($a=="0" && $a=="")
                  echo "nicht definiert";
              else
                  echo "definiert";
              ?>

              Bin isch froh, dass isch eusch habe:)
              Kiska

              1. Hallo,

                Die ultimative Endversion:

                <?
                $a = "test";
                if ($a=="0" && $a=="")

                na also, die "0" sind langsam "gesickert", jetzt machste noch aus dem && ein || dann biste genau bei dem was du erreichen willst - und bei meinem posting von 00:37

                Gruß
                der_bernd
                [der sich verzweifelt fragt, wann diese Bedingung jemals erfüllt werden könnte]

                1. na also, die "0" sind langsam "gesickert", jetzt machste noch aus dem && ein || dann biste genau bei dem was du erreichen willst - und bei meinem posting von 00:37

                  ... oder bei meinem von 00:23 Uhr...

                  Mei, san wir gut!! :-))

                  Clemens

                  1. Hallo Clemens,

                    und sorry liebes Forum ;-) ich kann's mir grad nicht verkneifen.

                    ... oder bei meinem von 00:23 Uhr...
                    Mei, san wir gut!! :-))

                    Gut gesagt - oder andersrum:

                    "Mein Gott, was ist der Frager wieder "beratungsresisdent" *g*

                    Gruß
                    der_bernd

          2. Hallo Kiska,

            Die Bedingung sollte eigentlich so aussehen ($a==0 && $a==""), dann klappt's auch mit dem Nachbar :).

            Und wie willst du diesen Zustand erreichen?
            Die $a soll _gleichzeitig_ den Wert 0 haben _und_ leer sein?
            Klar, greift dann dein else-Zweig sowie was drinnen steht - aber so richtig "sauber" kommt mir das nicht vor, spätestens bei komplexeren Sachen fällst du mit der Methode bestimmt auf die Nase..

            So erschlägst du alle Eventualitäten:

            <?
            $a = "";
            if (($a=="0") || ($a=="") || (!$a))
                echo "nicht definiert";
            else
                echo "definiert";
            ?>

            Gruß
            der_bernd

        2. Hallo Leute

          Ich verstehe zwar nicht viel von PHP, also fast nichts,[...]

          Ich auch.

          [...] und ich würde Sagen das der Vergleich $a==0 nicht funktioniert da "test" ein String und 0 eine Zahl (Integer) ist.

          Daran dachte ich auch.

          Versuch mal folgendes if($a == "0")

          Halt. Stop. Was soll das in Worten heissen? Wenn $a == "0" stimmt, dann ist doch $a irgend ein String (hier "0") und das wäre nur der Fall, wenn vorher $a genau dieser String zugewiesen worden wäre (durch $a = "0"). In diesem Fall wäre doch $a mit dem Wert "0" initialisiert und damit auch definiert.

          Dess weiteren: Wann ist (!$a) == true?
          Ist das, wenn...
          a) ... $a delkariert, jedoch noch nicht definiert ist.
          b) ... $a deklariert, definiert, jedoch noch nicht initialisiert ist.
          c) ... $a == "" bzw. $a == 0 bei Zahlen ist.

          Hab den durchblick nicht so ganz. Werde es jedoch gleich mit anderen Sprachen austesten.

          MfG

          Tom2

  2. Hallo Blackout ;-)

    if (!$a)
    ist dein Freund.

    Warum deine Lösung nicht greift, bin ich selber grad am grübeln, evtl. hängt es an der "Veroderung" von nummerischer Variable ( ==0) und Textvariable ( =="")

    Gruß
    der_bernd

    1. if (!$a)
      ist dein Freund.

      Der !&a ist mein Freund, wenn die Variable nicht existiert. Die gibt's aber und ich möchte nur prüfen, ob Sie nicht evtl. leer ist oder den Wert 0 hat. Der Wert kommt aus einem Eingabefeld, das nicht leer sein darf und auch nicht 0 als Ziffer enthalten.

      Warum deine Lösung nicht greift, bin ich selber grad am grübeln, evtl. hängt es an der "Veroderung" von nummerischer Variable ( ==0) und Textvariable ( =="")

      Logisch ist es nicht, da ich zwei Bedingungen mit ODER verknüpfe und nur einer braucht falsch zu sein, um in den else zu gehen. Die $a=="" ist bereits die falsche Bedingung.

      Hier nochmal die vereinfachte Variante zum Kopfzerbrechen:
      <?
      $a = "test";
      if ($a==0)
          echo "nicht definiert";
      else
          echo "definiert";
      ?>

      Kiska

      1. Hallo Kiska,

        Der !&a ist mein Freund, wenn die Variable nicht existiert. Die gibt's aber und ich möchte nur prüfen, ob Sie nicht evtl. leer ist oder den Wert 0 hat. Der Wert kommt aus einem Eingabefeld, das nicht leer sein darf und auch nicht 0 als Ziffer enthalten.

        Na, dann sag's doch gleich so ausführlich, was du eigentlich möchtest. Das geht wirklich nur mit:
        ($a=="0")
        siehe dazu auch den Link von Orlando.

        Gruß
        der_bernd

      2. Moin,

        Der !&a ist mein Freund, wenn die Variable nicht existiert. Die gibt's aber und ich möchte nur prüfen, ob Sie nicht evtl. leer ist oder den Wert 0 hat. Der Wert kommt aus einem Eingabefeld, das nicht leer sein darf und auch nicht 0 als Ziffer enthalten.

        Dein Problem liegt in der automatischen Typumwandlung, versuch doch einfach mal
        if((int)$a != 0) echo "nichtnull"; else echo "null";
        das wäre am ehesten was du beschrieben hast.

        Ansonsten wandelt PHP die Typen hin und wieder um, weiss auch nicht mehr genau wie das Schema aussah, Fakt ist aber dass ("" == 0), ("test" == 0), (0 == "") und (0 == "test") alle wahr sind.

        Wenn du überprüfen willst ob die beiden zu vergleichenden Dinge den gleichen Wert _und_ den gleichen Typ haben, musst du 3 Gleichheitszeichen benutzen (ab PHP 4): ("" === 0) ist falsch. Bei Eingabefeldern aus Formularen handelt es sich allerdings immer um Strings.

        Vor diesem Hintergrund ist auch das Ergebnis deiner Abfrage klar:
        Wenn ($a == 0) wahr ist, dann ist (($a == 0) oder irgendwas anderes) natürlich auch wahr.

        --
        Henryk Plötz
        Grüße aus Berlin

  3. Hallo!

    <?
    $a = "test";
    if (($a=="0")||($a==""))
        echo "nicht definiert";
    else
        echo "definiert";
    ?>

    versuche es doch einfach mal so, dann ist klar, dass es sich auch beim Vergleich jedes mal um einen String und nicht um eine nummerische Variable handelt!

    Clemens