METANIT.COM

How to get POST array value in PHP

This article will introduce the basic usage of PHP’s post array to get a value from an input form. The article will also highlight some important points about how to use post arrays, what they are used for, and where you can find more information about them.

PHP provides an array data type for storing collections of values. The POST variable is a form input that gets sent to your PHP code by the web browser, and it allows you to store multiple values passed in from the HTML form.

An Introduction To POST Arrays in PHP.

A POST array stores data that was sent to the server by a form.

Both these methods place limitations on what can be sent to the server, GET requests are limited to 8-bit ASCII and browsers may prevent more than 2kb of data from being submitted in a single transaction.

POST arrays can store extremely large amounts of data without any limitations. Imagine you have an HTML form that asks people for their entire resume, in this case, it would make sense to save the data submitted by the form to a POST array.

Читайте также:  Php скрипт копирования базы mysql

How are POST arrays created?

Creating a new PHP post array is different than creating a normal array because you must tell PHP which special variable name it should use to store the post data.

There are many special variables that PHP uses, but we’re only concerned with $_POST . $_POST contains all values submitted via the HTTP POST method. $_REQUEST – Contains all values submitted via any method (GET, POST, COOKIE, etc).

As mentioned earlier GET requests can’t send very much data at once and as such, they shouldn’t be used for sending large amounts of information (like user uploads) or large forms (like user resumes).

How to get POST array value in PHP

To get all post data in PHP, we have to use the $_POST superglobal variable. You can retrieve the value of a specific key using $_POST[‘key’] syntax but if the key does not exist then this returns an empty string.

If you want to check that a given key exists or not, use the isset() function, for example:

If you want to know whether the given POST array has any content, use empty() function, for example:

Retrieve post array values

If you want to pass an array into a post variable you can do this like below-

 Cooking  
Singing
Playing
Swimming

We now want to see which hobby the user has selected.

Источник

Массивы переданные post php

В прошлых темах была рассмотрена отправка на сервер отдельных значений. Однако отправка набора значений, то есть массивов в PHP может вызвать некоторые сложности. Рассмотрим, как можно отправить на сервер и соответственно получить на сервере массивы данных.

Например, определим следующий файл users.php :

 echo "В массиве " . count($users) . " элементa/ов
"; foreach($users as $user) echo "$user
"; ?>

В данном случае мы предполагаем, что параметр «users», который передается в запросе типа GET, будет представлять массив. И соответствено мы сможем получить из него данные.

Чтобы передать массив этому скрипту, обратимся к нему со следующим запросом:

http://localhost/users.php?users[]=Tom&users[]=Bob&users[]=Sam

Чтобы определить параметр строки запроса как массив, после названия параметра указываются квадраные скобки []. Затем мы можем присвоить некоторое значение: users[]=Tom . И сколько раз подобным образом будет присвоено значений, столько значений и будет в массиве. Все значения, как и обычно, отделяются амперсандом. Так, в данном случае в массив передаются три значения.

Передача массивов в PHP на сервер в запросе GET

Подобным образом мы можем отправлять данные в запросе POST из формы. Например, определим следующий скрипт:

     "; foreach($users as $user) echo "$user
"; > ?>

Форма ввода данных

User 1:

User 2:

User 3:

Как известно, название ключа передаваемых на сервер данных соответствует значению атрибута name у элемента формы. И чтобы указать, что какое-то поле ввода будет поставлять значение для массива, у атрибут name поля ввода в качестве значения принимает название массива с квадратными скобками:

Соответственно, сколько полей ввода с одним и тем же именем массива мы укажем, столько значений мы сможем передать на сервер. Так, в данном случае на сервер передается три значения в массиве users:

Отправка массивов на сервер методом POST из формы в PHP

Причем данный принцип применяется и к другим типам полей ввода формы html.

При этом в примерах выше передавался обычный массив, каждый элемент которого в качестве ключа имеет числовой индекс. Соотвенно, используя индекс, мы можем получить определенный элемент массива:

$firstUser = $_POST["users"][0]; echo $firstUser;

Но также мы можем в элементах формы явным образом указать ключи:

     $secondUser
$thirdUser"; > ?>

Форма ввода данных

User 1:

User 2:

User 3:

Например, первое поле добавляет в массив элемент с ключом «first»

Поэтому на сервере мы можем с помощью данного ключа получить соответствующий элемент:

$firstUser = $_POST["users"]["first"];

Источник

$_POST

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

Примеры

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

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

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

Примечания

Замечание:

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

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

User Contributed Notes 6 notes

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:

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.

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.

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

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

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.

In other words, for standard web forms.

A type used for a generic HTTP POST operation.

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

Источник

Как передать php массив методом post

Для передачи массива методом POST необходимо использовать функцию http_build_query() .

 $data = ['foo' => 'bar', 'baz' => 'boom']; $options = [ 'http' => [ 'header' => "Content-type: application/x-www-form-urlencoded\r\n", 'method' => 'POST', 'content' => http_build_query($data) ] ]; $context = stream_context_create($options); // Создаёт и возвращает контекст потока с опциями, указанными в массиве options. $result = file_get_contents('http://example.com/submit.php', false, $context); // Отправляет http-запрос на домен www.example.com с дополнительными заголовкам, показанными выше 

Источник

Как передать array через POST?

Важно для меня, чтобы я отправил POST запрос и он уже выполнялся сам, чтобы файл start.php не ждал пока в файле script.php завершит свои действия которые могут выполняться в течении 20-30 секунд).
Как я могу это сделать?

Простой 8 комментариев

Чтобы передать массив его нужно сериализовать. Например в JSON — json_encode($ваш_массив); и передавать соответственно уже эти данные. Можно просто в теле запроса, можно каким-нибудь параметром.

Важно для меня, чтобы я отправил POST запрос и он уже выполнялся сам, чтобы файл start.php не ждал пока в файле script.php завершит свои действия

PHP при любом раскладе будет ждать ответ. Чтобы не блокировать страницу нужно использовать AJAX-запросы из под JS.

slo_nik

xEpozZ

Дмитрий Дерепко, так асинхронный код на PHP так же будет ждать выполнения всех запущенных в асинхронности скриптов. Или вы о чем? А на счет форка хз. Честно говоря сам не сталкивался, но слышал, что на длинных запросах, а автор как раз про 20-30 секунд пишет, частенько падает все с ошибками. Хотя может ошибаюсь конечно 🙁

curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

Вот так отправил POST запрос, а как его принять?)
Хотел записать в файл:

file_put_contents(__DIR__ . '/logs/tester.txt', $_POST . PHP_EOL, FILE_APPEND);

— в результате получаю запись: Array

пытался json_decode(_POST) результат не лучше.

Us59, вы отправляете JSON в теле запроса. Чтобы его принять в данном случае нужно считывать его с потока php://

file_put_contents(__DIR__ . '/logs/tester.txt', file_get_contents('php://input') . PHP_EOL, FILE_APPEND);
curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(['json' => json_encode($data)]));
file_put_contents(__DIR__ . '/logs/tester.txt', $_POST['json'] . PHP_EOL, FILE_APPEND);
// Input $data = extract($_POST); // Output $url = 'http://api.example.com'; $data = array('foo' => 'bar'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); $result = curl_exec($ch); curl_close($ch);

Можно использовать параметры CURLOPT_TIMEOUT/CURLOPT_CONNECTTIMEOUT, чтобы автоматически разрывать соединение. При отправке запроса будет ошибка, но запрос выполнится:

curl_setopt($ch, CURLOPT_TIMEOUT, 1);

По хорошему, нужно использовать очередь сообщений. Так же можно попробовать запустить процесс в фоновом режиме:
Как правильно запустить внешний скрипт в фоновом режиме?

Еще, как вариант, Вы можете сбросить соединение на стороне script.php без остановки скрипта, если на сервере используется FastCGI (FPM):

Digiport

function wbAuthPostContents($url, $post=null, $username=null,$password=null) < if (func_num_args()==3) < $password=$username; $username=$get; $post=array(); >if (!is_array($post)) $post=(array)$post; $cred = sprintf('Authorization: Basic %s', base64_encode("$username:$password") ); $post=http_build_query($post); $opts = array( 'http'=>array( 'method'=>'POST', 'header'=>$cred, 'content'=>$post ) ); $context = stream_context_create($opts); $result = file_get_contents($url, false, $context); return $result; >

Источник

Оцените статью