Я использую PHP 5.3.8 с Apache 2.0. Я также использую Symfony 2, но это не то, где скрипт терпит неудачу. У меня есть форма с переменными массива:
<form action="/app_dev.php/admin/position/create" method="post"> <input type="text" id="po_name" name="po[name]" required="required" maxlength="50"> <input type="text" id="po_role" name="po[role]" required="required" maxlength="20"> </form>
Непосредственно в файле app_dev.php (чтобы исключить Symfony из проблемы) я делаю:
echo file_get_contents("php://input"); // outputs: po%5Bname%5D=Developer&po%5Brole%5D=ROLE_USER var_dump($_POST); // outputs: array(1) { ["po"]=> array(1) { ["name"]=> string(9) "Developer" } } die();
В основном он сохраняет только первую переменную в массиве. Если я изменю имя переменной с po [role] на ba [role], то $ _POST выведет:
array(1) { ["po"]=> array(1) { ["name"]=> string(9) "Developer" }, ["ba"]=> array(1) { ["role"]=> string(9) "ROLE_USER" } }
Типичные проблемы, которые я обнаружил, которые могут вызвать эту проблему, обусловлены следующей конфигурацией php.ini, я также даю вам то, что является моими значениями:
max_execution_time = 30 max_input_time = 60 max_input_nesting_level = 64 max_input_vars = 1000 post_max_size = 8M upload_max_filesize = 2M memory_limit = 128M
Эти значения кажутся разумными, и я думаю, что они не вызывают проблемы, но не могут быть на 100% уверены.
У меня нет Suhosin установлен, как я читал, это может вызвать аналогичные проблемы тоже.
Он также похож на эту проблему, но для данного решения потребуется переписать компонент HttpFoundation Symfony.
Также я не хочу переписывать переменную формы без и массива ( например, po [name] в po_name), поскольку форма автоматически генерируется Symfony, и это, по-видимому, является основной функцией, с которой PHP должен справиться.
Кто-нибудь имеет представление об этой проблеме?
PS: это похоже на проблему, описанную здесь . Плюс проблема возникает в той же версии Suse (SUSE Linux Enterprise Server 11).
То, что вы предлагаете, отлично работает для меня. Полный тестовый код:
<html> <body> <pre> <?php if (isset($_POST) && !empty($_POST)) { echo file_get_contents("php://input"); echo "\n\n"; var_dump($_POST); } ?> </pre> <form action="" method="post"> <input type="text" id="po_name" name="po[name]"> <input type="text" id="po_role" name="po[role]"> <input type="submit"> </form> </html>
Результат с фрагментами «один» и «два»:
po%5Bname%5D=one&po%5Brole%5D=two array(1) { ["po"]=> array(2) { ["name"]=> string(3) "one" ["role"]=> string(3) "two" } }
Мой PHP:
PHP Version 5.3.3-7+squeeze14 CGI/FastCGI Apache/2.2 Suhosin Patch 0.9.9.1
Здесь нет проблем, поэтому он должен четко работать. Если этот тестовый код не работает для вас, лучшим вариантом является ошибка PHP в вашей версии (или ошибка в некоторых, казалось бы, несвязанных функциях, о которых нигде не упоминалось).
Наконец, мы решили обновить нашу версию PHP до более поздней версии (5.3.15), и теперь она отлично работает. Так что это была проблема с этим 5.3.8, по крайней мере, у нас была версия.