Мне было предложено использовать метод php://input
вместо $_POST
при взаимодействии с запросами Ajax из JQuery. То, что я не понимаю, – это преимущества использования этого против глобального метода $_POST
или $_GET
.
Причина в том, что php://input
возвращает все необработанные данные после HTTP-заголовков запроса независимо от типа содержимого.
PHP суперглобальный $_POST
, только предполагается обернуть данные, которые либо
application/x-www-form-urlencoded
(стандартный тип контента для простых форм-сообщений) или multipart/form-data-encoded
(в основном используется для загрузки файлов) Это связано с тем, что это единственные типы контента, которые должны поддерживаться пользовательскими агентами . Таким образом, сервер и PHP традиционно не ожидают получить какой-либо другой тип контента (что не означает, что они не могут).
Итак, если вы просто POST доброй старой HTML- form
, запрос выглядит примерно так:
POST /page.php HTTP/1.1 key1=value1&key2=value2&key3=value3
Но если вы много работаете с Ajax, этот probaby также включает обмен более сложными данными с типами (string, int, bool) и структурами (массивы, объекты), поэтому в большинстве случаев JSON – лучший выбор. Но запрос с полезной нагрузкой JSON будет выглядеть примерно так:
POST /page.php HTTP/1.1 {"key1":"value1","key2":"value2","key3":"value3"}
Теперь контент будет application/json
(или, по крайней мере, ни один из вышеупомянутых), поэтому PHP $_POST
-wrapper не знает, как справиться с этим (пока).
Данные все еще существуют, вы просто не можете получить к нему доступ через оболочку. Поэтому вам нужно получить его самостоятельно в необработанном формате с помощью file_get_contents('php://input')
( при условии, что это не multipart/form-data
-encoded ).
Это также способ доступа к XML-данным или любому другому нестандартному типу контента.
php://input
может дать вам необработанные байты данных. Это полезно, если POSTed-данные представляют собой кодированную JSON структуру, что часто бывает в случае запроса AJAX POST.
Вот как это сделать:
/** * Returns the JSON encoded POST data, if any, as an object. * * @return Object|null */ private function retrieveJsonPostData() { // get the raw POST data $rawData = file_get_contents("php://input"); // this returns null if not valid json return json_decode($rawData); }
Массив $_POST
более полезен, когда вы обрабатываете данные о ключевом значении из формы, представленной традиционным POST. Это работает только в том случае, если данные POSTed находятся в распознанном формате, обычно application/x-www-form-urlencoded
(см. http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4 для получения подробной информации).
Если почтовые данные неверны, $ _POST не будет содержать ничего. Тем не менее, вход php: // будет иметь неверную строку.
Например, есть некоторые приложения ajax, которые не формируют правильную последовательность ввода ключевого слова для загрузки файла и просто выгружают весь файл в виде пост-данных без имен переменных или чего-то еще. $ _POST будет пустым, $ _FILES также пуст, а вход php: // будет содержать точный файл, написанный как строка.