Перейти к содержимому

Как получить данные post запроса в php

  • автор:

Как получить строку из POST-запроса на php?

Как следует из документации платёжной системы, страница получает уведомление через $_POST, которое содержит json-строку вида: <"id":"fb4def00b68d9bd805c160db1993de7d1ed7579f","status":"accepted_successed","message":"","amount":"542.0", "old_amount": "1000.0">У меня не выходит получить эту строку! Логирую содержимое POST-запросов с получением содержимого функциями var_dump($_POST) и print_r($_POST); в итоге пусто. Содержимое $_POST тоже пустое. Как получить строку из $_POST в PHP? Логировал следующим образом:

if (!empty($_POST))

Отслеживать
Egor Morozov
задан 22 ноя 2022 в 9:17
Egor Morozov Egor Morozov
1 2 2 бронзовых знака
А как ты запрос отсылаешь?
22 ноя 2022 в 9:19
Их отсылает платёжная система, не я.
22 ноя 2022 в 9:24

Ну она же в ответ на что-то отсылает? Ты же делаешь куда-то запрос, чтобы тебе отдали ответ? Или ты просто ждёшь, что какая-то платёжка внезапно тебе будет данные слать?

22 ноя 2022 в 9:25

Когда кто-то оплачивает на их странице, они оповещают от этом POST-запросом. Конечно, перед этим создаётся счет, я им отправляю тоже запрос для этого, но входящее уведомление об оплате не имеет к этому никакого отношения. Оно просто приходит в какой-то момент, я его не инициирую каким-то своим действием.

22 ноя 2022 в 9:33

Окей. То есть они как минимум должны отослать данные на какой-то конкретный URL, который ты им укажешь, правильно? А как ты смотришь данные из пост запроса? Просто в браузере ждёшь что что-то появится? или в отладчике ожидаешь подхватывания брейкпойнта?

$_POST

Ассоциативный массив данных, переданных скрипту через HTTP методом POST при использовании application/x-www-form-urlencoded или multipart/form-data в заголовке Content-Type запроса HTTP.

Примеры

Пример #1 Пример использования $_POST

echo ‘Привет ‘ . htmlspecialchars ( $_POST [ «name» ]) . ‘!’ ;
?>

Подразумевается, что пользователь отправил через POST name=Иван

Результатом выполнения этого примера будет что-то подобное:

Привет, Иван!

Примечания

Замечание:

Это «суперглобальная» или автоматическая глобальная переменная. Это просто означает, что она доступна во всех контекстах скрипта. Нет необходимости выполнять global $variable; для доступа к ней внутри метода или функции.

Смотрите также

  • Обработка внешних переменных
  • Фильтрация данных

User Contributed Notes 6 notes

15 years ago

One feature of PHP’s processing of POST and GET variables is that it automatically decodes indexed form variable names.

I’ve seem innumerable projects that jump through extra & un-needed processing hoops to decode variables when PHP does it all for you:

Example pseudo code:

Many web sites do this:

When they could do this:

With the first example you’d have to do string parsing / regexes to get the correct values out so they can be married with other data in your app. whereas with the second example.. you will end up with something like:
var_dump ( $_POST [ ‘person’ ]);
//will get you something like:
array (
0 => array( ‘first_name’ => ‘john’ , ‘last_name’ => ‘smith’ ),
1 => array( ‘first_name’ => ‘jane’ , ‘last_name’ => ‘jones’ ),
)
?>

This is invaluable when you want to link various posted form data to other hashes on the server side, when you need to store posted data in separate «compartment» arrays or when you want to link your POSTed data into different record handlers in various Frameworks.

Remember also that using [] as in index will cause a sequential numeric array to be created once the data is posted, so sometimes it’s better to define your indexes explicitly.

8 years ago

I know it’s a pretty basic thing but I had issues trying to access the $_POST variable on a form submission from my HTML page. It took me ages to work out and I couldn’t find the help I needed in google. Hence this post.

Make sure your input items have the NAME attribute. The id attribute is not enough! The name attribute on your input controls is what $_POST uses to index the data and therefore show the results.

3 years ago

If you want to receive application/json post data in your script you can not use $_POST. $_POST does only handle form data.
Read from php://input instead. You can use fopen or file_get_contents.

// Get the JSON contents
$json = file_get_contents ( ‘php://input’ );

// decode the json data
$data = json_decode ( $json );
?>

9 years ago

Note that $_POST is NOT set for all HTTP POST operations, but only for specific types of POST operations. I have not been able to find documentation, but here’s what I’ve found so far.

$_POST _is_ set for:

In other words, for standard web forms.

$_POST is NOT set for:

A type used for a generic HTTP POST operation.

7 years ago

There’s an earlier note here about correctly referencing elements in $_POST which is accurate. $_POST is an associative array indexed by form element NAMES, not IDs. One way to think of it is like this: element «id=» is for CSS, while element «name text» name=»txtForm»>.

15 years ago

For a page with multiple forms here is one way of processing the different POST values that you may receive. This code is good for when you have distinct forms on a page. Adding another form only requires an extra entry in the array and switch statements.

if (!empty( $_POST ))
// Array of post values for each different form on your page.
$postNameArr = array( ‘F1_Submit’ , ‘F2_Submit’ , ‘F3_Submit’ );

// Find all of the post identifiers within $_POST
$postIdentifierArr = array();

foreach ( $postNameArr as $postName )
if ( array_key_exists ( $postName , $_POST ))
$postIdentifierArr [] = $postName ;
>
>

// Only one form should be submitted at a time so we should have one
// post identifier. The die statements here are pretty harsh you may consider
// a warning rather than this.
if ( count ( $postIdentifierArr ) != 1 )
count ( $postIdentifierArr ) < 1 or
die( «\$_POST contained more than one post identifier: » .
implode ( » » , $postIdentifierArr ));

// We have not died yet so we must have less than one.
die( «\$_POST did not contain a known post identifier.» );
>

switch ( $postIdentifierArr [ 0 ])
case ‘F1_Submit’ :
echo «Perform actual code for F1_Submit.» ;
break;

case ‘Modify’ :
echo «Perform actual code for F2_Submit.» ;
break;

case ‘Delete’ :
echo «Perform actual code for F3_Submit.» ;
break;
>
>
else // $_POST is empty.
echo «Perform code for page without POST data. » ;
>
?>

  • Copyright © 2001-2024 The PHP Group
  • My PHP.net
  • Contact
  • Other PHP.net sites
  • Privacy policy

Обрабатываем POST-запросы в PHP

loader

Итак, в прошлом уроке мы вспоминали о том, как происходит работа пользователя с сайтом. Их общение происходит в форме запрос-ответ. Пользователь отправляет в запросе какие-то данные, а сервер возвращает какой-либо ответ, в зависимости от этих данных.

В предыдущем уроке мы научились работать с GET-запросами. Как мы помним, при этом способе данные передаются на сервер с помощью параметров в адресной строке. Такое бывает удобно, когда нам нужно поделиться ссылкой в которой эти параметры нужны. Например, у нас спрашивают, где в Москве купить шкаф. И мы скидываем человеку ссылку на поиск в Яндексе:
https://yandex.ru/search/?text=шкаф%20в%20москве%20купить

Он переходит по ней и прекрасно себя чувствует, потому что всё уже введено за него.

Однако, параметры в адресной строке – это не всегда уместно. Например, когда в параметрах содержится какая-то конфиденциальная информация: пароль, пин-код. И любой мимо проходящий человек может её увидеть. Как в такой ситуации быть? Использовать POST-запросы!

Что это такое? Да всё тот же запрос от клиента к серверу, только параметры передаются внутри тела запроса, а не в адресной строке. И увидеть их просто так не получится.

Что за тело запроса? Ну, это просто данные, которые передаются на сервер. При этом они скрыты от лишних глаз.

Чтобы отправить POST-запрос нужно в HTML-форме задать для атрибута method значение POST.

  • Привет, мир!
  • Развернуть строку
  • Чётные числа
  • Числа Фибоначчи
  Форма входа    Логин 
Пароль

Данные, отправленные с помощью POST-запроса доступны в PHP в суперглобальном массиве $_POST.

Давайте выведем переданные скриптом выше значения login и password. Для этого в файл login.php положим следующий код:

   Обработка POST-запроса   

Переданный login:
Переданный password:

Результат POST-запроса

Откройте теперь форму, введите в неё значения и нажмите кнопку «Войти».
Вы увидите введенные вами в форме данные, при этом они будут отсутствовать в адресной строке. Вуаля! Теперь никто не подсмотрит ваш пароль в адресной строке.

Как увидеть тело POST-запроса

Панель разработчика в Google Chrome

Чтобы увидеть данные POST-запроса в браузере, в Google Chrome нужно перейти в режим разработчика. Нажмите клавишу F12, находясь в окне браузера. После этого вы увидите панель разработчика.

Перейдите во вкладку Network, а затем установите галочку напротив пункта Preserve log.

Форма отправки POST-запроса

Теперь вернитесь на форму, и снова введите данные, после чего нажмите на кнопку «Войти».

POST-запрос в списке

Одновременно с тем, как вы нажмете на кнопку входа, вы увидите в панели разработчика запрос на login.php.

Исходный код вернувшейся страницы

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

Тело POST-запроса

Нас здесь интересует вкладка Headers. Перейдите в неё, и прокрутите содержимое в самый низ. Здесь вы увидите те данные, что браузер отправил на сервер.

Заключение

Вот так и работают POST-запросы под капотом. Используют их всегда, когда не нужно отображать детали запроса в адресной строке. Хорошие примеры: форма авторизации, ввод данных о кредитной карте. Такими данными лучше в адресной строке не светить.

А сейчас — немного нестандартное домашнее задание =)

Если этот урок был вам полезен, расскажите об этом курсе своим знакомым или поделитесь на него ссылкой в социальных сетях.

Как получить содержимое POST на php?

Я отправляю POST на страницу php следующее:

Это тело запроса (запрос POST).

Что мне нужно сделать в php, чтобы извлечь это значение?

var_dump($_POST);

Этот код не работает.

Ответ 1

Чтобы получить доступ к содержимому объекта запроса POST или PUT (или любого другого метода HTTP):

$entityBody = file_get_contents(‘php://input’);

Кроме того, STDIN константа — это уже открытый поток php://input , поэтому вы можете в качестве альтернативы сделать:

$entityBody = stream_get_contents(STDIN);

Из документации PHP по потокам ввода-вывода :

php: // input — это поток только для чтения, который позволяет вам читать необработанные данные из содержимого запроса. В случае запросов POST предпочтительнее использовать запрос php: // вместо того, чтобы использовать $HTTP_RAW_POST_DATA, который зависит от специальных директив php.ini. Более того, для тех случаев, когда $HTTP_RAW_POST_DATA не устанавливается по умолчанию, это потенциально менее ресурсоемкая альтернатива установки .

always_populate_raw_post_data. php: // ввод недоступен с enctype = «multipart/form-data».

В этом случае, если поток php://input , к которому вы обращаетесь как веб-SAPI, будет недоступен для поиска . Это означает, что его можно прочитать только один раз. Если вы работаете в среде, где регулярно загружается содержимое HTTP, вы можете сохранить ввод в его потоковой форме (а не буферизовать его).

Для реализации потокового ресурса можно выполнить что-то вроде этого:

function detectRequestBody()

$rawInput = fopen(‘php://input’, ‘r’);

$tempStream = fopen(‘php://temp’, ‘r+’);

stream_copy_to_stream($rawInput, $tempStream);

rewind($tempStream);

return $tempStream;

>

php://temp позволяет вам управлять потреблением памяти, потому что это прозрачно переключается на хранилище файловой системы после сохранения определенного количества данных (по умолчанию 2M). Этим размером можно управлять в файле php.ini или добавляя /maxmemory:NN , где NN — это максимальный объем данных в байтах, которые необходимо сохранить в памяти перед использованием временного файла.

Конечно, если у вас нет действительно веской причины для поиска во входном потоке, вам не понадобится эта функция в веб-приложении. Обычно достаточно одного чтения содержимого объекта HTTP-запроса – нет необходимости заставлять клиентов ждать долгое время для выяснения, что делает в а ше приложение.

Обратите внимание, что ввод php: // недоступен для запросов с указанием заголовка « Content-Type: multipart/form-data ( enctype=»multipart/form-data» в HTML-формах)». Это происходит из-за того, что интер прет атор PHP уже проанализировал данные формы в $_POST .

Ответ 2

Возможное решение:

function getPost()

if(!empty($_POST))

// когда в качестве HTTP Content-Type в запросе используется application/x-www-form-urlencoded или multipart/form-data

// ПРИМЕЧАНИЕ: если это так и $_POST пуст, можно проверить порядок переменных (variables_order) в php.ini! — они должны содержать букву P

return $_POST;

>

// при использовании application/json в качестве HTTP Content-Type в запросе

$post = json_decode(file_get_contents(‘php://input’), true);

if(json_last_error() == JSON_ERROR_NONE)

return $post;

>

return [];

>

print_r(getPost());

Ответ 3

Этот пример о том, как создать PHP API с file_get_contents(«php://input») , и об использовании с javascript в связке с ajax XMLHttpRequest .

var xhttp = new XMLHttpRequest();

xhttp.onreadystatechange = function ()

if (this.readyState == 4 && this.status == 200)

console.log(«done»);

>

>

>;

xhttp.open(«POST», «http://127.0.0.1:8000/api.php», true);

xhttp.send(JSON.stringify(

username: $(this).val(),

email:email,

password:password

>));

$data = json_decode(file_get_contents(«php://input»));

$username = $data->username;

$email = $data->email;

$password = $data->password;

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *