区别 PHP 的 $_POST、$HTTP_RAW_POST_DATA 和 php://input
Mac Pro 电脑编译安装了 PHP 5.6.21,先前的系统运行时报如下警告级错误:
Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version. To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead.
意思是 自动变量 $HTTP_RAW_POST_DATA 已过时,将来会被移除,使用 php://input 流方式代替!
总结:区别 PHP 的 $_POST、$HTTP_RAW_POST_DATA 和 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,soap 等非 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、如果是 application/x-www-form-urlencoded 和 multipart/form-data 格式 用 $_POST;
2、如果不能获取的时候比如 text/xml、application/json、soap,使用 file_get_contents('php://input');
【参考】
区别 PHP 的 $_POST、$HTTP_RAW_POST_DATA 和 php://input的更多相关文章
- $POST 、$HTTP_RAW_POST_DATA、php://input三者之间的区别
$POST .$HTTP_RAW_POST_DATA.php://input三者之间的区别 访问原始 POST 数据的更好方法是 php://input或者$HTTP_RAW_POST_DATA.$H ...
- $POST 、$HTTP_RAW_POST_DATA、php://input三者之间的差别
$POST .$HTTP_RAW_POST_DATA.php://input三者之间的差别 总是产生变量包括有原始的 POST 数据.否则,此变量仅在碰到未识别 MIME 类型的数据时产生.只是,訪问 ...
- 举例说明$POST 、$HTTP_RAW_POST_DATA、php://input三者之间的区别
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 说说$POST 、$HTTP_RAW_POST_DATA、php://input三者之间的区别
$POST $_POST是我们最常用的获取POST数据的方式,它是以关联数组方式组织提交的数据,并对此进行编码处理,如urldecode,甚至编码转换,识别的数据类型是PHP默认识别的数据类型 app ...
- 【PHP】$_POST, $HTTP_RAW_POST_DATA, and php://input
1.HTML <form> enctype Attribute application/x-www-form-urlencoded 传送之前所有的字符都会被encoded,(spaces ...
- 借助curl理解$GLOBALS['HTTP_RAW_POST_DATA'] ,$_POST, php://input
发送请求代码 post.php <?php $url='http://localhost/web/curl/url.php'; $data='a=123|b=2&c=3'; $heade ...
- 关于<button> 没写 type='button' 导致点击时提交以及<button>和<input type="button">的区别
这是我的第一篇博客,如果写的不好,请见谅 这是一个关于button按钮一个小问题 最近刚开学跟着老师一起写代码,在模仿JAVA web程序设计(慕课版) P61页第三章 Ajax处理XML的代码中发现 ...
- HTML中button和input button的区别
button和input button的区别 一句话概括主题:<button>具有<input type="button" ... >相同的作用但是在可操控 ...
- input属性 disabled与readonly的区别
从效果上看 源码 <!DOCTYPE html> <html> <head lang="en"> <meta charset=" ...
随机推荐
- UVa 11998 Broken Keyboard (数组模拟链表问题)
题目链接: 传送门 Broken Keyboard #include<bits/stdc++.h> using namespace std; char str[100010]; int m ...
- python中join和split函数
一个是分割,一个是连接. 惯例,先看内部帮助文档 Help on method_descriptor: join(...) S.join(iterable) -> string Return a ...
- 如何判断ios设备中是否安装了某款应用
URL Schemes关键字研究一下即可 常见得URL Schemes见http://www.cnblogs.com/huangzs/p/4491286.html if ([[UIApplicatio ...
- CDN网络(二)之配置和优化CDN核心缓存软件--squid
前言 squid是众多CDN厂商使用的核心缓存软件,都在已有的基础上进行二次开发.在部署squid的时候,建议遵循下面的规范. 1. 使用大内存服务器 对于热点文件,我们让squid用内存缓存,这样大 ...
- CSS3-border-radius的兼容写法大全
<!DOCTYPE html><html lang="zh-cn"><head> <meta charset="utf-8&qu ...
- ObjectInputStream类和ObjectInputStream类的使用
版权声明:本文为博主原创文章,未经博主允许不得转载. ObjectInputStream和ObjectInputStream类创建的对象被称为对象输入流和对象输出流. 创建文件输出流代码: FileO ...
- 关于datatable linq的转换
关于datatable datarow DataTable paraval = GetParaVal(DateCondition, strUrl, Page, RowPage, iYearMonthN ...
- PHP 生成图片缩略图函数
<?php /** * 生成缩略图函数(支持图片格式:gif.jpeg.png和bmp) * @author ruxing.li * @param string $src 源图片路径 * @pa ...
- MySQL数据库常用函数
一.数学函数 数学函数主要用于处理数字,包括整型.浮点数等. ABS(x) 返回x的绝对值 不区分大小写 SELECT ABS(-1) -- 返回1 CEIL(x),CEILING(x) 返回大于或等 ...
- Redis总结(三)Redis 的主从复制
接着上一篇,前面两篇我总结了<Redis总结(一)Redis安装>和<Redis总结(二)C#中如何使用redis> 所以这一篇,会讲讲Redis 的主从复制以及C#中如何调用 ...