PHP "php: // input" против $ _POST - PullRequest
       11

PHP "php: // input" против $ _POST

209 голосов
/ 17 января 2012

Мне было приказано использовать метод php://input вместо $_POST при взаимодействии с Ajax-запросами из JQuery. Что я не понимаю, так это преимущества использования этого метода по сравнению с глобальным $_POST или $_GET.

Ответы [ 4 ]

404 голосов
/ 17 января 2012

Причина в том, что php://input возвращает все необработанные данные после HTTP-заголовков запроса, независимо от типа содержимого.

Суперглобальный PHP $_POST, предполагается, что только Обтекание данных:

  • application/x-www-form-urlencoded (стандартный тип контента для простых форм-публикаций) или
  • multipart/form-data-encoded (в основном используется для загрузки файлов)

Это потому, что это единственные типы контента, которые должны поддерживаться пользовательскими агентами .Таким образом, сервер и PHP традиционно не ожидают получения какого-либо другого типа контента (что не означает, что они не могут).

Так что, если вы просто отправляете старый добрый HTML form, запросвыглядит примерно так:

POST /page.php HTTP/1.1

key1=value1&key2=value2&key3=value3

Но если вы много работаете с Ajax, эта проба также включает обмен более сложными данными с типами (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 -кодирован ).

Это также способ доступа к XML-данным или любому другому нестандартному типу контента.

45 голосов
/ 17 января 2012

php://input может дать вам необработанные байты данных.Это полезно, если POST-данные представляют собой структуру в кодировке 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);
  }

The $_POST массив более полезен, когда вы обрабатываете данные значения ключа из формы, представленной традиционным POST.Это работает, только если данные POST представлены в распознанном формате, обычно application/x-www-form-urlencoded (подробности см. http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4).

24 голосов
/ 17 января 2012

Если данные поста искажены, $ _POST ничего не будет содержать. Тем не менее, php: // input будет иметь некорректную строку.

Например, есть некоторые приложения ajax, которые не формируют правильную последовательность ключ-значение поста для загрузки файла, а просто выгружают весь файл как данные поста, без имен переменных или чего-либо еще. $ _POST будет пустым, $ _FILES также пустым, а вход php: // будет содержать точный файл, записанный в виде строки.

0 голосов
/ 20 декабря 2018

Простой пример того, как его использовать

 <?php  
     if(!isset($_POST) || empty($_POST)) { 
     ?> 
        <form name="form1" method="post" action=""> 
          <input type="text" name="textfield"><br /> 
          <input type="submit" name="Submit" value="submit"> 
        </form> 
   <?php  
        } else { 
        $example = file_get_contents("php://input");
        echo $example;  }  
   ?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...