$_POST,$HTTP_RAW_POST_DATA 和 php://input 的区别
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 对:
name: Jonathan Doe
age: 23
formula: a + b == 13%!
会被编码下面的原始数据:
name=Jonathan+Doe&age=23&formula=a+%2B+b+%3D%3D+13%25%21
PHP 会解析这些原始的 POST 数据,并且格式化成数组,填充到 $_POST 中:
Array
(
[name] => Jonathan Doe
[age] => 23
[formula] => a + b == 13%!
)
HTTP_RAW_POST_DATA 是 PHP 的一个预定义的变量,用来获取原始的 POST 数据,比如上面的情况下,HTTP_RAW_POST_DATA 的值就是:
name=Jonathan+Doe&age=23&formula=a+%2B+b+%3D%3D+13%25%21
但是 $HTTP_RAW_POST_DATA 需要在 php.ini 中设置开启:
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() 函数去获取它的内容:
$post_data = file_get_contents('php://input');
print_r($post_data);
获取到的内容和 $HTTP_RAW_POST_DATA 是一样的。
原始的 POST 数据有什么用?
那么原始的 POST 数据有什么用?因为很多时候,接收到不是网页 POST 过来的数据,而是可能通过其他方式 POST 过来的 "text/xml" 格式的数据,这些内容无法解析成 $_POST 数组,这个时候我们就需要原始的 POST 数据进行处理。
相关文章
- Http通过header传递参数_http contenttype
- 使用 http-proxy 代理 HTTP 请求时遇到的 the requested url is invalid 错误消息
- linux基础:Cron定时执行带参数的PHP程序
- PHP while和do while循环
- php浮点数精确运算详解编程语言
- PHP压缩文件夹的方法详解编程语言
- MySQL数据库管理应用PHP技术(mysql数据库php)
- 基于PHP的MySQL访问方式(php访问mysql)
- Linux重启PHP的命令操作指南(linux重启php命令)
- 转换PHP与MySQL类型转换的实现(phpmysql类型)
- 数据快速检索MySQL中的数据:使用PHP(php检索mysql)
- PHP 如何调用 MySQL 函数(php调用mysql函数)
- PHP轻松访问MySQL数据:使用简明易懂的方法获取数据(php获取mysql数据)
- 轻松搞定!一键操作快速连接PHP和MySQL数据库(一键phpmysql)
- 让PHP连接MSSQL数据库的正确方式(php如何连mssql)
- 使用PHP 驱动MSSQL支撑稳固的开发环境(php mssql 驱动)
- 基于PHP和MSSQL的连接设置(php mssql设置)
- Linux拦截HTTP的安全防护(Linux拦截http)
- Linux查看PHP版本的方法简介(linux查看php版本)
- 基于Redis和PHP技术的投票系统优化(投票 redis php)
- PHP中调用JAVA
- Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
- PHP学习笔记之二php入门知识
- PHP和Mysqlweb应用开发核心技术第1部分Php基础-1开始了解php
- php团购折扣计算公式
- php引用地址改变变量值的问题
- php数据结构与算法(PHP描述)快速排序quicksort
- php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
- 实现获取http内容的php函数分享
- php分页示例分享