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!
Antworten:
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:
hoffe das hilft jemandem!
quelle
Content-Type
Header in zu ändernapplication/x-www-form-urlencoded
und dann Ihre Daten mit zu serialisieren$.param(dataObject)
. Das sollte helfen.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.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
htaccess
war 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.htaccess
Datei. Die.php
Erweiterung wurde von der URL entfernt, und mein Formular wurdePOST
an die URL mit der Erweiterung gesendet.Ich hatte ein ähnliches Problem. Es stellte sich heraus, dass dies eine einfache Lösung war. In der Form, die ich hatte
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 -
Mein $ _POST Array war wieder voll!
quelle
<form>
Tag keinname
Attribut hatte und nur im IE.Stellen Sie sicher, dass in php.ini:
track_vars
(ist nur bei sehr alten PHP-Versionen verfügbar) ist auf eingestelltOn
variables_order
enthält den BriefP
post_max_size
ist auf einen angemessenen Wert eingestellt (z. B. 8 MB)suhosin.post.max_vars
undsuhosin.request.max_vars
sind groß genug.Ich nehme an, der zweite Vorschlag von mir wird Ihr Problem lösen.
quelle
Ich habe festgestellt, dass beim Posten von HTTP zu HTTPS das
$_POST
leer ist. Dies geschah beim Testen des Formulars, aber es dauerte eine Weile, bis mir das klar wurde.quelle
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.
quelle
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 .
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
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
quelle
Wenn die
enable_post_data_reading
Einstellung deaktiviert ist, wird dies verursacht. Laut Dokumentation:quelle
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
ODER
funktioniert.
Das scheitert aber
quelle
/my_uri
das funktionieren würde, aber nicht/my_uri/
.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
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!
quelle
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
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:
nach dem:
quelle
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 ...
Einige http-Header müssen zusammen mit jeder POST-Anforderung festgelegt werden. Also setzen wir sie in diese Zeilen ...
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.
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.
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.quelle
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:
um "nur die Eingänge vom Typ 'Schaltfläche' zu deaktivieren":
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!
quelle
Für mich wurde .htaccess umgeleitet, als mod_rewrite nicht installiert war. Installiere mod_rewite und alles ist in Ordnung.
Speziell:
wurde ausgeführt.
quelle
Ich habe nur Stunden damit verbracht, ein ähnliches Problem zu beheben. Das Problem in meinem Fall war das
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.
quelle
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:
Später stelle ich fest, dass die Werte xxM und nicht xxMB mögen sollten und als ich sie geändert habe in:
Jetzt hat mein $ _POST die Daten wie gewohnt zurückgegeben. Hoffe das hilft jemandem in der Zukunft.
quelle
Zusätzlich zu MRMages Beitrag:
Ich musste diese Variable setzen, um das Problem zu lösen, dass einige
$_POST
Variablen (mit einem großen Array> 1000 Elemente) verschwunden sind:"
request
", nicht "post
" war die Lösung ...quelle
Vielleicht nicht die bequemste Lösung, aber ich habe herausgefunden, dass auf
action
index.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.quelle
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/api
da sieindex.php
von selbst weitergegeben werden. Dies führt jedoch anscheinend dazu, dass etwas durcheinander gerät, da ich im$_POST
laufenden Betrieb geleert wurde. Einfach posten, um essite/api/index.php
stattdessen direkt zu lösen.quelle
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$_POST
Daten zurück.quelle
In meinem Fall (PHP-Seite auf OVH Mutualisé Server)
enctype="text/plain"
funktioniert nicht ($_POST
und das entsprechende$_REQUEST
ist leer), die anderen Beispiele unten funktionieren. ``
Mehr hier: method = "post" enctype = "text / plain" sind nicht kompatibel?
quelle
Ich habe den folgenden Fehler von Mod Security erhalten:
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 :)
quelle
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.
quelle
Stellen Sie sicher, dass die
name
Eigenschaft jedes Felds definiert ist.Dadurch erstellen Sie einen leeren POST auf PHP
Aber das wird funktionieren
quelle
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.
quelle