Das Array php $ _POST ist beim Senden des Formulars leer

99

Ich habe ein benutzerdefiniertes CMS, das ich erstellt habe und das perfekt auf meiner Entwicklungsbox funktioniert (Ubuntu / PHP5 + / MySQL5 +).

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

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

Ich habe auch über firebug ( application/x-www-form-urlencoded; charset=utf-8) überprüft, ob die Header vom Inhaltstyp 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!


quelle
Überprüfen Sie post_max_size: Der Wert muss auf 8 MB und nicht auf 8 MB festgelegt werden. Im letzten Fall werden Sie keine Fehler sehen, aber $ _POST Größe wird auf 0 gesetzt
Sergei Karpov

Antworten:

185

Ich weiß, dass es sich bei dieser Frage um POST über ein Formular handelt, bin aber hierher gekommen, um Antworten auf ähnliche Probleme beim POSTing mit JSON-Inhaltstyp zu suchen. Ich habe die Antwort gefunden und wollte sie teilen, da sie mich viel Zeit gekostet hat.

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

Folgendes hat funktioniert, um das Problem zu beheben:

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

hoffe das hilft jemandem!

Tiltem
quelle
Diese Problemumgehung macht Sinn - es hat meinen Batch-Update-Controller repariert :)
Martin Zeitler
2
Eine andere Alternative besteht darin, den Content-TypeHeader in zu ändern application/x-www-form-urlencodedund dann Ihre Daten mit zu serialisieren $.param(dataObject). Das sollte helfen.
ŁukaszBachman
1
@ ŁukaszBachman Wie das tun , wenn Datenobjekt etwas wie ........ ist title=something&body=anything. Ich möchte das Tal von Titel und Körper bekommen. $ dataobject ["title"] gibt leer zurück. In meinem Fall ist $ _POST leer. Und der einzige Weg, es mit file_get_contents ("php: // input") zu bekommen ... außer dass es nicht json-codiert ist.
Khurshid Alam
Das ist sehr nützlich. Das Seltsame ist, dass ich keine Probleme damit habe, Json auf meinem Entwicklungscomputer zu senden, sondern mit dem Produktionscomputer.
Simon H
86

Hier ist eine weitere mögliche Ursache: Mein Formular wurde ohne WWW an domain.com gesendet. und ich hatte eine automatische Umleitung eingerichtet, um das "WWW" hinzuzufügen. Das $ _POST-Array wurde dabei geleert. Um das Problem zu beheben, musste ich mich nur an www.domain.com wenden


quelle
24
Verdammt, ein URL-Rewrite in meinem htaccesswar die Ursache dafür, dass POSTs nicht funktionierten. Ich habe automatisch einen Schrägstrich an alle URLs angehängt, aber im Code als AKTION habe ich eine URL ohne Schrägstrich verwendet. Ihre Antwort hat geholfen, da ich nie daran gedacht hätte, den .htaccess zu überprüfen. +1
binar
Ich hatte Domain-Weiterleitung (mit Maskierung) mit Godaddy, und dies scheint die Ursache des Problems zu sein. Danke!
Chris Prince
1
Ich hatte auch ein ähnliches Problem, es kam aus meiner .htaccessDatei. Die .phpErweiterung wurde von der URL entfernt, und mein Formular wurde POSTan die URL mit der Erweiterung gesendet.
Emanuel Vintilă
25

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

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

Dabei war Verzeichnis der Name von ... dem Verzeichnis. Mein POST-Array war völlig leer. Als ich mir die URL in meinem Browser ansah, wurde sie am Ende mit einem Schrägstrich angezeigt.

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

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

Mein $ _POST Array war wieder voll!

Randy Kilwag
quelle
1
Dies sollte kein Fix sein, zum Beispiel auf CakePHP, das ein gutes Routing-System hat, das hier fehlgeschlagen ist (ich meine nicht, dass Cake fehlgeschlagen ist). Vielleicht ist der Ansatz für dieses Problem nicht das Framework oder die .php-Dateien. Aber einige Konfigurationen auf Apache, ich würde gerne weitere Untersuchungen zu diesem Problem durchführen. Es ist ziemlich interessant.
James
In ähnlicher Weise hatte ich das gleiche Problem wie das OP, aber nur, wenn das <form>Tag kein nameAttribut hatte und nur im IE.
jkt123
13

Stellen Sie sicher, dass in php.ini:

  • track_vars (ist nur bei sehr alten PHP-Versionen verfügbar) ist auf eingestellt On
  • variables_order enthält den Brief P
  • post_max_size ist auf einen angemessenen Wert eingestellt (z. B. 8 MB)
  • (bei Verwendung von Suhosin-Pflaster) suhosin.post.max_varsund suhosin.request.max_varssind groß genug.

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

MrMage
quelle
1
Vielen Dank, MrMage, schätzen Sie Ihren Einblick und werden diese INI-Einstellungen überprüfen und Sie wissen lassen, ob dies den Trick getan hat. Vielen Dank!
1
Die Einstellung "post_max_size" ist mein Showstopper. Ich habe beim Senden des Formulars eine große Datei hochgeladen, und diese Einstellung enthielt einen geringeren Wert. Ich bekomme also ein leeres Post-Array, wenn ich das Formular abschicke.
Shasi Kanth
post_max_size hat es geschafft
Ahmed Ismail
9

Ich habe festgestellt, dass beim Posten von HTTP zu HTTPS das $_POSTleer ist. Dies geschah beim Testen des Formulars, aber es dauerte eine Weile, bis mir das klar wurde.

Marcos
quelle
5

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

  • In meinem Fall war auch das POST-Array leer.

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

Später stellte ich fest, dass der Browser nicht nach einer Bestätigung für die erneute Übermittlung von Formulardaten fragte, wenn ich die nach der POST-Übermittlung geladene Seite aktualisiere. Es war direkt erfrischende Seite. Als ich jedoch die Formular-URL in eine andere geändert habe, wurde der POST ordnungsgemäß übergeben und beim erneuten Aktualisieren der Seite um erneute Datenübermittlung gebeten.

Dann habe ich überprüft, was mit der tatsächlichen URL nicht stimmt. Es gab keinen Fehler mit der URL, sie zeigte jedoch auf einen Ordner ohne index.php in der URL und ich überprüfte den POST unter index.php.

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

Das hat funktioniert.

Habe es hier gepostet, damit jemand es hilfreich findet.

GUIR
quelle
1
Ich hatte das gleiche Problem, ohne '/' am Ende der URL existiert nichts in $ _REQUEST, aber mit '/' oder '/index.php' existieren alle veröffentlichten Daten in $ _REQUEST. Es könnten meine Nginx-Einstellungen oder etwas anderes sein!
MohaMad
4

Ich habe zu diesem Zeitpunkt noch keine elegante Lösung, wollte aber meine Erkenntnisse für die zukünftige Bezugnahme anderer teilen, die auf dieses Problem stoßen. Die Ursache des Problems waren 2 überschriebene PHP-Werte in einer .htaccess-Datei. Ich hatte diese beiden Werte einfach hinzugefügt, um das Dateigrößenlimit für das Hochladen von Dateien von 8 MB auf etwas Größeres zu erhöhen. Ich habe festgestellt, dass das Problem dadurch verursacht wurde, dass nur diese beiden Werte in der htaccess-Datei enthalten sind, unabhängig davon, ob sie größer oder kleiner als der Standard 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 Variablen suhosin.post.xxx/suhosin.upload.xxx zu erhöhen, aber diese hatten leider keine Auswirkungen auf dieses Problem.

Zusammenfassend kann ich das "Warum" hier nicht wirklich erklären, habe aber die Grundursache identifiziert. Mein Gefühl ist, dass dies letztendlich ein Suhosin / Htaccess-Problem ist, aber leider eines, das ich nicht lösen konnte, außer die 2 PHP-überschriebenen Werte oben zu entfernen.

Ich hoffe, das hilft jemandem in der Zukunft, da ich einige Stunden damit verbracht habe, das herauszufinden. Vielen Dank an alle, die sich die Zeit genommen haben, mir dabei zu helfen (MrMage, Andrew)


quelle
Es kann sich lohnen, diese Frage bei Serverfault zu stellen, insbesondere wenn das Problem in der Servereinrichtung / htaccess liegt.
David sagt, Monica
5
Wenn ich mich nicht irre, sollte die Größe wie 'xxM' und nicht wie 'xxMB' angegeben werden, also frage ich mich, ob das etwas damit zu tun haben könnte ...
JC Inacio
4

Ich könnte das Problem mit enctype = "application / x-www-form-urlencoded" lösen, da der Standardwert "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

RudeUrm
quelle
4

Wenn die enable_post_data_readingEinstellung deaktiviert ist, wird dies verursacht. Laut Dokumentation:

enable_post_data_reading

Wenn Sie diese Option deaktivieren, werden $ _POST und $ _FILES nicht ausgefüllt. Die einzige Möglichkeit, Postdaten zu lesen, ist dann der PHP: // Input Stream Wrapper. Dies kann nützlich sein, um Anforderungen zu vertreten oder die POST-Daten speichereffizient zu verarbeiten.

Luke A. Leber
quelle
4

Wenn Sie in einer index.php-Datei in einem Verzeichnis veröffentlichen, z. B. /api/index.php, stellen Sie sicher, dass Sie in Ihrem Formular das vollständige Verzeichnis für die Datei angeben, z

Dies

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

ODER

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

funktioniert.

Das scheitert aber

<form method="post" action="/api"> 
</form>
Sonntag G Akinsete
quelle
Ich habe genau das Gegenteil. Ich entdeckte, dass /my_uridas funktionieren würde, aber nicht /my_uri/.
Link14
hatte das gleiche Problem. Es scheint, dass Apache oder Nginx eine Weiterleitung von / api zu / api / hinzufügen
John Smith
4
<form action="test.php" method="post">
                        ^^^^^^^^^^^^^

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

Ich hatte nur geschrieben

<form action="test.php">

und vergessen, die Methode als zu spezifizieren POST !

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

Ivan
quelle
Ich kann nicht glauben, dass ich das auch vergessen habe! Ich versuche gerade einen neuen Server und habe festgestellt, dass dies an der Konfiguration liegt ... trotzdem, danke für die Erinnerung!
Samuel Aiala Ferreira
4

In meinem Fall ist beim Posten von HTTP zu HTTPS $ _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.

Игорь Носков
quelle
1
Ich denke, es hängt etwas damit zusammen, wie der Server eingerichtet ist. Ich habe die gleichen Probleme mit GoDaddy als Host. Diese Lösung hat das Problem nicht gelöst.
Acarlstein
Diese Lösung hat mein Problem gelöst. Ich hatte einen schönen Kopf.
Gokaysatir
3

gleiche Ausgabe hier!

Ich habe versucht, über eine Post-Anfrage in Postman eine Verbindung zu meinem lokalen Server-Code herzustellen, und dieses Problem hat meine Zeit sehr verschwendet!

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
Ali Shariati
quelle
Der Postbote hat mir einige Probleme mit kratzenden JSON-Werten mit Anführungszeichen oder Leerzeichen gegeben. Es erwartet ein bestimmtes Format.
Tom Anderson
2

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

POST-Methode

Wir werden einige Änderungen vornehmen, damit beim Senden der Anfrage die POST-Methode 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 jeder POST-Anforderung festgelegt 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 im Grunde, dass die gesendeten Daten im Format einer Formularübermittlung vorliegen. 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 "Bereit" festgelegt. Dies ist der gleiche Handler, den wir für die GET-Methode verwendet haben. Sie können den http.responseText hier verwenden - mit innerHTML (AHAH) in ein div einfügen, es auswerten (JSON) oder irgendetwas anderes.

http.send(params);

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

Chandu
quelle
1

In meinem Fall lag es daran, dass ich jQuery verwendet habe, um alle Eingaben auf der Seite zu deaktivieren, bevor ich jQuery zum Senden des Formulars verwendet habe. Also habe ich mein "jeden Eingang deaktivieren, auch die 'versteckten' Typen" geändert:

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

um "nur die Eingänge vom Typ 'Schaltfläche' zu deaktivieren":

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

Dies war so, dass der Benutzer nicht versehentlich zweimal auf die Schaltfläche "Los" klicken und unsere Datenbank abspritzen konnte! Es scheint, dass wenn Sie das Attribut 'disabled' auf eine Formulareingabe vom Typ 'hidden' setzen, deren Werte nicht gesendet werden, wenn das Formular gesendet wird!

Josh P.
quelle
1

Für mich wurde .htaccess umgeleitet, als mod_rewrite nicht installiert war. Installiere mod_rewite und alles ist in Ordnung.

Speziell:

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

wurde ausgeführt.

Martin Fisher
quelle
1

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 ein wirklich großes Formular ohne Uploads. php.ini ist auf upload_max_filesize = "100M" und post_max_size = "108M" eingestellt und es war sicherlich nicht das Problem in meinem Fall. Das PHP-Verhalten ist für max_input_vars dasselbe, wenn es 1000 Variablen im Formular überschreitet. Es gibt das Array _POST zurück und leert es. Ich wünschte, ich hätte das vor einer Stunde und Stunden finden können.

MyraGe
quelle
1

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

In meinem Fall lag das Problem in meinem .htaccess, als ich Variablen hinzufügte, um das maximale Upload-Limit meines PHP zu erhöhen. Mein Code war wie folgt:

php_value post_max_size 50MB
php_value upload_max_filesize 50MB

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

php_value post_max_size 50M
php_value upload_max_filesize 50M

Jetzt hat mein $ _POST die Daten wie gewohnt zurückgegeben. Hoffe das hilft jemandem in der Zukunft.

Walid Ajaj
quelle
0

Zusätzlich zu MRMages Beitrag:

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

suhosin.request.max_vars = 2500

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

Itzekocke Setzling
quelle
0

Vielleicht nicht die bequemste Lösung, aber ich habe herausgefunden, dass auf actionindex.php zugegriffen werden kann und die veröffentlichten Variablen abgerufen werden, wenn ich das Formularattribut auf die Stammdomäne setze . Wenn ich jedoch eine neu geschriebene URL als Aktion festlege, funktioniert dies nicht.

Rápli András
quelle
0

Dies ähnelt dem, was @icesar gesagt hat .

Aber ich habe versucht, Sachen auf meine API zu posten, die sich in befindet site/api/index.php, und nur auf, site/apida sie index.phpvon selbst weitergegeben werden. Dies führt jedoch anscheinend dazu, dass etwas durcheinander gerät, da ich im $_POSTlaufenden Betrieb geleert wurde. Einfach posten, um es site/api/index.phpstattdessen direkt zu lösen.

Victor Häggqvist
quelle
0

Mein Problem war, dass ich das HTML- <base>Tag verwendet habe, um die Basis-URL meiner Testseite zu ändern. Nachdem ich dieses Tag aus dem Header entfernt hatte, kamen die $_POSTDaten zurück.

Ben
quelle
0

In meinem Fall (PHP-Seite auf OVH Mutualisé Server) enctype="text/plain"funktioniert nicht ( $_POSTund das entsprechende $_REQUESTist 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?

PaulH
quelle
0

Ich habe den folgenden Fehler 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 noch meine Regeln ändern, um sicher zu bleiben, aber flexibel genug für meine Bedürfnisse :)

Luke
quelle
0

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

Ich benutze fälschlicherweise id = " your_variable_name ".

Ich habe viel Zeit damit verbracht, den Fehler zu erkennen.

Frank Hsieh
quelle
0

Stellen Sie sicher, dass die nameEigenschaft jedes Felds definiert ist.

Dadurch erstellen Sie einen leeren POST auf PHP

<input type="text" id="Phone">

Aber das wird funktionieren

<input type="text" name="Phone" id="Phone">
Miguel Montes de Oca
quelle
Ich denke, es hängt etwas damit zusammen, wie der Server eingerichtet ist. Ich habe die gleichen Probleme mit GoDaddy als Host. Diese Lösung hat das Problem nicht gelöst.
Acarlstein
-1

OK, ich dachte, ich sollte meinen Fall hier platzieren ... Ich habe das Post-Array in bestimmten Fällen leer bekommen. Das Formular funktioniert gut, aber manchmal beschweren sich Benutzer, dass sie auf die Schaltfläche "Senden" klicken, und nichts passiert ... Nachdem ich eine Weile gegraben hatte, stellte ich fest, dass mein Hosting-Unternehmen über ein Sicherheitsmodul verfügt, das Benutzereingaben überprüft und das gesamte Post-Array (nicht nur die schädlichen Daten) löscht, wenn es dies entdeckt. In meinem Beispiel hat ein Mathematiklehrer versucht, die Gleichung einzugeben: dy + dx + 0 = 0; und Daten wurden vollständig gelöscht.

Um dies zu beheben, rate ich ihm jetzt, die Daten in den Textbereich als dy + dx + 0 = Null einzugeben, und jetzt funktioniert es .... Dies kann jemandem Zeit sparen.

Mahmoud Elgabry
quelle
5
Das Auffordern von Benutzern, fehlerhaften Code zu berücksichtigen, ist kein Starter.
Freeworlder
Es ist kein wirklich fehlerhafter Code, aber Sie könnten einen neuen Hosting-Anbieter in Betracht ziehen. Alternativ können Sie die Eingabe auch in einer anderen Form veröffentlichen, z. B. in der HTML-URL-Codierung.
Tom Anderson