PHP“php://input”vs $ _POST

在与来自JQuery的Ajax请求进行交互时,我被指示使用php://input而不是$_POST 。 我不明白的是使用这个比$_POST$_GET的全局方法的好处。

原因是php://input返回请求的HTTP头之后的所有原始数据,而不pipe内容types如何。

PHP超全局$_POST ,只是包装数据

  • application/x-www-form-urlencoded (标准内容types,用于简单的表单)或者
  • multipart/form-data-encoded (主要用于file upload)

这是因为这些是用户代理必须支持的唯一内容types。 所以服务器和PHP传统上不希望收到任何其他内容types(这并不意味着他们不能)。

所以,如果你只是发布一个好的旧的HTML form ,请求看起来像这样:

 POST /page.php HTTP/1.1 key1=value1&key2=value2&key3=value3 

但是,如果你正在使用Ajax,那么这个概率还包括用types(string,int,bool)和结构(数组,对象)交换更复杂的数据,所以在大多数情况下,JSON是最好的select。 但是带有JSON有效载荷的请求将如下所示:

 POST /page.php HTTP/1.1 {"key1":"value1","key2":"value2","key3":"value3"} 

内容现在是application/json (或者至less上面没有提到),所以PHP的$_POST包装器不知道如何处理(还)。

数据仍然存在,你不能通过包装来访问它。 所以你需要使用file_get_contents('php://input')以原始格式自己获取它( 只要它不是multipart/form-data -encoded )。

这也是您如何访问XML数据或任何其他非标准内容types。

php://input可以给你数据的原始字节。 如果POST数据是JSON编码结构,那么AJAX POST请求通常就是这种情况。

这是一个function,做到这一点:

  /** * 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数组更有用。 这仅适用于发布的数据采用公认的格式,通常是application/x-www-form-urlencoded (见http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4详情)。;

如果发布数据格式不正确,$ _POST将不包含任何内容。 然而,php://input将会有格式不正确的string。

例如,有一些ajax应用程序,它们不能形成正确的post-key-value序列用于上传文件,只是将所有文件转储为post数据,而不用variables名或任何东西。 $ _POST将是空的,$ _FILES也是空的,php://input将包含精确的文件,写成一个string。