前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >$_POST,$HTTP_RAW_POST_DATA 和 php://input 的区别

$_POST,$HTTP_RAW_POST_DATA 和 php://input 的区别

作者头像
Denis
发布2023-04-15 10:23:11
2.7K0
发布2023-04-15 10:23:11
举报
文章被收录于专栏:WordPress果酱WordPress果酱

PHP 7 已经取消了 $HTTP_RAW_POST_DATA,请用 php://input 代替。

HTML <form> 标签的 enctype 属性

首先来了解什么是 <form> 标签的 enctype 属性,enctype 属性规定了在发送到服务器之前应该如何对表单数据进行编码,有三种类型:

属性值

描述

application/x-www-form-urlencoded

默认模式,在发送到服务器之前,所有字符都会进行编码(空格转换为 "+" 加号,特殊符号转换为 ASCII HEX 值)

multipart/form-data

不对字符编码,在使用包含文件上传控件的表单时,必须使用该值。

text/plain

空格转换为 "+" 加号,但不对特殊字符编码。

当在网页提交了一个表单之后,可以使用三种 PHP 方式来获取 Post 数据:_POST,HTTP_RAW_POST_DATA 和 php://input,有什么区别呢?

$_POST

_POST 是获取表单 POST 过来数据(body部分)的最常用方法,上传的文件信息使用 _FILES 获取。

$HTTP_RAW_POST_DATA

当浏览器从表单发送 POST 请求的时候,默认的 media type 是 "application/x-www-form-urlencoded",意思就是字段名和值都编码了,每个 key-value 对使用 '&' 字符分隔开,key 和 value 使用 '=' 分开,并且 key 和 value 中的空格都会被替换成 + ,其他特殊字符都会被使用 urlencode 方式进行编码。

比如下面的 key-value 对:

代码语言:javascript
复制
name: Jonathan Doe
age: 23
formula: a + b == 13%!

会被编码下面的原始数据:

代码语言:javascript
复制
name=Jonathan+Doe&age=23&formula=a+%2B+b+%3D%3D+13%25%21

PHP 会解析这些原始的 POST 数据,并且格式化成数组,填充到 $_POST 中:

代码语言:javascript
复制
Array
(
    [name] => Jonathan Doe
    [age] => 23
    [formula] => a + b == 13%!
)

HTTP_RAW_POST_DATA 是 PHP 的一个预定义的变量,用来获取原始的 POST 数据,比如上面的情况下,HTTP_RAW_POST_DATA 的值就是:

代码语言:javascript
复制
name=Jonathan+Doe&age=23&formula=a+%2B+b+%3D%3D+13%25%21

但是 $HTTP_RAW_POST_DATA 需要在 php.ini 中设置开启:

代码语言:javascript
复制
always_populate_raw_post_data = On

还有一点,HTTP_RAW_POST_DATA 不支持 enctype="multipart/form-data" 方式传递的数据,这种情况下,我们要用

php://input

由于 $HTTP_RAW_POST_DATA 取决于 php.ini 设置,有没有更好的方法呢?

我们可以使用 php://input 来获取原始的 POST 数据,并且 php://input 比 HTTP_RAW_POST_DATA 更少消耗内存,当然 php://input 和 HTTP_RAW_POST_DATA 一样,它也不支持 enctype="multipart/form-data" 方式传递的数据。

由于 php://input 只是数据流,我们可以使用 file_get_contents() 函数去获取它的内容:

代码语言:javascript
复制
$post_data = file_get_contents('php://input');
print_r($post_data);

获取到的内容和 $HTTP_RAW_POST_DATA 是一样的。

原始的 POST 数据有什么用?

那么原始的 POST 数据有什么用?因为很多时候,接收到不是网页 POST 过来的数据,而是可能通过其他方式 POST 过来的 "text/xml" 格式的数据,这些内容无法解析成 $_POST 数组,这个时候我们就需要原始的 POST 数据进行处理。


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • HTML <form> 标签的 enctype 属性
  • $_POST
  • $HTTP_RAW_POST_DATA
  • php://input
  • 原始的 POST 数据有什么用?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档