首页 文章

PHP“php:// input”vs $ _POST

提问于
浏览
182

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

3 回答

  • 353

    原因是 php://input 返回请求的HTTP标头之后的所有原始数据,而不管内容类型如何 .

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

    • application/x-www-form-urlencoded (简单表格帖子的标准内容类型)或

    • multipart/form-data-encoded (主要用于文件上传)

    这是因为这些是must be supported by user agents的唯一内容类型 . 所以服务器和PHP传统上并不意味着他们不能这样做 .

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

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

    但是如果你正在使用Ajax,那么这个probaby还包括用类型(string,int,bool)和结构(数组,对象)交换更复杂的数据,所以在大多数情况下JSON是最好的选择 . 但是带有JSON-payload的请求看起来像这样:

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

    内容现在是 application/json (或至少没有上述内容),因此PHP的 $_POST -wrapper不知道如何处理(尚未) .

    数据仍然存在,您无法通过包装器访问它 . 所以你需要使用 file_get_contents('php://input')as long as it's not multipart/form-data-encoded)以原始格式自己获取它 .

    这也是您访问XML数据或任何其他非标准内容类型的方式 .

  • 38

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

  • 24

    如果发布数据格式错误,$ _POST将不包含任何内容 . 然而,php://输入将具有格式错误的字符串 .

    例如,有一些ajax应用程序,它们没有形成正确的后键值序列来上传文件,只是将所有文件转储为发布数据,没有变量名称或任何东西 . $ _POST将为空,$ _FILES也为空,而php://输入将包含精确文件,写为字符串 .

相关问题