ebody: Ajax Post Data - PHP Script erzeugt Notice: Undefined index:...

Hallo,

ich nutze dieses Script

$.ajax({
			type    : "POST",
			data    : {name:"test"},
			url     : "ajax.php",
			async	  : false,
			success : function(Result){
					myObj = Result;
				}
			}
);
//ajax.php

if($_POST["name"] == "test"){
	echo "text";
}

In der WebDev Console wird ausgegeben:

Notice: Undefined index: name in...ajax.php...

Warum? Was ist das Problem?

Gruß ebody

akzeptierte Antworten

  1. Setze "name" mal in doppelte Anführungszeichen. MfG

    1. Ändert leider nichts, auch nicht in ''.

      Gruß ebody

      1. Dann versuch Dich mal mit:

        <?php
        //ajax.php
        if ( isset ( $_POST ) ) {
            var_dump ( $_POST );
        } else {
            echo 'Sorry: $_POST nicht verfügbar.';
        }
        ?>
        
        1. $_POST existiert und das Array zeigt

          array(1) {
            ["name"]=>
            string(4) "test"
          } 
          

          Gruß ebody

          1. $_POST existiert und das Array zeigt

            array(1) { ["name"]=> string(4) "test" }

            Das ist der JSON String der gesendet wurde. MfG

            1. Tach!

              $_POST existiert und das Array zeigt

              array(1) {
                ["name"]=>
                string(4) "test"
              } 
              

              Das ist der JSON String der gesendet wurde.

              Nein, das ist eine var_dump()-Ausgabe. Für JSON wäre das eine ungültige Syntax. Zudem wurde kein JSON im Request verwendet.

              dedlfix.

          2. Das sieht eigentlich gut aus. Vermutlich hast Du nach einigem Gefummel irgendwo "test" und "test" verwechselt.

            Hier folgt, warum ich das glaube:

            if($_POST["name"] == "test"){
            	echo "text";
            }
            

            Übrigens musst Du Fehler abfangen...

            if( isset( $_POST["name"] ) {
              $_POST["name"] == "test" ) {
            	   echo "Test bestanden";
              } else {
                 echo "Notice: Falscher Wert: " . htmlspecialchars( $_POST["name"] );
              }
            } else {
              if ( ! isset ( $_POST ) ) {
                 echo 'Fatal: $_POST ist unbesetzt.';
              } else {
                 echo 'Fatal: $_POST["name"] ist unbesetzt.';
              }
            }
            
      2. Das Problem liegt hier:

        if($_POST["name"] == "test"){

        denn wie soll der Parser in PHP wissen, daß "name" ein Parameter sein soll. Wenn der Parser das automatisch so erkennen soll, müsstest Du dem Request einen entsprechenden Content-Type Header mitgeben und zwar einen solchen den der Parser kennt und damit weiß was er zu tun hat, also den Parameter in das POST-Array legen.

        Lösungsweg

        MfG

        1. Tach!

          Das Problem liegt hier:

          if($_POST["name"] == "test"){

          denn wie soll der Parser in PHP wissen, daß "name" ein Parameter sein soll. Wenn der Parser das automatisch so erkennen soll, müsstest Du dem Request einen entsprechenden Content-Type Header mitgeben und zwar einen solchen den der Parser kennt und damit weiß was er zu tun hat, also den Parameter in das POST-Array legen.

          Das ist gegeben, denn die verwendete jQuery-Funktion sendet bei einem Aufruf, wie dem gezeigten, einen POST-Request mit dem Default-Wert 'application/x-www-form-urlencoded; charset=UTF-8' als Content-Type. "name" und "test" befinden sich auch ordnungsgemäß an den dafür vorgesehenen Stellen im Request.

          dedlfix.

          1. [..] was man ja auch in der Konsole sehen müsste wenn das so ist. MfG

            1. Tach!

              [..] was man ja auch in der Konsole sehen müsste wenn das so ist. MfG

              Ja, hab ich in der Browser-Konsole genauso gesehen, wie es in der Dokumentation beschrieben ist. Der Code lässt sich ja recht einfach ausführen, wenn man eine Seite offen hat, in der jQuery verwendet wird.

              dedlfix.

              1. Also mal ganz ehrlich,

                data : {name:"test"},

                das ist doch völlig daneben, eine solche Notation zuzulassen. Weil es völlig verwirrend ist und alles andere als selbsterklärend. Selbsterklärend wäre sowas:

                data: "name=test"

                da sieht man wenigstens schon am CODE was da rausgeht. MfG

                1. data : {name:"test"},
                  

                  Da versuchte jquery wohl sich an json anzulehnen. Tja.

                  data: "name=test"
                  

                  Sorry, das ist ganz daneben.

                  1. data : {name:"test"},
                    

                    Da versuchte jquery wohl sich an json anzulehnen. Tja.

                    data: "name=test"
                    

                    Sorry, das ist ganz daneben.

                    Nein ist es nicht. Weil es genau dem Default Enctype application/x-www-form-urlencoded entspricht und weil man eben das am CODE sieht, was da gesendet wird.

                    Wenn man schon jQuery benutzt und wenn es ein paar Daten mehr sind, etwa aus einem Formular dann so:

                    data: $('#formid').serialize()
                    

                    dann weiß auch jeder was der Code machen soll.

                    MfG

                2. hallo

                  das ist doch völlig daneben, eine solche Notation zuzulassen. Weil es völlig verwirrend ist und alles andere als selbsterklärend. Selbsterklärend wäre sowas:

                  da sieht man wenigstens schon am CODE was da rausgeht. MfG

                  wenn schon, dann

                  -----------------------------32581496411803
                  Content-Disposition: form-data; name="modul"
                  
                  login
                  -----------------------------32581496411803
                  Content-Disposition: form-data; name="action"
                  
                  logout
                  -----------------------------32581496411803
                  Content-Disposition: form-data; name="lang"
                  
                  de
                  -----------------------------32581496411803
                  Content-Disposition: form-data; name="xhr"
                  
                  xhr
                  -----------------------------32581496411803
                  Content-Disposition: form-data; name="csrftoken"
                  
                  c34825e07e05dfa4f9c78c3c6a4107b8d74d0d14d8ce77e1bc55191283f32d954ee6ab0c63a3ec06c029a94bb3c4f66705b0570c061d036421f7a98c5121381d
                  -----------------------------32581496411803--
                  
                3. Tach!

                  Also mal ganz ehrlich,

                  data : {name:"test"},

                  das ist doch völlig daneben, eine solche Notation zuzulassen.

                  Finde ich überhaupt nicht. Was du da siehst, ist die Übergabe eines Objektes, in dem Fall ein direkt dort notiertes Objektliteral. Man könnte auch ein anderswo erzeugtes Objekt an der Stelle übergeben, dann sähe die Zeile so aus:

                  data : ein_objekt,

                  Weil es völlig verwirrend ist und alles andere als selbsterklärend.

                  jQuery ist nicht unbedingt selbsterklärend, aber es ist sehr gut dokumentiert. Und recht einfach handzuhaben.

                  Selbsterklärend wäre sowas:

                  data: "name=test"

                  Man kann die Daten auch in dieser Form als String übergeben. Aber warum sollte man sich selbst die Mühe machen, wenn jQuery dazu da ist, einem die Arbeit abzunehmen, und das Objekt selbstständig in diese Form bringt?

                  da sieht man wenigstens schon am CODE was da rausgeht.

                  Nö, das sieht man da noch gar nicht, weil du nicht siehst, was die Funktion in ihrem inneren noch so alles anstellt.

                  dedlfix.

        2. Ich habe das JQuery Script jetzt um diese Zeile ergänzt contentType: 'application/x-www-form-urlencoded; charset=UTF-8' und es funktioniert.

          $.ajax({
          			type    : "POST",
          			data    : {name:"test"},
          			url     : "ajax.php",
          			async	  : false,
                contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
          			success : function(Result){
          					myObj = Result;
          				}
          			}
          );
          
          Vielen Dank und Gruß
          ebody
          
          1. Tach!

            Ich habe das JQuery Script jetzt um diese Zeile ergänzt contentType: 'application/x-www-form-urlencoded; charset=UTF-8' und es funktioniert.

            Das ist der Default-Wert für diesen Parameter. Es ist eher unwahrscheinlich, dass diese Einfügung das Problem beseitigt hat.

            dedlfix.

            1. Ich kann bestätigen, dass es das nicht war:

              <!DOCTYPE html>
              <html>
              <head>
              <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
              <script>
              $(document).ready( function() {
                  $("button").click(function(){
                      $.ajax( {
                          url: "ajax_show_post.php",
                          type    : "POST",
                          data    : {name:"test"},
                          async   : false,
                          success : function( Result ) {
              		document.getElementById('answer').innerHTML = Result;
                          }
                      } );
                  } )
              } );
              </script>
              </head>
              <body>
              
              <button>Use Ajax to get and then run a JavaScript</button>
              
              <pre id='answer'></pre>
              
              </body>
              </html>
              

              ajax_show_post.php:

              <?php
              //ajax_show_post.php
              if ( isset ( $_POST ) ) {
                  var_dump ( $_POST );
              } else {
                  echo 'Sorry: $_POST nicht verfügbar.';
              }
              ?>
              

              Ausgabe:

              array(1) {
                ["name"]=>
                string(4) "test"
              }
              
          2. Mein Tipp wäre eher, bei Ajax auf jQuery zu verzichten und die ganze Geschichte mit ein paar eigenen diskreten Zeilen zu erledigen und zwar so daß man das bischen Code auch verstehen kann. MfG

            1. Mein Tipp wäre eher, bei Ajax auf jQuery zu verzichten und die ganze Geschichte mit ein paar eigenen diskreten Zeilen zu erledigen und zwar so daß man das bischen Code auch verstehen kann. MfG

              Du meinst:

              <!DOCTYPE html>
              <html>
              <head>
              <title>Ohne jquery geht das auch...</title>
              </head>
              <body>
              <button id="button">Klick!</button>
              <pre id='answer'></pre>
              
              <script>
              document.getElementById("button").addEventListener('click', function() {
                  var http   = new XMLHttpRequest();
                  var url    = "ajax_show_post.php";
                  var params = "name=test";
                  http.open( "POST", url, true );
              
                  http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
              
                  http.onreadystatechange = function() {
                      if( http.readyState == 4 && http.status == 200 ) {
                          document.getElementById('answer').innerHTML = http.responseText;
                      }
                  }
                  http.send( params );
              } );
              </script>
              
              </body>
              </html>
              

              ajax_show_post.php:

              <?php
              //ajax_show_post.php
              if ( isset ( $_POST ) ) {
                  var_dump ( $_POST );
              } else {
                  echo 'Sorry: $_POST nicht verfügbar.';
              }
              
              1. Ja, und das geht auch kürzer. Für den Enctype gibt es einen Default, also kannstn auch weglassen, verbleiben:

                var xhr = new XMLHttpRequest();
                xhr.open('POST','%url%', false); 
                xhr.onload = function(){ alert(this.response) };
                xhr.send("name=test");
                

                Ohne Fehlerbehandlung. Die käme mit this.status in der Callbackfunktion.

                MfG

          3. Das war leider nur ein Missverständnis meinerseits. Kurz zusammengefasst, es gab zu 99% keinen Fehler. Hier die Erklärung. https://forum.selfhtml.org/self/2018/apr/13/ajax-post-data-php-script-erzeugt-notice-undefined-index-punkt-punkt-punkt/1719315#m1719315

            Gruß ebody

            1. Das war leider nur ein Missverständnis meinerseits. Kurz zusammengefasst, es gab zu 99% keinen Fehler. Hier die Erklärung. https://forum.selfhtml.org/self/2018/apr/13/ajax-post-data-php-script-erzeugt-notice-undefined-index-punkt-punkt-punkt/1719315#m1719315

              Und ich lag auch völlig daneben, sorry 4 trouble 😉

              --
              Nagellack ist rosa.
  2. Tach!

    In der WebDev Console wird ausgegeben:

    Notice: Undefined index: name in...ajax.php...

    Warum? Was ist das Problem?

    Das Problem kann ich nicht nachstellen. Der gezeigte Code führt nicht zu dem Problem und auch deine bisherigen Antworten lassen darauf schließen, das mit dem Teil alles in Ordnung ist. Bist du sicher, dass die Notice auf die Zeile mit dem $_POST verweist? Hast du im eigentlichen Fall noch mehr oder anderen Code verwendet?

    dedlfix.

    1. Hi,

      ja, ich habe 2 Stellen im Script mit einer Ajax Funktion, die beide jeweils als url: ajax.php verwenden. Gerade als ich das nochmal getestet habe https://forum.selfhtml.org/self/2018/apr/13/ajax-post-data-php-script-erzeugt-notice-undefined-index-punkt-punkt-punkt/1719306#m1719306 hatte ich die 2. Ajax Funktion auskommentiert und auch im PHP Script die entsprechende If Abfrage und es hatte funktioniert.

      Als ich die 2. Ajax Funktion + PHP wieder "aktiviert" habe, kam es wieder zum "Fehler" und dieser scheint vor dem PC zu sitzen :( Denn beim ersten Ajax Aufruf übergebe ich nur 1 Wertepaar {name:"test"} und die erste Fehlermeldung sagt "Undefined index: nameLayer". nameLayer übergebe ich aber erst mit der 2 Ajax Funktion.

      Ich weiß wirklich nicht mehr, ob das schon genauso war als ich die Frage hier stellte. Ich meine es wäre anders gewesen und bei der ersten Fehlermeldung wurde gesagt, dass name fehlt.

      Beim nächsten mal werde ich auf jeden Fall den vollständigen Code posten oder zumindest darauf hinweisen, dass es nur ein Teil vom Code ist. Sorry!

      Gruß ebody

      1. Tach!

        Beim nächsten mal werde ich auf jeden Fall den vollständigen Code posten oder zumindest darauf hinweisen, dass es nur ein Teil vom Code ist. Sorry!

        Was auch immer wieder hilft, ist, wenn man das Problem isoliert und mit so wenig Code wie möglich in einer frischen Umgebung (z.B. neue leere Datei) nachstellt. Dann zeigt sich oftmals, ob das Problem wirklich an der vermuteten Stelle sitzt oder, wenn es nicht auftritt, vielleicht doch eine Nebenwirkung aus dem Rest des Codes ist.

        dedlfix.