it-swarm.com.de

php $ _POST-Array bei Formularübergabe leer

Ich habe ein benutzerdefiniertes CMS, das ich gebaut habe und das perfekt auf meiner Dev-Box (Ubuntu/PHP5 +/MySQL5 +) funktioniert.

Ich habe es gerade für meinen Kunden in die Produktionsbox verschoben und jetzt werden alle Formularsendungen als leere $ _POST-Arrays angezeigt.

Ich habe einen Trick gefunden, um zu überprüfen, ob die Daten tatsächlich mit file_get_contents('php://input'); übergeben werden, und die Daten werden dort einwandfrei angezeigt - die $_POST/$_REQUEST-Arrays sind immer leer.

Ich habe auch über Firebug (application/x-www-form-urlencoded; charset=utf-8) bestätigt, dass die Inhaltstyp-Header korrekt sind.

Dieses Problem tritt unabhängig davon auf, ob ein Formular über AJAX oder ein reguläres Formular gesendet wird.

Jede Hilfe wird sehr geschätzt!

78
Mike D

Ich weiß, dass es sich bei dieser Frage um POST über ein Formular handelte, aber ich kam hierher und suchte nach Antworten zu ähnlichen Problemen beim POSTing mit JSON-Inhaltstyp. Ich fand die Antwort und wollte sie teilen, da es mich viel Zeit kostete.

Bei Verwendung des JSON-Inhaltstyps wird das $ _POST-Array nicht gefüllt (glaube ich nur bei mehrteiligen Formularen)

Hier haben wir gearbeitet, um das Problem zu beheben:

$rest_json = file_get_contents("php://input");
$_POST = json_decode($rest_json, true);

hoffe das hilft jemandem!

152
tiltem

Hier ist eine andere mögliche Ursache - mein Formular wurde ohne WWW an domain.com gesendet. und ich hatte eine automatische Weiterleitung eingerichtet, um das "WWW" hinzuzufügen. Das $ _POST-Array wurde dabei geleert. Um das Problem zu beheben, musste ich mich bei www.domain.com anmelden

82
icesar

Ich hatte ein ähnliches Problem. Es stellte sich als einfache Lösung heraus. In der Form, die ich hatte 

<form action = "verzeichnis" method = "post"> 

dabei war Verzeichnis der Name des Verzeichnisses. Mein POST - Array war völlig leer. Wenn ich mir die URL in meinem Browser ansah, wurde am Ende ein Schrägstrich angezeigt. 

Das Hinzufügen des Schrägstrichs am Ende meiner Aktion hat den Trick bewirkt - 

<form action = "directory /" method = "post">

Mein $ _POST-Array war wieder voll!

19
Randy Kilwag

Stellen Sie sicher, dass in der php.ini:

  • track_vars (ist nur in sehr alten PHP Versionen verfügbar) ist auf On gesetzt.
  • variables_order enthält den Buchstaben P
  • post_max_size ist auf einen angemessenen Wert gesetzt (z. B. 8 MB)
  • (bei Verwendung eines Suhosin-Patches) suhosin.post.max_vars und suhosin.request.max_vars sind groß genug.

Ich denke, der zweite Vorschlag von mir wird Ihr Problem lösen.

11
MrMage

Ich bin auf ein ähnliches, aber etwas anderes Problem gestoßen und es hat zwei Tage gedauert, um das Problem zu verstehen.

  • In meinem Fall war auch das Array POST leer.

  • Dann überprüft mit file_get_contents ('php: // input'); und das war auch leer.

Später stellte ich fest, dass der Browser keine Bestätigung für das erneute Senden von Formulardaten nach der Aktualisierung der Seite nach dem Senden von POST anforderte. Die Seite wurde direkt aktualisiert. Als ich jedoch die Formular-URL in eine andere umwandelte, übergab sie POST ordnungsgemäß und bat um erneute Datenübertragung, wenn versucht wurde, die Seite zu aktualisieren.

Dann habe ich überprüft, was mit der tatsächlichen URL falsch ist. Es gab keinen Fehler mit der URL, es zeigte jedoch auf einen Ordner ohne index.php in der URL und ich überprüfte POST in der index.php.

Hier bezweifelte ich, dass die Umleitung von/nach /index.php dazu führt, dass POST - Daten verloren gehen und die URL mit der anhängenden index.php an die URL getestet wird.

Das hat funktioniert.

Posten Sie es hier, damit jemand es hilfreich finden würde. 

5
GUIR

Ich habe festgestellt, dass beim Posten von HTTP auf HTTPS der $_POST leer ist ..__ Dies geschah beim Testen des Formulars, es dauerte jedoch eine Weile, bis mir das klar wurde.

4
Marcos

Ich habe an diesem Punkt keine elegante Lösung, wollte aber meine Erkenntnisse für die zukünftige Referenz anderer Personen, die auf dieses Problem stoßen, mitteilen. Die Ursache des Problems bestand darin, dass die PHP-Werte in einer .htaccess-Datei überschrieben wurden. Ich hatte diese beiden Werte einfach hinzugefügt, um das Dateigrößenlimit für Datei-Uploads von den Standard-8MB auf etwas Größeres zu erhöhen. Ich habe beobachtet, dass das einfache Problem, diese 2 Werte in der htaccess-Datei zu haben, unabhängig davon, ob sie größer oder kleiner als der Standardwert sind .

php_value post_max_size xxMB
php_value upload_max_filesize xxMB

Ich habe zusätzliche Variablen hinzugefügt, um hoffentlich die Grenzwerte für alle suhosin.post.xxx/suhosin.upload.xxx-Variablen zu erhöhen, die jedoch bei diesem Problem keine Auswirkung hatten. 

Zusammenfassend kann ich das "Warum" hier nicht wirklich erklären, aber ich habe die Ursache identifiziert. Mein Gefühl ist, dass dies letztendlich ein Suhosin/htaccess-Problem ist, aber leider nicht gelöst werden konnte, außer die oben genannten 2 php überschriebenen Werte zu entfernen. 

Ich hoffe, das hilft jemandem in der Zukunft, als ich eine Handvoll Stunden damit tötete, das herauszufinden. Danke an alle, die sich die Zeit genommen haben, mir dabei zu helfen (MrMage, Andrew)

4
Mike D

Wenn die Einstellung enable_post_data_reading deaktiviert ist, wird dies verursacht. Laut der Dokumentation:

enable_post_data_reading

Durch Deaktivieren dieser Option werden $ _POST und $ _FILES nicht gefüllt. Die einzige Möglichkeit, Postdaten zu lesen, ist dann der Eingabedaten-Wrapper von php: //. Dies kann nützlich sein, um Anfragen zu senden oder die POST -Daten speichereffizient zu verarbeiten.

4
Luke A. Leber

Ich könnte das Problem mit enctype = "application/x-www-form-urlencoded" lösen, da der Standard "text/plain" ist. Wenn Sie $ DATA einchecken, ist der Separator ein Leerzeichen für "Text/Plain" und ein Sonderzeichen für "Urlencoded". 

Herzliche Grüße Frank

4
RudeUrm

Wenn Sie in einer index.php-Datei in einem Verzeichnis posten, beispielsweise /api/index.php, vergewissern Sie sich, dass Sie in Ihrem Formular das vollständige Verzeichnis für die Datei angeben, z

Diese 

<form method="post" action="/api/index.php"> 
</form>

OR

<form method="post" action="/api/"> 
</form>

funktioniert.

Aber das schlägt fehl

<form method="post" action="/api"> 
</form>
3
<form action="test.php" method="post">
                        ^^^^^^^^^^^^^

Okay, das war dumm und ich werde mich in der Öffentlichkeit in Verlegenheit bringen, aber ich habe ein kleines Testskript für etwas in PHP erstellt und als mein $_POST-Array leer war, war StackOverflow der erste Ort, an dem ich gesucht habe und nicht finde die Antwort, die ich brauchte.

Ich hatte nur geschrieben 

<form action="test.php">

und vergessen, die Methode als POST anzugeben!

Ich bin sicher, dass jemand kichern wird, aber wenn dies jemandem hilft, der dasselbe tut, dann macht es mir nichts aus! Wir alle machen es von Zeit zu Zeit!

3
user3070485

gleiche Ausgabe hier!

ich habe versucht, eine Verbindung zu meinem lokalen Servercode per Postanforderung herzustellen, und dieses Problem verschwendete meine Zeit.

für alle, die ein lokales Projekt verwenden (z. B. Postbote): Verwenden Sie Ihre IPv4-Adresse (geben Sie ipconfig in cmd ein) anstelle des Schlüsselworts "localhost" . In meinem Fall:

vor:

localhost/app/login

nach dem:

192.168.1.101/app/login
2
Ali Shariati

VERWEIS: http://www.openjs.com/articles/ajax_xmlhttp_using_post.php

POST-Methode

Wir werden einige Änderungen vornehmen, so dass die Methode POST beim Senden der Anfrage verwendet wird ...

var url = "get_data.php";
var params = "lorem=ipsum&name=binny";
http.open("POST", url, true);

//Send the proper header information along with the request
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.setRequestHeader("Content-length", params.length);
http.setRequestHeader("Connection", "close");

http.onreadystatechange = function() {//Call a function when the state changes.
  if(http.readyState == 4 && http.status == 200) {
    alert(http.responseText);
  }
}
http.send(params);

Einige http-Header müssen zusammen mit einer Anforderung von POST gesetzt werden. Also setzen wir sie in diese Zeilen ...

http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.setRequestHeader("Content-length", params.length);
http.setRequestHeader("Connection", "close");

Mit den obigen Zeilen sagen wir grundsätzlich, dass die gesendeten Daten das Format einer Formularübermittlung haben. Wir geben auch die Länge der Parameter an, die wir senden.

http.onreadystatechange = function() {//Call a function when the state changes.
  if(http.readyState == 4 && http.status == 200) {
    alert(http.responseText);
  }
}

Wir haben einen Handler für das Änderungsereignis "Status bereit" festgelegt. Dies ist derselbe Handler, den wir für die GET-Methode verwendet haben. Sie können hier den http.responseText verwenden - in ein div mit innerHTML (AHAH), eval it (JSON) oder einem anderen Element einfügen.

http.send(params);

Zum Schluss senden wir die Parameter mit der Anfrage. Die angegebene URL wird erst geladen, nachdem diese Zeile aufgerufen wurde. In der GET-Methode ist der Parameter ein Nullwert. Bei der Methode POST werden die zu sendenden Daten jedoch als Argument der Sendefunktion gesendet. Die Variable params wurde in der zweiten Zeile als lorem=ipsum&name=binny deklariert. Wir senden also zwei Parameter - 'Lorem' und 'Name' mit den Werten 'ipsum' und 'binny'.

1
Chandu

Für mich war .htaccess eine Umleitung, wenn mod_rewrite nicht installiert war. Installiere mod_rewite und alles ist gut.

Speziell:

<IfModule !mod_rewrite.c>
  ErrorDocument 404 /index.php
</Ifmodule>

wurde ausgeführt.

1
Martin Fisher

In meinem Fall war es, weil ich jQuery zum Deaktivieren aller Eingaben auf der Seite verwendet habe, bevor das Formular mit jQuery abgeschickt wurde .. __ Ich änderte daher "Alle Eingaben deaktivieren, auch die" versteckten "Typen:

$(":input").attr("disabled","disabled"); 

"Nur die Eingaben vom Typ" Button "deaktivieren":

$('input[type=button]').attr('disabled',true);

Der Benutzer konnte also nicht versehentlich zweimal auf die Schaltfläche "Los" klicken und die Datenbank "DB!" Aufpolieren. Wenn Sie das Attribut "disabled" auf eine "verborgene" Formulareingabe setzen, werden deren Werte nicht übernommen gesendet, wenn das Formular gesendet wird!

1
Josh P

Ich habe nur Stunden damit verbracht, ein ähnliches Problem zu beheben. Das Problem in meinem Fall war das

max_input_vars = "1000"

standardmäßig in der php.ini. Ich hatte eine wirklich riesige Form ohne Uploads. php.ini ist auf upload_max_filesize = "100M" und post_max_size = "108M" gesetzt, und in meinem Fall war dies sicherlich nicht das Problem. Das Verhalten von PHP ist für max_input_vars dasselbe, wenn es 1000 Variablen im Formular überschreitet. Es gibt ein leeres _POST-Array zurück. Ich wünschte, ich hätte das vor Stunden und Stunden gefunden.

0
user3242171

Ich habe folgende Fehlermeldung von Mod Security erhalten:

Access denied with code 500 (phase 2). Pattern match "((select|grant|delete|insert|drop|alter|replace|truncate|update|create|rename|describe)[[:space:]]+[A-Z|a-z|0-9|\*| |\,]+[[:space:]]+(from|into|table|database|index|view)[[:space:]]+[A-Z|a-z|0-9|\*| |\,]|UNION SELECT.*\'.*\'.*,[0-9].*INTO.*FROM)" at REQUEST_BODY. [file "/usr/local/Apache/conf/modsec2.user.conf"] [line "345"] [id "300013"] [rev "1"] [msg "Generic SQL injection protection"] [severity "CRITICAL"]

Nachdem ich meine mod-Sicherheitskonfiguration zum Testen entfernt hatte, funktionierte alles wie erwartet. Jetzt muss ich nur meine Regeln ändern, um sicher und flexibel genug für meine Bedürfnisse zu bleiben :)

0
Luke

Zusätzlich zum Beitrag von MRMage:

Ich musste diese Variable setzen, um das Problem zu lösen, dass einige $_POST-Variablen (mit einem großen Array> 1000 Elementen) verschwunden sind:

suhosin.request.max_vars = 2500

"request", nicht "post" war die Lösung ...

0

Mein Problem war, dass ich den HTML-Code <base> zum Ändern der Basis-URL meiner Testseite verwendet habe. Nachdem ich dieses Tag aus dem Header entfernt hatte, kamen die $_POST-Daten zurück.

0
Ben

Dies ähnelt dem, was @icesar sagte .

Ich habe jedoch versucht, Zeug an meine API zu senden, das sich in site/api/index.php befindet, und zwar nur an site/api, da es von selbst an index.php übergeben wird. Dies führt jedoch anscheinend dazu, dass etwas durcheinander gebracht wird, da sich mein $_POST auf der Fliege geleert hat. Einfach in site/api/index.php posten, anstatt es zu lösen.

0

Stellen Sie sicher, dass Sie im Eingabe-Tag name = " your_variable_name " verwenden.

Ich verwende fälschlicherweise id = " your_variable_name ".

Ich habe viel Zeit gebraucht, um den Fehler zu finden.

0
Frank Hsieh

Ich weiß, das ist alt, wollte aber meine Lösung teilen.

In meinem Fall lag das Problem in meinem .htaccess, da ich Variablen hinzugefügt habe, um das maximale Upload-Limit meines PHP zu erhöhen. Mein Code war so:

php_value post_max_size 50MB
php_value upload_max_filesize 50MB

Später stelle ich fest, dass die Werte xxM und nicht xxMB sein sollten und als ich sie geändert habe:

php_value post_max_size 50M
php_value upload_max_filesize 50M

jetzt hat mein $ _POST die Daten wie üblich zurückgegeben. Hoffe, das hilft jemandem in der Zukunft.

0
Walid Ajaj

In meinem Fall (php-Seite auf dem OVH mutualisé-Server) enctype="text/plain" funktioniert nicht ($_POST und der entsprechende $_REQUEST ist leer), die anderen Beispiele unten funktionieren . `

<form action="?" method="post">
<!-- in this case, my google chrome 45.0.2454.101 uses -->
<!--     Content-Type:application/x-www-form-urlencoded -->
    <input name="say" value="Hi">
    <button>Send my greetings</button>
</form>

<form action="?" method="post" enctype="application/x-www-form-urlencoded">
    <input name="say" value="Hi">
    <button>Send my application/x-www-form-urlencoded greetings</button>
</form>

<form action="?" method="post"  enctype="multipart/form-data">
    <input name="say" value="Hi">
    <button>Send my multipart/form-data greetings</button>
</form>

<form action="?" method="post" enctype="text/plain"><!-- not working -->
    <input name="say" value="Hi">
    <button>Send my text/plain greetings</button>
</form>

`

Mehr hier: method = "post" enctype = "text/plain" sind nicht kompatibel?

0
PaulH

In meinem Fall ist beim Posten von HTTP zu HTTPS der Wert $ _POST leer. Das Problem war, dass das Formular eine Aktion wie diese hatte. //Example.com Als ich die URL auf https://example.com korrigierte, verschwand das Problem.

Vielleicht nicht die bequemste Lösung, aber ich habe herausgefunden, dass auf index.php zugegriffen werden kann, wenn ich das form action-Attribut auf die Stammdomäne setzt. Wenn ich jedoch eine umgeschriebene URL als Aktion einstelle, funktioniert sie nicht.

0
Rápli András