Php $_POST массив пуст после отправки формы
У меня есть пользовательская CMS, которую я построил, которая отлично работает в моем dev-блоке (Ubuntu/PHP5 +/MySQL5 +).
Я только переместил его в поле для моего клиента, и теперь все формы представлены как пустые массивы $_POST.
Я нашел трюк, чтобы проверить, действительно ли данные передаются с помощью file_get_contents('php://input');
, и данные отображаются там хорошо - массивы $_POST
/$_REQUEST
всегда пусты.
Я также подтвердил, что заголовки содержимого также правильны с помощью firebug (application/x-www-form-urlencoded; charset=utf-8
).
Эта проблема происходит независимо от того, отправляется ли форма через AJAX или отправить регулярную форму.
Любая помощь очень ценится!
Ответы
Ответ 1
Я знаю, что этот вопрос касался POST через форму, но пришел сюда, чтобы найти ответы на аналогичную проблему при отправке POST с использованием типа контента JSON. Нашел ответ и хотел поделиться им, поскольку это стоило мне много времени.
При использовании типа содержимого JSON массив $_POST не будет заполняться (только с несколькими частями, которые, как я полагаю)
Вот что помогло устранить проблему:
$rest_json = file_get_contents("php://input");
$_POST = json_decode($rest_json, true);
надеюсь, что это поможет кому-то!
Ответ 2
Вот еще одна возможная причина - моя форма отправляла на домен .com без WWW. и я настроил автоматическое перенаправление для добавления "WWW". Массив $_POST опорожнялся в процессе. Поэтому, чтобы исправить это, мне нужно было отправить на www.domain.com
Ответ 3
У меня была аналогичная проблема. Оказалось, что это простое решение. В форме я имел
< form action = "directory" method = "post" >
где каталог был именем... каталога. Мой массив POST был полностью пуст. Когда я посмотрел на url в своем браузере, он был показан с косой чертой в конце.
Добавление косой черты к концу моего действия сделало трюк -
< form action = "directory/" method = "post" >
Мой массив $_POST снова был заполнен!
Ответ 4
Убедитесь, что в php.ini:
-
track_vars
(он доступен только на очень старых версиях PHP) установлен на On
-
variables_order
содержит букву P
-
post_max_size
устанавливается на разумное значение (например, 8 МБ).
- (при использовании пакета suhosin)
suhosin.post.max_vars
и suhosin.request.max_vars
достаточно большие.
Я предполагаю, что второе мое решение решит вашу проблему.
Ответ 5
Я обнаружил, что при отправке с HTTP на HTTPS, $_POST
приходит пустым.
Это произошло при проверке формы, но потребовалось некоторое время, пока я не осознаю это.
Ответ 6
Я столкнулся с подобной, но немного другой проблемой, и для понимания этой проблемы потребовалось 2 дня.
Позже я обнаружил, что браузер не запрашивал подтверждение повторной отправки данных формы после обновления страницы, загруженной после отправки POST. Это была непосредственно обновляющая страница. Но когда я изменил форму URL-адреса на другую, он правильно прошел POST и попросил повторно отправить данные при попытке обновить страницу.
Затем я проверил, что не так с фактическим URL. Не было ошибки в URL-адресе, однако он указывал на папку без index.php в URL-адресе, и я проверял POST на index.php.
Здесь я сомневался в перенаправлении с/на/index.php, что приводит к потере данных POST и тестированию URL с добавлением index.php к URL.
Это работает.
Размещено здесь, чтобы кто-нибудь нашел его полезным.
Ответ 7
На данный момент у вас нет элегантного решения, но хотелось бы поделиться своими выводами для будущих ссылок на других, которые сталкиваются с этой проблемой. Источником проблемы было 2 переопределения значений php в файле .htaccess. Я просто добавил эти 2 значения, чтобы увеличить ограничение размера файлов для загрузки файлов с 8 МБ по умолчанию на нечто большее. Я заметил, что просто наличие этих двух значений в файле htaccess вообще, будь то больше или меньше, чем значение по умолчанию, вызвало проблему.
php_value post_max_size xxMB
php_value upload_max_filesize xxMB
Я добавил дополнительные переменные, чтобы надеяться на повышение пределов для всех файлов suhosin.post.xxx/suhosin.upload.xxx, но, к сожалению, это не повлияло на эту проблему.
В заключение я не могу объяснить "почему" здесь, но определил основную причину. Я чувствую, что это, в конечном счете, проблема suhosin/htaccess, но, к сожалению, я не смог разрешить, кроме как удалить вышеперечисленные значения 2 php выше.
Надеюсь, это поможет кому-то в будущем, поскольку я убил несколько часов, выясняя это. Спасибо всем, кто нашел время, чтобы помочь мне с этим (MrMage, Andrew)
Ответ 8
Я мог бы решить проблему, используя enctype = "application/x-www-form-urlencoded", поскольку по умолчанию используется "text/plain". Когда вы проверяете $DATA, разделитель представляет собой пробел для "text/plain" и специальный символ для "urlencoded".
С уважением
Франк
Ответ 9
Если отключить параметр enable_post_data_reading
, это приведет к этому. Согласно документации:
enable_post_data_reading
Отключение этой опции заставляет $_POST и $_FILES не заполняться. Единственный способ прочитать postdata будет затем через фреймворк потока php://. Это может быть полезно для запросов прокси или для обработки данных POST в эффективном режиме памяти.
Ответ 10
Если вы отправляете файл index.php в каталоге, например, /api/index.php, убедитесь, что в вашей форме вы указываете полный каталог в файле, например.
Это
<form method="post" action="/api/index.php">
</form>
ИЛИ
<form method="post" action="/api/">
</form>
работает.
Но это терпит неудачу
<form method="post" action="/api">
</form>
Ответ 11
<form action="test.php" method="post">
^^^^^^^^^^^^^
Хорошо, это было глупо, и я буду смущать себя публично, но я выбил небольшой тест script для чего-то на PHP и когда мой массив $_POST
был пуст, StackOverflow - первое, на что я смотрел, и я не нашел ответа, который мне нужен.
Я написал только
<form action="test.php">
и забыл указать метод как POST
!
Я уверен, что кто-то будет хихикать, но если это поможет кому-то другому, кто делает то же самое, тогда я не против! Мы все делаем это время от времени!
Ответ 12
та же проблема здесь!
Я пытался подключиться к моему локальному коду сервера через почтовый запрос в почтальоне, и эта проблема потратила много времени!
для тех, кто использует локальный проект (например, почтальон): используйте ваш адрес IPv4 (введите ipconfig в cmd) вместо ключевого слова localhost. в моем случае:
до:
localhost/app/login
после:
192.168.1.101/app/login
Ответ 13
ССЫЛКА: http://www.openjs.com/articles/ajax_xmlhttp_using_post.php
Метод POST
Мы собираемся внести некоторые изменения, поэтому метод POST будет использоваться при отправке запроса...
var url = "get_data.php";
var params = "lorem=ipsum&name=binny";
http.open("POST", url, true);
//Send the proper header information along with the request
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.setRequestHeader("Content-length", params.length);
http.setRequestHeader("Connection", "close");
http.onreadystatechange = function() {//Call a function when the state changes.
if(http.readyState == 4 && http.status == 200) {
alert(http.responseText);
}
}
http.send(params);
Некоторые заголовки HTTP должны быть установлены вместе с любым запросом POST. Поэтому мы устанавливаем их в этих строках...
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.setRequestHeader("Content-length", params.length);
http.setRequestHeader("Connection", "close");
С приведенными выше строками мы в основном говорим, что передача данных в формате представления формы. Мы также задаем длину параметров, которые мы отправляем.
http.onreadystatechange = function() {//Call a function when the state changes.
if(http.readyState == 4 && http.status == 200) {
alert(http.responseText);
}
}
Мы устанавливаем обработчик для события изменения состояния готовности. Это тот же обработчик, который мы использовали для метода GET. Здесь вы можете использовать http.responseText - вставить в div с помощью innerHTML (AHAH), eval it (JSON) или что-нибудь еще.
http.send(params);
Наконец, мы отправляем параметры с запросом. Данный URL-адрес загружается только после вызова этой строки. В методе GET параметр будет иметь нулевое значение. Но в методе POST отправляемые данные будут отправляться как аргумент функции отправки. Параметр params был объявлен во второй строке как lorem=ipsum&name=binny
- поэтому мы отправляем два параметра - "lorem" и "name" со значениями "ipsum" и "binny" соответственно.
Ответ 14
Для меня .htaccess перенаправлялся, когда mod_rewrite не был установлен. Установите mod_rewite и все в порядке.
В частности:
<IfModule !mod_rewrite.c>
ErrorDocument 404 /index.php
</Ifmodule>
Выполняется .
Ответ 15
В моем случае это было потому, что я использовал jQuery для отключения всех входов на странице перед использованием jQuery для отправки формы.
Поэтому я изменил свой "отключить каждый вход, даже" скрытые "типы":
$(":input").attr("disabled","disabled");
чтобы "отключить только входные данные типа 'button'":
$('input[type=button]').attr('disabled',true);
Это было так, что пользователь не мог случайно нажать кнопку "пойти" дважды и вытащить нашу БД!
Кажется, что если вы поместите атрибут "disabled" на вход типа "скрытый", их значения не будут отправлены, если форма будет отправлена!
Ответ 16
Я просто потратил несколько часов, чтобы исправить аналогичную проблему. Проблема в моем случае была
max_input_vars = "1000"
по умолчанию, в php.ini. У меня была действительно огромная форма без загрузки. php.ini установлен в upload_max_filesize = "100M" и post_max_size = "108M", и это, конечно, не проблема в моем случае. Поведение PHP одинаково для max_input_vars, когда оно превышает 1000 переменных в форме. Он возвращает и пуст массив _POST. Мне жаль, что я не мог найти этого часа и часа назад.
Ответ 17
Я знаю, что это старый, но хотел поделиться своим решением.
В моем случае проблема была в моем .htaccess, так как я добавил переменные, чтобы поднять мой максимальный предел загрузки PHP. Мой код был такой:
php_value post_max_size 50MB
php_value upload_max_filesize 50MB
Позже я заметил, что значения должны быть похожи на xxM, а не на xxMB, и когда я изменил его на:
php_value post_max_size 50M
php_value upload_max_filesize 50M
теперь мой $ _POST возвратил данные как обычно прежде. Надеюсь, это поможет кому-то в будущем.
Ответ 18
В дополнение к сообщению MRMage:
Мне пришлось установить эту переменную для решения проблемы, что некоторые переменные $_POST
(с большим массивом > 1000 элементов) исчезли:
suhosin.request.max_vars = 2500
"request
", а не "post
" было решением...
Ответ 19
Я получил следующую ошибку от Mod Security:
Access denied with code 500 (phase 2). Pattern match "((select|grant|delete|insert|drop|alter|replace|truncate|update|create|rename|describe)[[:space:]]+[A-Z|a-z|0-9|\*| |\,]+[[:space:]]+(from|into|table|database|index|view)[[:space:]]+[A-Z|a-z|0-9|\*| |\,]|UNION SELECT.*\'.*\'.*,[0-9].*INTO.*FROM)" at REQUEST_BODY. [file "/usr/local/apache/conf/modsec2.user.conf"] [line "345"] [id "300013"] [rev "1"] [msg "Generic SQL injection protection"] [severity "CRITICAL"]
Как только я удалил конфигурацию безопасности мод для тестирования, все работало, как ожидалось. Теперь мне просто нужно изменить свои правила, чтобы оставаться в безопасности, но достаточно гибким для моих нужд :)
Ответ 20
Не самое удобное решение, возможно, но я понял, что если я установил атрибут формы action
в корневой домен, можно получить доступ к index.php и получить опубликованные переменные. Однако, если я устанавливаю перезаписанный URL как действие, он не работает.
Ответ 21
Это похоже на то, что @icesar сказал.
Но я пытался отправить материал в свой api, расположенный в site/api/index.php
, только отправив на site/api
, поскольку он сам передается на index.php
. Это, однако, по-видимому, заставляет что-то запутаться, так как мой $_POST
освободился на лету. Просто отправить на site/api/index.php
прямо вместо этого решили.
Ответ 22
Моя проблема заключалась в том, что я использовал тег HTML <base>
, чтобы изменить базовый URL моего тестового сайта. Как только я удалил этот тег из заголовка, вернулись данные $_POST
.
Ответ 23
В моем случае (php-страница на сервере OVH mutualisé) enctype="text/plain"
не работает ($_POST
и соответствующий $_REQUEST
пуст), приводятся другие примеры ниже.
`
<form action="?" method="post">
<!-- in this case, my google chrome 45.0.2454.101 uses -->
<!-- Content-Type:application/x-www-form-urlencoded -->
<input name="say" value="Hi">
<button>Send my greetings</button>
</form>
<form action="?" method="post" enctype="application/x-www-form-urlencoded">
<input name="say" value="Hi">
<button>Send my application/x-www-form-urlencoded greetings</button>
</form>
<form action="?" method="post" enctype="multipart/form-data">
<input name="say" value="Hi">
<button>Send my multipart/form-data greetings</button>
</form>
<form action="?" method="post" enctype="text/plain"><!-- not working -->
<input name="say" value="Hi">
<button>Send my text/plain greetings</button>
</form>
`
Подробнее здесь: method = "post" ENCTYPE = "текст/обычный" не совместимы?
Ответ 24
Убедитесь, что вы используете name = "your_variable_name" во входном теге.
Я по ошибке использую id = "your_variable_name".
Я потратил много времени, чтобы поймать ошибку.
Ответ 25
В моем случае при публикации из HTTP в HTTPS $ _POST пусто. Проблема заключалась в том, что форма имела такое действие //example.com Когда я исправил URL-адрес на https://example.com, проблема исчезла.
Ответ 26
Убедитесь, что свойство name
каждого поля определено.
Это создаст вам пустой POST на PHP
<input type="text" id="Phone">
Но это сработает
<input type="text" name="Phone" id="Phone">
Ответ 27
Хорошо, я подумал, что должен поместить свое дело здесь... Я получал пул сообщений пустым в конкретных случаях. Форма работает хорошо, но некоторые пользователи жалуются, что они нажимают кнопку отправки, и ничего не происходит.... После некоторого врезания я обнаружил, что у моей хостинговой компании есть модуль безопасности, который проверяет входные данные пользователей и очищает весь массив сообщений (а не только вредоносные данные), если он обнаруживает это. В моем примере учитель математики пытался ввести уравнение: dy + dx + 0 = 0; и данные были полностью стерты.
Чтобы исправить это, я просто советую ему теперь вводить данные в текстовой области как dy + dx + 0 = ноль, и теперь это работает... Это может сэкономить некоторое время.
Ответ 28
Я думаю, что проблема такова:
Ваш (или ваш провайдер домена) PHP config блокирует метод POST.