php $ _POST массив пуст после отправки формы

99

У меня есть собственная CMS, которую я построил, которая отлично работает на моем устройстве для разработчиков (Ubuntu / PHP5 + / MySQL5 +).

Я просто переместил его в рабочий ящик для своего клиента, и теперь все отправленные формы отображаются как пустые массивы $ _POST.

Я нашел трюк, чтобы убедиться, что данные действительно передаются с использованием, file_get_contents('php://input');и данные там отображаются нормально - массивы $_POST/ $_REQUESTвсегда пусты.

Я также проверил правильность заголовков типа содержимого с помощью firebug ( application/x-www-form-urlencoded; charset=utf-8).

Эта проблема возникает независимо от того, отправляется ли форма через AJAX или обычную отправку формы.

Любая помощь приветствуется!


источник
Проверьте post_max_size: значение должно быть 8 МБ, а не 8 МБ. В последнем случае вы не увидите никаких ошибок, но размер $ _POST будет равен 0
Сергей Карпов
Остерегайтесь: Apache выполняет перенаправление 301, если косая черта отсутствует.
Леандро,

Ответы:

186

Я знаю, что этот вопрос касался POST через форму, но я пришел сюда в поисках ответов на аналогичную проблему при POSTing с типом содержимого JSON. Нашел ответ и хотел им поделиться, потому что это стоило мне много времени.

При использовании типа содержимого JSON массив $ _POST не заполняется (я считаю, только с многочастными формами)

Вот что помогло исправить проблему:

$rest_json = file_get_contents("php://input");
$_POST = json_decode($rest_json, true);

надеюсь, это кому-то поможет!

тильтем
источник
1
Этот обходной путь имеет смысл - он исправил мой контроллер пакетного обновления :)
Мартин Цайтлер,
2
Другой вариант - изменить Content-Typeзаголовок на, application/x-www-form-urlencodedа затем сериализовать данные с помощью $.param(dataObject). Это должно помочь.
ukaszBachman
1
@ ŁukaszBachman Как это сделать, если DataObject что - то вроде ........ title=something&body=anything. Я хочу получить юдоль титула и тела. $ dataobject ["title"] возвращает пустое значение. В моем случае $ _POST пуст. И единственный способ получить его, используя file_get_contents ("php: // input") ... за исключением того, что он не закодирован в json.
Хуршид Алам
Это очень полезно. Странно то, что у меня нет проблем с отправкой Json на мою машину разработки, но с производственной.
Simon H
3
toptal.com/php/…
ankitr 02
86

Вот еще одна возможная причина - моя форма отправлялась на domain.com без WWW. и я настроил автоматическое перенаправление, чтобы добавить «WWW». Массив $ _POST в процессе опустошался. Чтобы исправить это, мне нужно было всего лишь отправить на www.domain.com.


источник
24
Черт возьми, переписывание URL-адреса в моем htaccessбыло причиной того, что POST не работал. Я автоматически добавлял косую черту ко всем URL-адресам, но в коде в качестве ДЕЙСТВИЯ я использовал URL-адрес без косой черты. Ваш ответ помог, так как я никогда не думал проверять .htaccess. +1
binar
У меня была переадресация домена (с маскированием) с помощью Godaddy, и это, похоже, является источником проблемы. Спасибо!
Крис Принс
1
У меня тоже была похожая проблема, она исходила из моего .htaccessфайла. Он удалял .phpрасширение из URL-адреса, и моя форма входила POSTв URL-адрес с расширением.
Эмануэль Винтила
25

У меня была похожая проблема. Оказалось простое исправление. В форме у меня

<form action = "directory" method = "post">

где каталог был именем ... каталога. Мой массив POST был полностью пуст. Когда я посмотрел на URL-адрес в своем браузере, он был отображен с косой чертой в конце.

Добавление косой черты в конец моего действия помогло -

<form action = "directory /" method = "post">

Мой массив $ _POST снова был заполнен!

Рэнди Килваг
источник
1
Это не должно быть исправлением, например, на CakePHP, который имеет хорошую систему маршрутизации, отказал в этом (я не имею в виду сбой Cake), возможно, подход к этой проблеме не в структуре или файлах .php, но немного конфигурации на apache, я хотел бы провести дальнейшее исследование этой проблемы. Это довольно интересно.
Джеймс
В аналогичной заметке у меня была та же проблема, что и у OP, но только если у <form>тега не было nameатрибута, и только в IE.
jkt123
13

Убедитесь, что в php.ini:

  • track_vars (он доступен только в очень старых версиях PHP) установлен на On
  • variables_order содержит письмо P
  • post_max_size установлено разумное значение (например, 8 МБ)
  • (при использовании пластыря сухосин) suhosin.post.max_varsи suhosin.request.max_varsдостаточно большие.

Полагаю, второе мое предложение решит вашу проблему.

MrMage
источник
1
Спасибо, MrMage, ценим ваше понимание, проверим эти ini-настройки и сообщим вам, помогло ли это. Спасибо!
1
"post_max_size" - это моя остановка. Я загружал большой файл во время отправки формы, и этот параметр содержал меньшее значение. Итак, я получаю пустой массив сообщений, когда отправляю форму.
shasi kanth
9

Я обнаружил, что при отправке с HTTP на HTTPS поле $_POSTпусто. Это произошло во время тестирования формы, но мне потребовалось некоторое время, чтобы я понял это.

Маркос
источник
5

Я столкнулся с похожей, но немного другой проблемой, и мне потребовалось 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-адресу.

Это сработало.

Разместил это здесь, чтобы кто-то нашел это полезным.

GUIR
источник
1
У меня была та же проблема, без '/' в конце URL-адреса, ничего не существует в $ _REQUEST, но с '/' или '/index.php' все опубликованные данные существуют в $ _REQUEST. Это могут быть мои настройки nginx или что-то еще!
MohaMad
5

Если вы отправляете сообщение в файл 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>
Сандей Джи Акинсете
источник
На самом деле у меня полная противоположность. Я обнаружил, что /my_uriэто сработает, но нет /my_uri/.
Link14
1
была такая же проблема. похоже, что apache или nginx добавляет перенаправление с / api на / api /
Джон Смит
Apache выполняет автоматическое перенаправление 301, если косая черта отсутствует. Спасибо за ответ и комментарии тоже полезны.
Леандро,
4

На данный момент у меня нет элегантного решения, но я хотел бы поделиться своими выводами для использования в будущем другими, кто столкнется с этой проблемой. Источником проблемы было 2 переопределенных значения php в файле .htaccess. Я просто добавил эти 2 значения, чтобы увеличить ограничение размера файла для загрузки файлов с 8 МБ по умолчанию до чего-то большего - я заметил, что простое наличие этих 2 значений в файле 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)


источник
Возможно, стоит задать этот вопрос на Serverfault, особенно если проблема заключается в настройке сервера / htaccess.
Дэвид требует восстановить Монику на работе
5
Если я не ошибаюсь, размер должен быть указан как «xxM», а не «xxMB», поэтому мне интересно, может ли это иметь какое-то отношение к этому ...
JC Inacio
4

Я мог бы решить проблему, используя enctype = "application / x-www-form-urlencoded", поскольку по умолчанию это "text / plain". Когда вы регистрируете $ DATA, разделитель - это пробел для «текст / обычный» и специальный символ для «urlencoded».

С уважением, Франк

RudeUrm
источник
4

Это enable_post_data_readingвызовет отключение настройки. По документации:

enable_post_data_reading

Отключение этой опции приводит к тому, что $ _POST и $ _FILES не заполняются. Тогда единственный способ прочитать постданные будет через оболочку входного потока php: //. Это может быть полезно для прокси-запросов или для обработки данных POST с эффективным использованием памяти.

Люк А. Лебер
источник
4
<form action="test.php" method="post">
                        ^^^^^^^^^^^^^

Ладно, это было глупо, и я буду смущать себя публично, но я придумал небольшой тестовый скрипт для чего-то на PHP, и когда мой $_POST массив был пуст, StackOverflow - это первое место, куда я посмотрел, и я не нашел ответа, который мне нужен .

Я только написал

<form action="test.php">

и забыл указать метод как POST !

Я уверен, что кто-то захихикает, но если это поможет тому, кто делает то же самое, я не против! Все мы время от времени делаем это!

Иван
источник
не могу поверить, я тоже забыл об этом! Я просто пробую новый сервер и подумал, что это связано с конфигурацией ... в любом случае, спасибо за напоминание!
Сэмюэл Айала Феррейра
4

В моем случае при отправке с HTTP на HTTPS $ _POST пуст. Проблема заключалась в том, что форма имела действие, подобное этому //example.com. Когда я исправил URL-адрес на https://example.com , проблема исчезла.

Игорь Носков
источник
1
Я думаю, это связано с тем, как настроен сервер. У меня такие же проблемы с использованием GoDaddy в качестве хоста. Это решение не решило проблему.
acarlstein
Это решение решило мою проблему. У меня была хорошая голова.
gokaysatir
3

такая же проблема здесь!

Я пытался подключиться к моему локальному коду сервера через почтовый запрос в почтальоне, и эта проблема потратила много времени!

для всех, кто использует локальный проект (например, почтальон): используйте свой IPv4-адрес (введите ipconfig в cmd) вместо ключевого слова localhost. в моем случае:

перед:

localhost/app/login

после:

192.168.1.101/app/login
Али Шариати
источник
Почтальон дал мне несколько проблем с очищенными значениями json, которые имеют кавычки или пробелы. Он ожидает определенного формата.
Tom Anderson
2

ССЫЛКА: 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 (JSON) или что-то еще.

http.send(params);

Наконец, мы отправляем параметры с запросом. Данный URL загружается только после вызова этой строки. В методе GET параметр будет нулевым значением. Но в методе POST данные для отправки будут отправлены в качестве аргумента функции отправки. Переменная params была объявлена ​​во второй строке как lorem=ipsum&name=binny- поэтому мы отправляем два параметра - lorem и name со значениями ipsum и binny соответственно.

Чанду
источник
1

В моем случае это произошло потому, что я использовал jQuery для отключения всех входных данных на странице непосредственно перед использованием jQuery для отправки формы. Поэтому я изменил свое «отключение всех входов, даже« скрытых »типов»:

$(":input").attr("disabled","disabled"); 

чтобы «отключить только входы типа« кнопка »»:

$('input[type=button]').attr('disabled',true);

Это было сделано для того, чтобы пользователь не мог случайно дважды нажать кнопку «Пуск» и залить нашу БД! Похоже, что если вы поместите атрибут «disabled» в форму ввода «скрытого» типа, их значения не будут отправлены, если форма будет отправлена!

Джош П.
источник
1

Для меня .htaccess перенаправлял, когда mod_rewrite не был установлен. Установите mod_rewite, и все в порядке.

В частности:

<IfModule !mod_rewrite.c>
  ErrorDocument 404 /index.php
</Ifmodule>

выполнялся.

Мартин Фишер
источник
1

Я просто потратил часы, чтобы исправить подобную проблему. В моем случае проблема заключалась в

max_input_vars = "1000"

по умолчанию в php.ini. У меня была действительно огромная форма без загрузок. php.ini настроен на upload_max_filesize = "100M" и post_max_size = "108M", и в моем случае это не было проблемой. Поведение PHP такое же для max_input_vars, когда оно превышает 1000 переменных в форме. Он возвращает пустой массив _POST. Хотел бы я найти это час, час назад.

MyraGe
источник
1

Я знаю, что это старый, но хотел поделиться своим решением.

В моем случае проблема была в моем .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 возвращал данные как обычно. Надеюсь, это поможет кому-то в будущем.

Валид Аджадж
источник
0

В дополнение к сообщению MRMage:

Мне пришлось установить эту переменную, чтобы решить проблему $_POSTисчезновения некоторых переменных (с большим массивом> 1000 элементов):

suhosin.request.max_vars = 2500

" request", а не " post" было решением ...

Itzekocke Setzling
источник
0

Возможно, это не самое удобное решение, но я понял, что если я установлю actionатрибут формы в корневой домен, можно будет получить доступ к index.php и получить опубликованные переменные. Однако, если я установлю перезаписанный URL как действие, это не сработает.

Рапли Андраш
источник
0

Это похоже на то, что сказал @icesar .

Но я пытался публиковать материалы на моем api, расположенном в site/api/index.php, только отправляя сообщения, site/apiпоскольку он передается index.phpсам по себе. Однако это, по-видимому, привело к тому, что что-то испортилось, так как мой $_POSTбыл опустошен на лету. Просто отправьте сообщение site/api/index.phpнапрямую вместо того, чтобы решить эту проблему.

Виктор Хэггквист
источник
0

Моя проблема заключалась в том, что я использовал HTML- <base>тег для изменения базового URL-адреса моего тестового сайта. Как только я удалил этот тег из заголовка, $_POSTданные вернулись.

Бен
источник
0

В моем случае (страница php на сервере OVH мутуализе) 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 = "text / plain" несовместимы?

PaulH
источник
0

Я получал следующую ошибку от 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"]

Как только я удалил конфигурацию безопасности своего мода для тестирования, все заработало, как ожидалось. Теперь мне просто нужно изменить свои правила, чтобы они оставались безопасными, но достаточно гибкими для моих нужд :)

Люк
источник
0

Убедитесь, что вы используете name = " your_variable_name " во входном теге.

Я по ошибке использую id = " your_variable_name ".

Я потратил много времени, чтобы отловить ошибку.

Фрэнк Хси
источник
0

Убедитесь, что nameсвойство каждого поля определено.

Это создаст вам пустой POST на PHP

<input type="text" id="Phone">

Но это сработает

<input type="text" name="Phone" id="Phone">
Мигель Монтес де Ока
источник
Я думаю, это связано с тем, как настроен сервер. У меня такие же проблемы с использованием GoDaddy в качестве хоста. Это решение не решило проблему.
acarlstein
-1

Хорошо, я подумал, что мне следует изложить здесь свой случай .... Я получал пустой массив сообщений в определенных случаях ... Форма работает хорошо, но иногда пользователи жалуются, что они нажимают кнопку отправки, и ничего не происходит ... Покопавшись некоторое время, я обнаружил, что у моей хостинговой компании есть модуль безопасности, который проверяет вводимые пользователем данные и очищает весь массив сообщений (а не только вредоносные данные), если обнаруживает это. В моем примере учитель математики пытался ввести уравнение: dy + dx + 0 = 0; и данные были полностью удалены.

Чтобы исправить это, я просто советую ему сейчас ввести данные в текстовую область как dy + dx + 0 = ноль, и теперь он работает .... Это может сэкономить кому-то время ..

Махмуд Эльгабри
источник
5
Просить пользователей делать поправки на ошибочный код - не проблема.
freeworlder
Это не совсем ошибочный код, но вы можете подумать о новом хостинг-провайдере. В качестве альтернативы опубликуйте ввод в другой форме, например, в HTML-кодировке URL.
Tom Anderson