Mam następującą stronę HTML / PHP:
<?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>
Jak widać, formularz zostanie przesłany, a oczekiwanym wynikiem jest tablica POST z jedną tablicą zawierającą wypełnione wartości i jednym wpisem „akcja” o wartości „Go” (przycisk). Jednak bez względu na to, jakie wartości wprowadzam w polach; wynik jest zawsze:
array(2) {
["test"]=>
string(0) ""
["action"]=>
string(2) "Go"
}
string(16) "test=&action=Go&"
W jakiś sposób tablica o nazwie test zostaje opróżniona, zmienna „action” się przedostaje.
Użyłem rozszerzenia Live HTTP Headers dla Firefoksa, aby sprawdzić, czy pola POST zostały przesłane, i robią to. Odpowiednie informacje z nagłówków Live HTTP (z a, bi wypełnionymi jako wartości w polach tekstowych):
Content-Type: application/x-www-form-urlencoded
Content-Length: 51
test%5B1%5D=a&test%5B2%5D=b&test%5B3%5D=c&action=Go
Czy ktoś ma pojęcie, dlaczego tak się dzieje? Przerażam się na ten, już tyle mnie to kosztowało ...
Aktualizacja:
Próbowaliśmy tego na różnych serwerach, na Windowsach to działa, na serwerze Ubuntu z PHP w wersji 5.2.4 (z Suhosin), nie działa. Działa nawet na innym serwerze, również z Ubuntu i tą samą wersją PHP, również z zainstalowanym Suhosin.
Zróżnicowałem dwa pliki, to jest output ( 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
>
W tym phps.ini jest ten z serwera, na którym działa, a php.ini jest obecny. Wygląda na to, że nie ma tu żadnych problemów, prawda?