Geheimnisvoll leeres $ _POST-Array

21

Ich habe folgende HTML / PHP Seite:

<?php
if(empty($_SERVER['CONTENT_TYPE'])) {
    $type = "application/x-www-form-urlencoded";
    $_SERVER['CONTENT_TYPE'] = $type;
}

echo "<pre>";
var_dump($_POST);
var_dump(file_get_contents("php://input"));
echo "</pre>";
?>

<form method="post" action="test.php">
<input type="text" name="test[1]" />
<input type="text" name="test[2]" />
<input type="text" name="test[3]" />
<input type="submit" name="action" value="Go" />
</form>

Wie Sie sehen, wird das Formular gesendet und die erwartete Ausgabe ist ein POST-Array mit einem Array, das die ausgefüllten Werte enthält, und einem Eintrag "action" mit dem Wert "Go" (Schaltfläche). Egal welche Werte ich in die Felder eingebe; das ergebnis ist immer:

array(2) {
  ["test"]=>
  string(0) ""
  ["action"]=>
  string(2) "Go"
}
string(16) "test=&action=Go&"

Irgendwie wird das Array mit dem Namen test geleert, die Variable "action" schafft es durch.

Ich habe die Live HTTP Headers-Erweiterung für Firefox verwendet, um zu überprüfen, ob die POST-Felder gesendet werden, und sie tun es. Die relevanten Informationen aus Live-HTTP-Headern (mit a, b und c als Werte in den Textfeldern):

Content-Type: application/x-www-form-urlencoded
Content-Length: 51
test%5B1%5D=a&test%5B2%5D=b&test%5B3%5D=c&action=Go

Hat jemand eine Ahnung, warum das passiert? Ich bin total am ausflippen, es hat mich schon so viel Zeit gekostet ...

Aktualisieren:

Wir haben dies auf verschiedenen Servern versucht, auf Windows-Boxen funktioniert es, auf dem Ubuntu-Server mit PHP Version 5.2.4 (mit Suhosin) nicht. Es funktioniert sogar auf einem anderen Server, auch mit Ubuntu und der gleichen PHP-Version, auch mit Suhosin.

Ich habe die beiden Dateien unterschieden, dies ist die Ausgabe ( diff php.ini phps.ini):

270c270
< memory_limit = 32M
---
> memory_limit = 16M      ; Maximum amount of memory a script may consume (16MB)
415c415
< variables_order = "EGCSP"
---
> variables_order = "EGPCS"
491d490
< include_path = ".:"
1253a1253,1254
> extension=mcrypt.so
>

In dieser Datei ist phps.ini der Server, auf dem es läuft, und php.ini ist der aktuelle Server. Sieht so aus, als gäbe es hier keine Probleme, oder?

rael_kid
quelle
4
Suhosin kann sein.
Oberst Shrapnel
Ja, Suhosin klingt wie ein wahrscheinlicher Kandidat
SeanJA
Könnten Sie uns weitere Informationen geben? Suhosin ist auf dem Server installiert. Soll ich es ausschalten? Soll ich die Einstellungen ändern?
rael_kid
3
Versuchen Sie dies, es wird protokolliert, wenn es ein Sihosin-Problem ist. hardened-php.net/suhosin/configuration.html#suhosin.simulation
Ich habe versucht, den Simulationsmodus einzuschalten. Das Array ist noch geleert. Ich kann die Protokolldateien jedoch nicht finden ...
rael_kid

Antworten:

2

Funktioniert es ohne die expliziten Indizes? Versuchen:

<form method="post" action="test.php">
<input type="text" name="test[]" />
<input type="text" name="test[]" />
<input type="text" name="test[]" />
<input type="submit" name="action" value="Go" />
</form>
Matthew Groves
quelle
Nein, geht auch nicht.
rael_kid
Setzen Sie nicht die Indizes für das Testarray - sie bringen die POST-Variablenerkennung durcheinander
adam
2
Okay, ich kann sie weglassen. Aber es löst mein Problem nicht.
rael_kid
2

Es gibt eine Reihe von möglichen Gründen, warum das Post-Array leer sein könnte - es kann sein, dass es zu Fehlern von Menschen / Entwicklern kommt. Ich habe genau dieses Problem beim Upgrade von PHP 5.2 auf 5.4 festgestellt. Es war einfach, aber die Fehlersuche dauerte Stunden. In unserer config.php-Datei hatten wir die folgende Anweisung, um $ _POST-Arrays zu verarbeiten:

if (!get_magic_quotes_gpc()) {
    if (isset($_POST)) {
        foreach ($_POST as $key => $value) {
            $_POST[$key] =  trim(addslashes($value));
        }
    }

Magic Quotes war einmal aktiviert und in PHP-Versionen bis 5.2 funktionierte das oben Genannte einwandfrei, aber alles über Version 5.2 wird nicht verarbeitet und ein leeres Array wird zurückgegeben.

Wenn Sie nicht eingeschaltet haben, error_reporting()schlagen wir vor, dass Sie dies tun, und ich bin sicher, dass Sie in der Lage sind, das Problem zu beheben.

Sie sollten auch nach veralteten Systemfunktionen " magic_quotes" suchen, da deren Verwendung einfach keine Ergebnisse liefert. Ich hoffe das hilft. Viel Glück. JCS :)

user1360528
quelle
1

Es gibt Fehlerberichte zu diesem oder ähnlichen Problemen im Bugtracker von PHP:

Leider wird keine Lösung erwähnt, aber Sie können versuchen, einen anderen CONTENT_TYPE oder gar keinen Inhaltstyp festzulegen.

joschi
quelle
Diese Bugs sind ähnlich, aber nicht die gleichen wie meine. Ich habe versucht, den Inhaltstyp festzulegen (wie Sie im Code-Snippet in meiner ursprünglichen Antwort sehen können). Wenn ich überhaupt keinen Inhaltstyp eingestellt habe, funktioniert es auch nicht ...
rael_kid
1

Hatte ein ganz ähnliches Problem. Nun, zuallererst habe ich eine ganze Weile gebraucht, um zu diesem Beitrag zu gelangen. Um den Namen meines Problems herauszufinden, musste ich die PHP-Konsole installieren und herausfinden, wie ich sie verwenden soll. Debuggen Sie den Code, von dem ich nichts wusste. Gehen Sie dem Problem auf den Grund und bleiben Sie verwirrt.

Die Lösung war eigentlich ziemlich einfach. Drücken Sie in Chrome F12, um zu den Entwicklertools zu gelangen, wählen Sie "Netzwerk" und versuchen Sie, Ihr Formular zu veröffentlichen. Verfolgen Sie die Post-Anfrage und sehen Sie sich den Status an. Wenn es 301 ist (oder etwas anderes als 200) - Sie haben genau dasselbe Problem, das ich bis vor kurzem hatte!

Mein neuer Host-Provider leitete http://my_site.com auf http://www.my_site.com um . Ich musste lediglich einige Einstellungen im Rahmen meines CMS ändern (deins ist möglicherweise anders, aber in gewisser Weise ähnlich) als

$Configuration['BASE_URL'] = 'http://my_site.com'

zu

$Configuration['BASE_URL'] = 'http://www.my_site.com'

Und voila, die Magie und die Regenbogen und die Einhörner und meine Seite funktionieren endlich!

PS: Messing mit Ihren Hosting-Einstellungen könnte auch Ihr Problem lösen ... Wenn Ihr Problem meinem natürlich ähnlich ist ...

Barmaley
quelle
Verdammt. Umleitung war auch mein Problem!
Aman Alam,
0

Ich bin mir nicht sicher, aber ich habe

name="test[1]"

usw. kann PHP verwirren. Ich würde die Eingabenamen in test_1, test_2 ändern und sehen, was passiert.


quelle
7
@haavee: Nein, PHP wirbt für diese Verwendung: php.net/manual/en/faq.html.php#faq.html.arrays
Boldewyn
Ich habe dies versucht, auf diese Weise funktionieren die Variablen, aber sie sind nicht in einem Array.
rael_kid
@haavee: Nee, die Notation verwirrt PHP nicht, es ist die Standardverwendung von PHP + -Formen. Siehe Boldewyns Link. :)
OK danke! habe heute etwas neues gelernt.
1
@adam: "Es ist auch möglich, Ihren Arrays bestimmte Schlüssel zuzuweisen".
0

In Basis-PHP fällt mir nur eine Konfigurationsoption ein, die dies verhindern könnte: post_max_sizeÜberprüfen Sie Ihre php.ini und die zugehörigen Dateien, um sicherzustellen, dass dieser Wert korrekt ist und nicht auf Null oder einen ungültigen Wert wie ein alphabetisches Zeichen gesetzt ist .

Suhosin ermöglicht das Blockieren von Post-Variablen unter einer Vielzahl von Bedingungen, einschließlich der Array-Länge und der Länge des Variablennamens. Durchsuchen Sie Ihre php.ini-Dateien nach "suhosin", um festzustellen, ob Einstellungen vorhanden sind, insbesondere, wenn diese mit "suhosin.post" beginnen. ( Weitere Informationen zu den Parametern, an die ich denke, finden Sie unter http://www.hardened-php.net/suhosin/configuration.html#suhosin.post.max_array_depth .)

Abgesehen von einem großen Fehler in der Konfiguration, bei dem ein Wert auf eins oder null gesetzt wurde, sind Ihr Code (und Ihre Variablen) leider kurz genug, so dass dies ein langer Weg ist. Wenn das leer bleibt, ist mein nächster Vorschlag, die Apache- und PHP-Konfigurationen zu sichern, die Verzeichnisse zu bereinigen, die Pakete neu zu installieren und die Konfigurations-Chunks wieder einzurichten, bis der Code wieder funktioniert (alternativ: Aktualisieren Sie diesen Server Das funktioniert mit Configs vom nicht funktionierenden Server, bis beide kaputt sind. Da der gleiche-OS-gleiche-PHP-Server ordnungsgemäß funktioniert, ist dies mit ziemlicher Sicherheit ein Konfigurationsfehler auf dem fehlerhaften Server, aber das ist ein ziemlich großer Heuhaufen, den Sie durchsuchen müssen.

Versionskontrolle von / etc wird dringend empfohlen, bevor Sie damit beginnen - schauen Sie sich das etckeeper-Paket an. (Eigentlich empfehle ich seine Verwendung, Punkt. Erhebliche Schonung der geistigen Gesundheit, insbesondere auf einem Computer, auf dem mehr als eine Person Root-Zugriff hat.)

Zed
quelle
Meine post_max_size ist 8M, ich denke das wäre genug. Meine php.ini enthält keine Einträge mit Suhosin, daher kann das ein Problem sein ... Hat Suhosin eigene Conf-Dateien?
Rael_kid
Nicht standardmäßig, aber die Einstellungen für jedes PHP-Modul können von jeder Datei in /etc/php5/conf.d auf einem Debian-System vorgenommen werden, und daher nehme ich auch ein Ubuntu-System an. Wie ich schon sagte, das war so etwas wie ein langer Schuß. Dennoch würde ich damit beginnen, jede Konfigurationsdatei gegen ein funktionierendes System auszutauschen.
Zed
0

Ich habe überall Formulareingabefehler, seit ich von "stable" auf Debian "testing" umgestiegen bin. Es scheint, dass Apache2 oder PHP5 nicht mehrere Elemente in der Übermittlung mit demselben Namen verarbeitet. Beispielsweise; Ihr Formular hat zwei Eingaben mit dem Namen "mo". In der Vergangenheit hat es nur einer der Werte für "mo" geschafft. Jetzt scheint das Formular alle Daten nach dem ersten Auftreten eines doppelten Schlüssels zu löschen. Noch nicht sicher. Ich versuche immer noch, es herauszufinden.


quelle
0

Versuchen Sie, die php.ini von dem Server, der auf diesem Server läuft, zu kopieren (sichern Sie jedoch zuerst die php.ini des nicht funktionierenden Servers). Wenn dies der Fall ist, ist etwas drin (vielleicht die Variablen_Ordnung oder möglicherweise Speicher, beides ist jedoch unwahrscheinlich).

Soßengesicht
quelle
0

Versuchen Sie, Ihre Senden-Schaltfläche umzubenennen. Ich hatte in der Vergangenheit einige Probleme damit. Eine Eingabe mit dem Namen 'action' scheint das Problem zu sein.


quelle
0

Das Folgende sollte dir NICHT helfen. Es widerspricht allem, was ich über die PHP-Konfiguration weiß:

< variables_order = "EGCSP"
---
> variables_order = "EGPCS"

Dieser ist auf mich gesprungen. Ihre Superglobalen werden in verschiedenen Reihenfolgen registriert. Dies sollte kein Problem sein, da Sie keine register_globalsVariablen verwenden und sich nicht darauf verlassen, sollte es kein Problem sein, die Reihenfolge zu ändern, in der die Variablen verarbeitet werden.

Aber Sie sollten es definitiv versuchen und die Reihenfolge der Variablen ändern.

pacey
quelle
0

Sogar dieses OP ist ziemlich alt, aber heute bin ich auf ein ähnliches Problem gestoßen.

Nachdem wir einige Stunden damit verbracht hatten, immer wieder Millionen verschiedener Dinge zu überprüfen, stellten wir schließlich fest, dass nach dem letzten Update auf die PHP 5.6.17- Version in unserem cPanel unter den PHP-Standardeinstellungen das http nicht ausgewählt war.Bildbeschreibung hier eingeben

Und nach dem Setzen auf ausgewählt - alles wieder normal :-)

Bildbeschreibung hier eingeben

Hoffe, es hilft allen zukünftigen Lesern

Nikita Kurtin
quelle
0

Wenn dies jemand anderem helfen kann ... Ich habe nur Stunden damit verbracht, ein ähnliches Problem zu beheben, und das Problem war das Limit von max_input_vars = "1000" für php.ini. Stellen Sie sicher, dass Sie die php.ini-Werte für upload_max_filesize, post_max_size und max_input_vars überprüfen. Ein Überschreiten führt zu einem leeren $ _POST-Array.

Chris L.
quelle