zoukankan      html  css  js  c++  java
  • 【PHP】$_POST, $HTTP_RAW_POST_DATA, and php://input

    1、HTML <form> enctype Attribute

    • application/x-www-form-urlencoded  传送之前所有的字符都会被encoded,(spaces 被转换为+、特殊字符被转换为ASCII HEX)
    • multipart/form-data  没有字符被encoded,一般用upload
    • text/plain Spaces被转换为 + ,但是特殊字符不会被encoded

    For example, the key-value pairs

    name: Jonathan Doe
    age: 23
    formula: a + b == 13%!

    are encoded as the following raw data:

    name=Jonathan+Doe&age=23&formula=a+%2B+b+%3D%3D+13%25%21

    $_POST

    Array
    (
        [name] => Jonathan Doe
        [age] => 23
        [formula] => a + b == 13%!
    )

    $HTTP_RAW_POST_DATA

    print_r($GLOBALS['HTTP_RAW_POST_DATA'] );
    name=Jonathan+Doe&age=23&formula=a+%2B+b+%3D%3D+13%25%21

    php://input

    $post_data = file_get_contents('php://input');
    print_r($post_data);
    
    name=Jonathan+Doe&age=23&formula=a+%2B+b+%3D%3D+13%25%21

    2、$_POST

    $_POST是最常用的获取表单的方式,它是以关联数组方式组织提交的数据,并对此进行编码处理,如urldecode,甚至编码转换,识别的数据类型是PHP默认识别的数据类型 application/x-www.form-urlencoded

    无法解析如text/xml,application/json等非 application/x-www.form-urlencoded 数据类型的内容

    3、$HTTP_RAW_POST_DATA

    PHP默认识别的数据类型是application/x-www.form-urlencoded,用Content-Type=application/json 类型,提交的POST数据这时候 $_POST 就无法获取到了,但是使用 $GLOBALS['HTTP_RAW_POST_DATA'] 可以获取到。因为在PHP无法识别Content-Type的时候,就会把 POST 数据填入到 $HTTP_RAW_POST_DATA 中。

    • 设置 php.ini 中的 always_populate_raw_post_data 值为 On 才会生效

    • 当$_POST 可以取到值时 $HTTP_RAW_POST_DATA 为空

    • 不能用于 enctype="multipart/form-data"

    • PHP7中已经移除了这个全局变量,用 php://input 替代,使用 always_populate_raw_post_data 会导致在填充 $HTTP_RAW_POST_DATA 时产生 E_DEPRECATED 错误。 请使用php://input 替代 $HTTP_RAW_POST_DATA, 因为它可能在后续的 PHP 版本中被移除。 设置always_populate_raw_post_data 为 -1 (这样会强制 $HTTP_RAW_POST_DATA 未定义,所以也不回导致 E_DEPRECATED的错误) 来体验新的行为。

    4、php://input

    php://input 可通过输入流以文件读取方式取得未经处理的POST原始数据,允许读取 POST 的原始数据。和 $HTTP_RAW_POST_DATA 比起来,它给内存带来的压力较小。

    • 不需要任何特殊的 php.ini 设置

    • 不能用于 enctype="multipart/form-data"

    总结

    1、如果是 multipart/form-data  和 application/x-www-form-urlencoded 格式 用 $_POST

    2、如果不能获取的时候比如 application/json 使用 file_get_contents('php://input')

     

  • 相关阅读:
    KVM WEB管理工具——WebVirtMgr(二)日常配置
    在阿里云上遇见更好的Oracle(四)
    Django源码分析之权限系统_擒贼先擒王
    Django源码分析之server
    Django源码分析之执行入口
    HDFS常用文件操作
    排查实时tail功能cpu占用过高问题
    ZooKeeper完全分布式安装与配置
    Hadoop2.5.2集群部署(完全分布式)
    构造器
  • 原文地址:https://www.cnblogs.com/chenpingzhao/p/4985212.html
Copyright © 2011-2022 走看看