Как получить post запрос php
Перейти к содержимому

Как получить post запрос php

  • автор:

$_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 );
?>

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»>.

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.

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.

  • Курс HTML для начинающих
  • Курс PHP для начинающих
  • Курс MySQL для начинающих
  • Курс ООП в PHP
  Форма входа    Логин 
Пароль

Данные, отправленные с помощью 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-запросы под капотом. Используют их всегда, когда не нужно отображать детали запроса в адресной строке. Хорошие примеры: форма авторизации, ввод данных о кредитной карте. Такими данными лучше в адресной строке не светить.

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

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

Как создать GET POST запросы с помощью PHP

Первый метод, позволяющий выполнить PHP POST запрос, заключается в использовании file_get_contents . Второй метод будет использовать fread в сочетании с парой других функций. Оба варианта применяют функцию stream context create , чтобы заполнить необходимые поля заголовка запроса.

Пояснение кода

Переменная $sPD содержит данные, которые нужно передать. Она должна иметь формат строки HTTP-запроса , поэтому некоторые специальные символы должны быть закодированы.

И в функции file_get_contents , и в функции fread у нас есть два новых параметра. Первый из них — use_include_path . Так как мы выполняем HTTP- запрос , в обоих примерах он будет иметь значение false . При использовании значения true для считывания локального ресурса функция будет искать файл по адресу include_path .

Второй параметр — context , он заполняется возвращаемым значением stream context create , который принимает значение массива $aHTTP .

Использование file_get_contents для выполнения POST-запросов

Чтобы в PHP отправить POST запрос с помощью file_get_contents , нужно применить stream context create , чтобы вручную заполнить поля заголовка и указать, какая « обертка » будет использоваться — в данном случае HTTP :

$sURL = "http://brugbart.com/Examples/http-post.php"; // URL-адрес POST $sPD = "name=Jacob&bench=150"; // Данные POST $aHTTP = array( 'http' => // Обертка, которая будет использоваться array( 'method' => 'POST', // Метод запроса // Ниже задаются заголовки запроса 'header' => 'Content-type: application/x-www-form-urlencoded', 'content' => $sPD ) ); $context = stream_context_create($aHTTP); $contents = file_get_contents($sURL, false, $context); echo $contents;

Использование fread для выполнения POST-запросов

Для выполнения POST-запросов можно использовать функцию fread . В следующем примере stream context create используется для составления необходимых заголовков HTTP-запроса :

$sURL = "http://brugbart.com/Examples/http-post.php"; // URL-адрес POST $sPD = "name=Jacob&bench=150"; // Данные POST $aHTTP = array( 'http' => // Обертка, которая будет использоваться array( 'method' => 'POST', // Request Method // Ниже задаются заголовки запроса 'header' => 'Content-type: application/x-www-form-urlencoded', 'content' => $sPD ) ); $context = stream_context_create($aHTTP); $handle = fopen($sURL, 'r', false, $context); $contents = ''; while (!feof($handle)) < $contents .= fread($handle, 8192); >fclose($handle); echo $contents;

Как выполнить в PHP GET-запрос

Теперь мы уделим внимание использованию fread и file_get_contents для загрузки контента из интернета через HTTP и HTTPS . Чтобы использовать методы, описанные в этой статье, необходимо активировать опцию fopen wrappers . Для этого в файле php.ini нужно установить для параметра allow_url_fopen значение On .

Выполнение POST и GET запросов PHP применяется для входа в систему на сайтах, получения содержимого веб-страницы или проверки новых версий приложений. Мы расскажем, как выполнять простые HTTP-запросы .

Использование fread для загрузки или получения файлов через интернет

Помните, что считывание веб-страницы ограничивается доступной частью пакета. Так что нужно использовать функцию stream_get_contents ( аналогичную file_get_contents ) или цикл while , чтобы считывать содержимое меньшими фрагментами до тех пор, пока не будет достигнут конец файла:

  fclose($handle); echo $contents; ?>

В данном случае обработки POST запроса PHP последний аргумент функции fread равен размеру фрагмента. Он, как правило, не должен быть больше, чем 8192 ( 8*1024 ).

Имейте в виду, что он может быть больше или меньше, а также может быть ограничен настройками системы, на которой запускается PHP .

Использование file_get_contents для получения URL-адреса сайта

Еще проще использовать этот метод при считывании файла по HTTP , так как вам не придется заботиться о считывании по фрагментам — все обрабатывается в PHP .

Как получить содержимое 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 не будет опубликован. Обязательные поля помечены *