Таинственно пустой массив $ _POST

21

У меня есть следующая страница 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>

Как видите, форма будет отправлена, и ожидаемым результатом будет массив POST с одним массивом в нем, содержащим заполненные значения и одной записью «action» со значением «Go» (кнопка). Однако независимо от того, какие значения я ввожу в поля; результат всегда:

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

Каким-то образом массив с именем test очищается, переменная "action" справляется с этим.

Я использовал расширение Live HTTP Headers для Firefox, чтобы проверить, отправляются ли поля POST, и они это делают. Соответствующая информация из заголовков Live HTTP (с заполнением a, b и c в виде значений в текстовых полях):

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

Кто-нибудь имеет представление о том, почему это происходит? Я схожу с ума по этому, это уже стоило мне так много времени ...

Обновить:

Мы пробовали это на разных серверах, на Windows-боксах это работает, на сервере Ubuntu с PHP версии 5.2.4 (с Suhosin) это не так. Он даже работает на другом сервере, также с Ubuntu и той же версией PHP, также с установленным Suhosin.

Я разошел два файла, это вывод ( 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
>

В данном случае phps.ini - это сервер, на котором он работает, а php.ini - текущий. Похоже, здесь нет проблем, верно?

rael_kid
источник
4
Сухосин может быть.
полковник Шрапнель
Да, suhosin звучит как вероятный кандидат
SeanJA
Не могли бы вы дать больше информации? Suhosin установлен на сервере, я должен выключить его? Должен ли я изменить настройки?
rael_kid
3
Попробуйте это, он будет регистрировать, если это проблема с sihosin. hardened-php.net/suhosin/configuration.html#suhosin.simulation
Я попытался включить режим симуляции. Массив все еще очищен. Я не могу найти файлы журнала, однако ...
rael_kid

Ответы:

2

Работает ли без явных индексов? Пытаться:

<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>
Мэтью Гроувс
источник
Нет, тоже не работает.
rael_kid
Не устанавливайте индексы для тестового массива - они портят определение переменной POST
Адам
2
Хорошо, я могу их оставить Но это не решает мою проблему.
rael_kid
2

Существует ряд возможных причин, по которым массив записей может быть пустым - есть вероятность, что он возвращается к ошибке человека / разработчика. Я столкнулся с этой проблемой при обновлении с PHP 5.2 до 5.4, это было просто, но потребовались часы, чтобы найти ошибку. В нашем файле config.php у нас был следующий оператор для обработки массивов $ _POST:

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

Когда-то были включены магические кавычки, и в версиях PHP до 5.2 вышеприведенное работало нормально, но все, что выше версии 5.2, не будет обрабатываться, и возвращается пустой массив.

Если вы не error_reporting()включили, я предлагаю вам это сделать, и я уверен, что вы сможете устранить проблему.

Вам также следует проверить устаревшие системные функции, например " magic_quotes", поскольку их использование просто не дает результатов. Надеюсь, это поможет. Удачи. JCS :)

user1360528
источник
1

В багтрекере PHP есть сообщения об ошибках по этой или схожим проблемам:

К сожалению, в нем не упоминается решение, но вы можете попытаться установить другой тип CONTENT_TYPE или вообще не указывать тип содержимого.

Joschi
источник
Эти ошибки похожи, но не совпадают с моими. Я попытался установить тип контента (как вы можете видеть в фрагменте кода в моем исходном ответе). Если я вообще не установлю тип контента, он тоже не будет работать ...
rael_kid
1

Была довольно похожая проблема. Ну, во-первых, мне понадобилось много времени, чтобы добраться до этого поста. Чтобы выяснить название моей проблемы, мне пришлось установить консоль PHP, понять, как ее использовать. Отладка кода, о котором я ничего не знал. Получить к корню проблемы и все еще быть озадаченным.

Решение было довольно простым на самом деле. В Chrome нажмите F12, чтобы перейти к инструментам разработчика, выберите Сеть, попробуйте опубликовать форму. Проследить пост-запрос, посмотреть статус. Если его 301 (или что-то еще, кроме 200) - у вас точно такая же проблема, как у меня до недавнего времени!

Мой новый хост-провайдер перенаправлял http://my_site.com на http://www.my_site.com , и все, что мне нужно было сделать, это изменить некоторые настройки как часть моей CMS (ваши могут отличаться, но в некотором роде)

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

в

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

И вуаля, магия и радуга, единороги и мой сайт наконец-то работают!

PS Перемешивание с настройками вашего хостинга также может решить вашу проблему ... Если ваша проблема, конечно, похожа на мою ...

Barmaley
источник
Черт возьми. Перенаправление тоже было моей проблемой!
Аман Алам
0

Я не уверен, но имея

name="test[1]"

и т.д. может запутать php. Я бы изменил входные имена на test_1, test_2 и посмотрю, что произойдет.


источник
7
@haavee: Нет, PHP рекламирует это использование: php.net/manual/en/faq.html.php#faq.html.arrays
Болдевин
Я пробовал это, таким образом, переменные работают, но они не в массиве.
rael_kid
@haavee: нет, нотация не смущает PHP, это стандартное использование форм PHP +. Смотрите ссылку Болдевин. :)
Хорошо, спасибо! узнал что-то новое сегодня.
1
@adam: «Также возможно назначить определенные ключи для ваших массивов».
0

В базовом PHP я могу думать только об одном параметре конфигурации, который может это сломать post_max_size, поэтому проверьте ваш php.ini и связанные файлы, чтобы убедиться, что это значение является нормальным и не имеет нулевого или недопустимого значения, такого как буквенный символ ,

Suhosin позволяет блокировать переменные post в различных условиях, включая такие, как длина массива и длина имени переменной. Grep ваши файлы php.ini для «suhosin», чтобы увидеть, есть ли какие-либо настройки, особенно что-нибудь, начинающееся с «suhosin.post». (См. Http://www.hardened-php.net/suhosin/configuration.html#suhosin.post.max_array_depth для более подробной информации о параметрах, о которых я думаю.)

К сожалению, если исключить серьезную ошибку в конфигурации, в которой какое-либо значение установлено равным единице или нулю, ваш код (и переменные) достаточно короткие, чтобы это было чем-то большим. Если это окажется пустым, моим следующим предложением будет сделать резервную копию ваших конфигов Apache и PHP, очистить их каталоги, очистить пакеты, переустановить и начать возвращать блоки конфигурации обратно на место, пока код не перестанет работать (поочередно, начните обновлять этот сервер это работает с конфигами с неработающего сервера, пока они оба не сломаны). Так как у вас сервер с одинаковой ОС, тот же PHP работает правильно, это почти наверняка ошибка конфигурации где-то неисправного сервера, но это довольно большой стог сена для поиска.

Перед началом работы настоятельно рекомендуется управление версией / etc - посмотрите на пакет etckeeper. (На самом деле, я рекомендую его использовать, точка. Большая экономия здравомыслия, особенно на машине, где более одного человека имеют root-доступ.)

Zed
источник
Мой post_max_size 8M, я думаю, этого будет достаточно. Мой php.ini не содержит записей с suhosin, так что это может быть проблемой ... Есть ли у suhosin свои собственные conf-файлы?
rael_kid
Не по умолчанию, но настройки для любого модуля PHP могут быть установлены любым файлом в /etc/php5/conf.d в системе Debian, и, таким образом, я предполагаю также систему Ubuntu. Как я уже сказал, это было что-то очень длинное. Тем не менее, я бы начал с различий каждого конфигурационного файла с работающей системой.
Зед
0

У меня возникают сбои при отправке формы везде, так как я обновил Debian до «тестирования» со «стабильного». Похоже, что apache2 или php5 не обрабатывают несколько элементов в представлении с одинаковым именем. Например; Ваша форма имеет два входа с именем "mo". В прошлом только одно из значений для "mo" могло бы пройти. Теперь форма, кажется, отбрасывает все данные после первого появления дубликата ключа. Пока не уверен. Все еще пытаюсь понять это.


источник
0

Попробуйте скопировать файл php.ini с сервера, который работает на этот сервер (сначала сделайте резервную копию php.ini неработающего сервера). Если это так, то это что-то есть (возможно, variable_order или, возможно, память, хотя вряд ли и то и другое).

gravyface
источник
0

Попробуйте переименовать кнопку «Отправить» во что-то кроме действия. У меня были некоторые проблемы с этим в прошлом. Кажется, проблема в том, чтобы иметь вход с именем action.


источник
0

Следующее НЕ должно помочь вам. Это противоречит всему, что я знаю о конфигурации PHP:

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

Этот прыгнул на меня. Ваши суперглобалы регистрируются в разных порядках. Это просто не должно быть проблемой, потому что, поскольку вы не используете register_globalsи не полагаетесь на них, не должно быть проблем с изменением порядка, в котором обрабатываются переменные порядка.

Но вы должны обязательно попробовать и изменить порядок переменных.

Pacey
источник
0

Даже этот ОП довольно старый, но сегодня я столкнулся с подобной проблемой.

Потратив несколько часов на проверку миллионов разных вещей снова и снова, в итоге обнаружил, что после последнего обновления до версии PHP 5.6.17 в нашей cPanel с настройками по умолчанию PHP http не был выбран.введите описание изображения здесь

И после установки его на выбранное - все возвращается на круги своя :-)

введите описание изображения здесь

Надеюсь, что это поможет любым будущим читателям

Никита Куртин
источник
0

Если это может помочь кому-то еще ... Я просто потратил часы, чтобы исправить подобную проблему, и проблема заключалась в ограничении max_input_vars = "1000" php.ini. Обязательно проверьте значения php.ini для upload_max_filesize, post_max_size и max_input_vars. Превышение одного приведет к пустому массиву $ _POST.

Крис Л.
источник