Enrico: Kann "Notice: Undefined index" nicht nachvollziehen

Hallo,

ich übergebe Variablen von PHP an Javascript bzw. möchte sie übergeben, um nachfolgend mit ihnen weiter arbeiten zu können:

  
<body>  
   <script type="text/javascript">  

~~~~~~php
  
   <?php  
  
      if (!isset ($_POST['NrHauptmenue']) && $_POST['NrHauptmenue'] == "undefined")  
      {  
         echo "NrHauptmenue = 0";  
      }  
  
      if (!isset ($_POST['NrUntermenue']) && $_POST['NrUntermenue'] == "undefined")  
      {  
         echo "NrUntermenue = 0";  
      }  
  
   ?>  

~~~~~~javascript
  
   $(document).ready(function()  
   {  
      $(window).load(function()  
      {  
         $.ajaxSetup({cache:true});  
  
         $.getScript('JS/Menues.js',function()  
         {  
            Navigation (NrHauptmenue, NrUntermenue);  
         });  
  
         $.ajaxSetup({cache:false});  
      });  
   });  
  
   </script>  

... weiter mit HTML ...

Was ich nicht nachvollziehen kann, ist, warum mir bei den beiden Anweisungen, in denen ich die Variablen NrHauptmenue und NrUntermenue auf Existenz hin prüfe, der Hinweis ausgegeben wird, dass hier undefinierte Indizes vorlägen, denn genau darauf hin prüfe ich ja.

Welcher Fehler ist mir bei der Prüfung unterlaufen?

Vielen Dank für eure Hilfe und Gruß,
Enrico
PS: Ich kann wahrscheinlich leider erst nach Feierabend antworten

  1. Hi,

    Hallo,

    if (!isset ($_POST['NrHauptmenue']) && $_POST['NrHauptmenue'] == "undefined")

    Wenn NrHauptmenue NICHT gesetzt ist UND NrHauptmenue == undefined

    Wie soll NrHauptmenue, wenn es gar nicht gesetzt ist, den Wert "undefined" haben?

    Vermutlich wolltest Du hier || statt && nutzen.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    1. Hallo Andreas,

      stimmt, etwas nicht-Gesetztes kann auch keinen undefinierten Zustand haben.

      Werde ich heute Abend gleich ausprobieren, danke Dir aber an dieser Stelle schon mal prophylaktisch für die Lösung dieses Problems :-)

      Gruß
      Enrico

      1. Moin Enrico,

        stimmt, etwas nicht-Gesetztes kann auch keinen undefinierten Zustand haben.

        Verwechselst du vielleicht gerade JavaScript (typeof blub == 'undefined') und PHP? In PHP gibt es keinen Operator, der dir 'undefined' zurück gibt für eine nicht gesetzte Variable.

        LG,
         CK

  2. Lieber Enrico,

    if (!isset ($_POST['NrHauptmenue']) && $_POST['NrHauptmenue'] == "undefined")

    Besser so:

    if (!array_key_exists('NrHauptmenue', $_POST) || empty($_POST['NrHauptmenue'])) {}

    Mittlerweile nutze ich lieber array_key_exists() anstatt isset() - obwohl das nur eine aufwendigere Schreibweise ist, für die ich Dir keinen vernünftigen Grund nennen kann. Aber das logische Oder (||) und die empty()-Funktion solltest Du allen Ernstes beherzigen (Christian Kruse hat es schon angedeutet)!

    Auch wenn es in JS erlaubt ist und vom Parser entsprechend interpretiert wird, solltest Du trotzdem am Ende der Zuweisungszeile ein Semikolon notieren:

    echo 'NrHauptmenue = 0;';
    ----------------------^

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Tach!

      if (!isset ($_POST['NrHauptmenue']) && $_POST['NrHauptmenue'] == "undefined")
      Besser so:
      if (!array_key_exists('NrHauptmenue', $_POST) || empty($_POST['NrHauptmenue'])) {}
      Mittlerweile nutze ich lieber array_key_exists() anstatt isset() - obwohl das nur eine aufwendigere Schreibweise ist, für die ich Dir keinen vernünftigen Grund nennen kann.

      Es gibt nur einen Grund, array_key_exists() zu verwenden: isset() liefert bei null als Inhalt ein false, array_key_exists() hingegen auch dann ein true - natürlich nur, wenn der Schlüssel existiert. Der Unterschied ist jedoch bei $_POST irrelevant, weil null nicht von PHP in dieses Array geschrieben wird.

      dedlfix.

      1. Lieber dedlfix,

        Es gibt nur einen Grund, array_key_exists() zu verwenden: isset() liefert bei null als Inhalt ein false, array_key_exists() hingegen auch dann ein true - natürlich nur, wenn der Schlüssel existiert.

        das war mir jetzt ein "fachlich hilfreich" wert. Ganz herzlichen Dank dafür!

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. Hallo Felix,

          wie vermutet habe ist dieser Hinweis jetzt weg.

          Danke Dir recht herzlich für Deine Hilfe.

          Gruß
          Enrico