Переменные извне PHP
Когда происходит отправка данных формы PHP-скрипту, информация из этой формы автоматически становится доступной ему. Существует несколько способов получения этой информации, например:
Пример #1 Простая HTML-форма
С версии PHP 5.4.0, есть только два способы получить доступ к данным из HTML форм. Доступные сейчас способы приведены ниже:
Пример #2 Доступ к данным из простой HTML POST-формы
В старых версиях PHP также существовало несколько других способов. Они приведены ниже. Смотрите также список изменений внизу страницы.
Пример #3 Старые способы получения пользовательских данных
// ВНИМАНИЕ: эти методы больше НЕ поддерживаются.
?php
// Использование import_request_variables() — эта функция удалена в PHP 5.4.0
import_request_variables ( ‘p’ , ‘p_’ );
echo $p_username ;
// Эти длинные предопределенные массивы удалены в PHP 5.4.0
echo $HTTP_POST_VARS [ ‘username’ ];
// Использование register_globals. Эта функциональность удалена в PHP 5.4.0
echo $username ;
?>
GET-форма используется аналогично, за исключением того, что вместо POST, вам нужно будет использовать соответствующую предопределенную переменную GET. GET относится также к QUERY_STRING (информация в URL после ‘?’). Так, например, http://www.example.com/test.php?id=3 содержит GET-данные, доступные как $_GET[‘id’] . Смотрите также $_REQUEST .
Замечание:
Точки и пробелы в именах переменных преобразуется в знаки подчеркивания. Например, станет $_REQUEST[«a_b»].
PHP также понимает массивы в контексте переменных формы (смотрите соответствующие ЧАВО). К примеру, вы можете сгруппировать связанные переменные вместе или использовать эту возможность для получения значений списка множественного выбора select. Например, давайте отправим форму самой себе, а после отправки отобразим данные:
Пример #4 Более сложные переменные формы
if ( $_POST ) echo ‘
' ;
echo htmlspecialchars ( print_r ( $_POST , true ));
echo '
‘ ;
>
?>
?php
Имена переменных кнопки-изображения
При отправке формы вместо стандартной кнопки можно использовать изображение с помощью тега такого вида:
Когда пользователь щелкнет где-нибудь на изображении, соответствующая форма будет передана на сервер с двумя дополнительными переменными — sub_x и sub_y . Они содержат координаты нажатия пользователя на изображение. Опытные программисты могут заметить, что на самом деле имена переменных, отправленных браузером, содержат точку, а не подчеркивание, но PHP автоматически конвертирует точку в подчеркивание.
HTTP Cookies
PHP прозрачно поддерживает HTTP cookies как определено в » RFC 6265. Cookies — это механизм для хранения данных в удаленном браузере и отслеживания и идентификации таким образом вернувшихся пользователей. Вы можете установить cookies, используя функцию setcookie() . Cookies являются частью HTTP-заголовка, поэтому функция SetCookie должна вызываться до того, как браузеру будет отправлен какой бы то ни было вывод. Это ограничение аналогично ограничению функции header() . Данные, хранящиеся в cookie, доступны в соответствующих массивах данных cookie, таких как $_COOKIE и $_REQUEST . Подробности и примеры смотрите на странице setcookie() руководства.
Если вы хотите присвоить множество значений одной переменной cookie, вы можете присвоить их как массив. Например:
setcookie ( «MyCookie[foo]» , ‘Testing 1’ , time ()+ 3600 );
setcookie ( «MyCookie[bar]» , ‘Testing 2’ , time ()+ 3600 );
?>?php
Это создаст две разные cookie, хотя в вашем скрипте MyCookie будет теперь одним массивом. Если вы хотите установить именно одну cookie со множеством значений, примите во внимание сначала применение к значениям таких функций, как serialize() или explode() .
Обратите внимание, что cookie заменит предыдущую cookie с тем же именем в вашем браузере, если только путь или домен не отличаются. Так, для приложения корзины покупок вы, возможно, захотите сохранить счетчик. То есть:
Пример #5 Пример использования setcookie()
if (isset( $_COOKIE [ ‘count’ ])) $count = $_COOKIE [ ‘count’ ] + 1 ;
> else $count = 1 ;
>
setcookie ( ‘count’ , $count , time ()+ 3600 );
setcookie ( «Cart[ $count ]» , $item , time ()+ 3600 );
?>?php
Точки в именах приходящих переменных
Как правило, PHP не меняет передаваемых скрипту имен переменных. Однако следует отметить, что точка не является корректным символом в имени переменной PHP. Поэтому рассмотрим такую запись:
В данном случае интерпретатор видит переменную $varname , после которой идет оператор конкатенации, а затем голая строка (то есть, не заключенная в кавычки строка, не соответствующая ни одному из ключевых или зарезервированных слов) ‘ext’. Очевидно, что это не даст ожидаемого результата.
По этой причине важно заметить, что PHP будет автоматически заменять любые точки в именах приходящих переменных на символы подчеркивания.
Определение типов переменных
Поскольку PHP определяет и конвертирует типы переменных (в большинстве случаев) как надо, не всегда очевидно, какой тип имеет данная переменная в конкретный момент времени. PHP содержит несколько функций, позволяющих определить тип переменной, таких как: gettype() , is_array() , is_float() , is_int() , is_object() и is_string() . Смотрите также раздел Типы.
Список изменений
Версия | Описание |
---|---|
5.4.0 | Register Globals, Magic Quotes и register_long_arrays удалены |
5.3.0 | Register Globals, Magic Quotes и register_long_arrays стали устаревшими |
4.2.0 | register_globals по умолчанию стала равна off. |
4.1.0 | Добавлены Суперглобальные массивы, такие как $_POST и $_GET |
Как получить содержимое 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;
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Получить все переменные, отправленные с POST?
Мне нужно вставить все переменные, отправленные с постом, они были флажками, каждый из которых представляет пользователя.
Если я использую GET, я получаю что-то вроде этого:
Мне нужно вставить переменные в базу данных.
Как получить все переменные, отправленные с помощью POST? Как массив или значения, разделенные запятыми или что-то?
6 ответов
Переменная $_POST автоматически заполняется.
Пытаться var_dump($_POST); чтобы увидеть содержимое.
Вы можете получить доступ к отдельным значениям, как это: echo $_POST[«name»];
Это, конечно, предполагает, что ваша форма использует типичную кодировку формы (т.е. enctype=”multipart/form-data”
Если ваши данные в другом формате (например, JSON или XML, вы можете сделать что-то вроде этого:
$post = file_get_contents('php://input');
а также $post будет содержать необработанные данные.
Предполагая, что вы используете стандарт $_POST переменная, вы можете проверить, если флажок установлен следующим образом:
if(isset($_POST['myCheckbox']) && $_POST['myCheckbox'] == 'Yes')
Если у вас есть массив флажков (например,
С помощью [ ] в имени флажка указывает, что к выбранным значениям PHP-скрипт будет обращаться как к массиву. В этом случае $_POST[‘myCheckbox’] не вернет ни одной строки, но вернет массив, состоящий из всех значений флажков, которые были проверены.
Например, если я установил все флажки, $_POST[‘myCheckbox’] будет массив, состоящий из: , Вот пример того, как извлечь массив значений и отобразить их:
$myboxes = $_POST['myCheckbox']; if(empty($myboxes)) < echo("You didn't select any boxes."); >else < $i = count($myboxes); echo("You selected $i box(es):
"); for($j = 0; $j < $i; $j++) < echo $myboxes[$j] . "
"; > >
Вы должны иметь возможность получить к ним доступ из $_POST переменная:
foreach ($_POST as $param_name => $param_val) < echo "Param: $param_name; Value: $param_val
\n"; >
Он устарел и не желает напрямую обращаться к суперглобалам (начиная с php 5.5, я думаю?)
Каждый современный IDE скажет вам:
Не открывайте Superglobals напрямую. Используйте некоторые функции фильтра (например, filter_input )
Для нашего решения, чтобы получить все параметры запроса, мы должны использовать метод filter_input_array
Чтобы получить все параметры из метода ввода, используйте это:
$myGetArgs = filter_input_array(INPUT_GET); $myPostArgs = filter_input_array(INPUT_POST); $myServerArgs = filter_input_array(INPUT_SERVER); $myCookieArgs = filter_input_array(INPUT_COOKIE); .
Теперь вы можете использовать его в var_dump или ваш foreach -Loops
Что не работает, так это доступ к суперглобальному $_REQUEST с помощью этого метода. Всегда возвращается NULL и это правильно.
Если вам нужно получить все входные параметры, используя разные методы, просто объедините их, как в следующем методе:
function askForPostAndGetParams()
Изменить: расширенная версия этого метода (работает также, когда один из методов запроса не установлен):
function askForRequestedArguments()