Nico: Post-Daten mit Ajax senden

Hallo!

Ich hab auf einer Seite ein Formular mit diversen Eingabefeldern.
Beim Submit (bzw. OnClick) sollen die Daten aus den Feldern an ein Script (PHP) gesendet werden, das sie in eine Datenbank einträgt.
Im OnClick-Event hab ich folgende Funktion:

  
function SaveVors(){  
        window.clearInterval(Schleife); //Ich hatte vorher ein Interval gestartet, das alle 5 sec Daten aus einem PHP Script holt  
        http_request.abort(); // falls das Script gerade noch was senden sollte  
        url='SaveVors.php';  
        http_request.onreadystatechange=blank; //Funktion ohne Befehle  
        http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');  
        http_request.open('POST', url, true);  
        var string = "Name="+document.vors.Name.value+"&text="+escape(document.vors.text.value);  
        http_request.send(string);  
        document.vors.text.value="";  
        Schleife=window.setInterval("Request()", 5000); // Abgebrochene Schleife wieder zum Laufen bringen  
}  

Mit alerts hab ich schonmal feststellen können, dass der Code ganz durchläuft. Aber Das Script SaveVors.php wird anscheinend gar nicht aufgerufen. Als ersten Befehl hab ich da nämlich einen Email-Versand an mich. Und da kommt nie was an.
Vielleicht könnt ihr mir da weiterhelfen. Ich sitze da jetzt schon ne ganze Weile davor.

Nico

  1. hi,

    Mit alerts hab ich schonmal feststellen können, dass der Code ganz durchläuft. Aber Das Script SaveVors.php wird anscheinend gar nicht aufgerufen.

    Das bezweifle ich - wenn kein Fehler im Javascript-Code aufgetreten ist, sollte es aufgerufen werden.

    Aber es erhält wahrscheinlich nicht die Daten, die du erwartest.

    Als ersten Befehl hab ich da nämlich einen Email-Versand an mich. Und da kommt nie was an.

    Das ist ja auch keine sonderlich gute Kontrolle.
    Ich würde beispielsweise mal die empfangenen Daten in eine Session schreiben, und sie von dort mit einem zweiten Kontrollscript auslesen.

    Vermutlich würdest du feststellen, dass $_POST leer ist.
    Wenn always_populate_raw_post_data in deiner Konfiuration auf on ist, dürfte aber $HTTP_RAW_POST_DATA Daten enthalten.

    Damit auch $_POST gefüllt wird, solltest du die Daten auch so versenden, wie es ein normales HTML-Formular mit method="post" das auch tun würde - als "application/x-www-form-urlencoded".

    Nutze also die Methode setRequestHeader() des XMLHTTPRequest-Objektes, und generiere damit - _vor_ dem Aufruf der Methode send() - noch einen Header mit dem Namen "Content-Type" und dem Value "application/x-www-form-urlencoded":

    http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo,

      Vermutlich würdest du feststellen, dass $_POST leer ist.
      Wenn always_populate_raw_post_data in deiner Konfiuration auf on ist, dürfte aber $HTTP_RAW_POST_DATA Daten enthalten.

      Es tut hier nichts zur Sache, aber man kann übrigens auch unabhängig von dieser Einstellung die rohen POST-Daten lesen, und zwar über php://input. Das liest man über fopen aus:

      $str = '';  
      $inputstream = fopen('php://input', 'r');  
      while (!feof($inputstream)) {  
       $str .= fread($inputstream, 8192);  
      }  
      fclose($inputstream);
      

      http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

      Bin ich ganz dumm oder steht das nicht bereits im Code desAusgangspostings?

      Mathias

      1. hi,

        http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

        Bin ich ganz dumm oder steht das nicht bereits im Code desAusgangspostings?

        Ich bin der Dumme - ja, es steht dort bereits.

        Gut, dann wäre jetzt also zu überprüfen, warum das Script nicht das tut, was es soll.
        Die Beobachtung, dass das Versenden der Mail nicht geschieht, ist als "Debugging" ja etwas wenig.
        Da könnte man jetzt also entweder wie bereits vorgeschlagen die übergebenen Werte mal zur Kontrolle in eine Session o.ä. schreiben, und mit einem weiteren Script von dort auslesen.
        Oder aber, man lässt das Script zunächst mal nur $_POST (und ggf. $_GET, $_SERVER und was einen sonst noch interessiert) zur Kontrolle ausgeben, mit dem Content-Type text/plain - und lässt sich dass dann vom readystateHandler im AJAX-Script über responseText zur kontrolle mal alert'en.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Ja. Ich hatte mein Script vorher ja mit direktem Post und Submit laufen. Das hab ich einfach rauskopiert und am Anfang das if($_POST[xxx]!=""){ und am Ende eine } weggemacht und gehofft, dass es funktioniert. Das alert hat jetzt eine Fehlmermeldung gebracht und ich hab das Script gleich verbessert.
          Die POST-Daten sind jetzt aber wirklich nicht angekommen. Leider ist auch always_populate_raw_post_data off. Da das auf einem FreeWebspace läuft, kann ich das auch nicht ändern. Hat noch jemand ne Idee, wie ich die Daten da kinkriege?
          Danke schonmal für die bis jetzt geleistete Hilfe.

          Nico

          1. Ich weiß, woran es gelegen hat: Das SetRequestHeader... muss nach der Open-Anweisung sein.

            Nico