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 был пуст.

  • Затем проверяется с помощью file_get_contents ('php://input'); и это было также пустой.

Позже я обнаружил, что браузер не запрашивал подтверждение повторной отправки данных формы после обновления страницы, загруженной после отправки 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.