У меня есть следующая страница 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 - текущий. Похоже, здесь нет проблем, верно?
Ответы:
Работает ли без явных индексов? Пытаться:
источник
Существует ряд возможных причин, по которым массив записей может быть пустым - есть вероятность, что он возвращается к ошибке человека / разработчика. Я столкнулся с этой проблемой при обновлении с PHP 5.2 до 5.4, это было просто, но потребовались часы, чтобы найти ошибку. В нашем файле config.php у нас был следующий оператор для обработки массивов $ _POST:
Когда-то были включены магические кавычки, и в версиях PHP до 5.2 вышеприведенное работало нормально, но все, что выше версии 5.2, не будет обрабатываться, и возвращается пустой массив.
Если вы не
error_reporting()
включили, я предлагаю вам это сделать, и я уверен, что вы сможете устранить проблему.Вам также следует проверить устаревшие системные функции, например "
magic_quotes
", поскольку их использование просто не дает результатов. Надеюсь, это поможет. Удачи. JCS :)источник
В багтрекере PHP есть сообщения об ошибках по этой или схожим проблемам:
К сожалению, в нем не упоминается решение, но вы можете попытаться установить другой тип CONTENT_TYPE или вообще не указывать тип содержимого.
источник
Была довольно похожая проблема. Ну, во-первых, мне понадобилось много времени, чтобы добраться до этого поста. Чтобы выяснить название моей проблемы, мне пришлось установить консоль PHP, понять, как ее использовать. Отладка кода, о котором я ничего не знал. Получить к корню проблемы и все еще быть озадаченным.
Решение было довольно простым на самом деле. В Chrome нажмите F12, чтобы перейти к инструментам разработчика, выберите Сеть, попробуйте опубликовать форму. Проследить пост-запрос, посмотреть статус. Если его 301 (или что-то еще, кроме 200) - у вас точно такая же проблема, как у меня до недавнего времени!
Мой новый хост-провайдер перенаправлял http://my_site.com на http://www.my_site.com , и все, что мне нужно было сделать, это изменить некоторые настройки как часть моей CMS (ваши могут отличаться, но в некотором роде)
в
И вуаля, магия и радуга, единороги и мой сайт наконец-то работают!
PS Перемешивание с настройками вашего хостинга также может решить вашу проблему ... Если ваша проблема, конечно, похожа на мою ...
источник
Я не уверен, но имея
и т.д. может запутать php. Я бы изменил входные имена на test_1, test_2 и посмотрю, что произойдет.
источник
В базовом 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-доступ.)
источник
У меня возникают сбои при отправке формы везде, так как я обновил Debian до «тестирования» со «стабильного». Похоже, что apache2 или php5 не обрабатывают несколько элементов в представлении с одинаковым именем. Например; Ваша форма имеет два входа с именем "mo". В прошлом только одно из значений для "mo" могло бы пройти. Теперь форма, кажется, отбрасывает все данные после первого появления дубликата ключа. Пока не уверен. Все еще пытаюсь понять это.
источник
Попробуйте скопировать файл php.ini с сервера, который работает на этот сервер (сначала сделайте резервную копию php.ini неработающего сервера). Если это так, то это что-то есть (возможно, variable_order или, возможно, память, хотя вряд ли и то и другое).
источник
Попробуйте переименовать кнопку «Отправить» во что-то кроме действия. У меня были некоторые проблемы с этим в прошлом. Кажется, проблема в том, чтобы иметь вход с именем action.
источник
Следующее НЕ должно помочь вам. Это противоречит всему, что я знаю о конфигурации PHP:
Этот прыгнул на меня. Ваши суперглобалы регистрируются в разных порядках. Это просто не должно быть проблемой, потому что, поскольку вы не используете
register_globals
и не полагаетесь на них, не должно быть проблем с изменением порядка, в котором обрабатываются переменные порядка.Но вы должны обязательно попробовать и изменить порядок переменных.
источник
Даже этот ОП довольно старый, но сегодня я столкнулся с подобной проблемой.
Потратив несколько часов на проверку миллионов разных вещей снова и снова, в итоге обнаружил, что после последнего обновления до версии PHP 5.6.17 в нашей cPanel с настройками по умолчанию PHP http не был выбран.
И после установки его на выбранное - все возвращается на круги своя :-)
Надеюсь, что это поможет любым будущим читателям
источник
Если это может помочь кому-то еще ... Я просто потратил часы, чтобы исправить подобную проблему, и проблема заключалась в ограничении max_input_vars = "1000" php.ini. Обязательно проверьте значения php.ini для upload_max_filesize, post_max_size и max_input_vars. Превышение одного приведет к пустому массиву $ _POST.
источник