$_POST 和 php://input 的区别
手册中摘取的几句话:
- 当 HTTP POST 请求的 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data 时,会将变量以关联数组形式传入当前脚本。
- php://input 是个可以访问请求的原始数据的只读流。 enctype="multipart/form-data" 的时候php://input 是无效的。
验证下:
post.html
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<form action="getpost.php" method="post">
<input type="text" name="name" value="saisai">
<input type="submit" name="submit" value="submit">
</form>
</body>
</html>
getpost.php
<?php
echo "----------input--------<br />";
var_dump(file_get_contents('php://input', 'r'));
echo "----------post---------<br />";
var_dump($_POST);
?>
一、enctype="application/x-www-form-urlencoded"
请求主体:
Content-Type: application/x-www-form-urlencoded
Content-Length: 25 name=saisai&submit=submit
输出:
----------input-------- string 'name=saisai&submit=submit' (length=25) ----------post--------- array (size=2)
'name' => string 'saisai' (length=6)
'submit' => string 'submit' (length=6)
小结:当enctype="application/x-www-form-urlencoded"时,请求主体(request body)中的数据(name=saisai&submit=submit)转换成关联数组放入$_POST,而 php://input 则获取的是原始数据(raw data)。
二、enctype=“multipart/form-data”时
2.1 表单:
<form action="getpost.php" method="post" enctype="multipart/form-data">
<input type="text" name="name" value="saisai">
<input type="submit" name="submit" value="submit">
</form> 请求主题:
Content-Type: multipart/form-data; boundary=---------------------------22554656810024
Content-Length: 249 -----------------------------22554656810024
Content-Disposition: form-data; name="name" saisai
-----------------------------22554656810024
Content-Disposition: form-data; name="submit" submit
-----------------------------22554656810024--
输出:
----------input-------- string '' (length=0) ----------post--------- array (size=2)
'name' => string 'saisai' (length=6)
'submit' => string 'submit' (length=6)
小结:在enctype="multipart/form-data" 且没有上传文件控件时,$_POST 能正常打印数据,php:// 无效。
2.2 表单(添加一个文件上传):
<form action="getpost.php" method="post" enctype="multipart/form-data">
<input type="text" name="name" value="saisai">
<input type="submit" name="submit" value="submit">
</form>
请求主题:
Content-Type: multipart/form-data; boundary=---------------------------272321281228527
Content-Length: 68386 -----------------------------272321281228527
Content-Disposition: form-data; name="name" saisai
-----------------------------272321281228527
Content-Disposition: form-data; name="filename"; filename="dog.png"
Content-Type: image/png 一堆乱码
-----------------------------272321281228527
Content-Disposition: form-data; name="submit" submit
-----------------------------272321281228527--
输出:
----------input-------- string '' (length=0) ----------post--------- array (size=2)
'name' => string 'saisai' (length=6)
'submit' => string 'submit' (length=6)
小结:在enctype="multipart/form-data" 且有上传文件控件时,$_POST 能打印出传入的数据,但是排除了上传的任何内容。php:// 无效。
三、enctype="text/plain"
表单:
<form action="getpost.php" method="post" enctype="text/plain">
<input type="text" name="name" value="saisai"> <input type="submit" name="submit" value="submit">
</form>
请求主体:
Content-Type: text/plain
Content-Length: 28 name=saisai
submit=submit
输出:
----------input-------- string 'name=saisai submit=submit ' (length=28) ----------post--------- array (size=0)
empty
小结:enctype="text/plain"时,$_POST中没有内容,php://input中以键值对的方式存放。
总结:
- 当 HTTP POST 请求的 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data :php://input 中是形同 a=1&b=2的原始数据。$_POST 中是关联数组,且没有上传控件的内容。
- php://input 是个可以访问请求的原始数据的只读流。 enctype="multipart/form-data" 的时候php://input 是无效的。
- $_POST 不能获取 Content-Type = "text/plain"时 post的数据, php://input可以。
随机推荐
- [CSP-S模拟测试]:小P的生成树(数学+Kruskal)
题目描述 小$P$是个勤于思考的好孩子,自从学习了最大生成树后,他就一直在想:能否将边权范围从实数推广到复数呢?可是马上小$P$就发现了问题,复数之间的大小关系并没有定义.于是对于任意两个复数$z_1 ...
- 2019前端面试题汇总(vue)
毕业之后就在一直合肥小公司工作,没有老司机.没有技术氛围,在技术的道路上我只能独自摸索.老板也只会画饼充饥,前途一片迷茫看不到任何希望.于是乎,我果断辞职,在新年开工之际来到杭州,这里的互联网公司应该 ...
- 原生javascript兼容性总结
1.addEventListener() :方法用于向指定元素添加事件句柄.// Internet Explorer 8 及更早IE版本不支持,Opera 7.0 及 Opera 更早版本也不支持. ...
- javascript中for循环和标签元素赋值问题总结
<!DOCTYPE html><html><body><p>点击下面的按钮,将代码块循环五次:</p><button onclick= ...
- 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第8节 Math类_19_Math练习:小学数学真题
题目 画数轴 解题思路 强转成int类型就会舍弃小数位数 输出最终的数量 如果用Math.ceil的方式的话
- unigui 服务器 是否显示 程序窗口
unigui 服务器 是否显示 程序窗口 servermodule 窗体的这个standaloneserver属性 为false 时 显示窗体. 为true 时 不显示窗体. 哈哈
- python爬虫——爬取淘票票正在热映电影
今天正好学习了一下python的爬虫,觉得收获蛮大的,所以写一篇博客帮助想学习爬虫的伙伴们. 这里我就以一个简单地爬取淘票票正在热映电影为例,介绍一下一个爬虫的完整流程. 首先,话不多说,上干货——源 ...
- CSP2019 —— 今年欢笑复明年,不知退役在眼前
关于2019CSP-J/-S的一些体会 又是一年退役季,想起在群里看到大佬的一句诗,感慨万千. 今年欢笑复明年,不知退役在眼前 于是便心生文意,随便写点东西来给自己康康. 先说说这次的成绩吧.大家应该 ...
- MYSQL的ACID
原子性 (Atomicity) 原子性是指一个事务是一个不可分割的工作单位,其中的操作要么都做,要么都不做. 隔离性 (Isolation) 隔离性是指多个事务并发执行的时候,事务内部的操作与其他事务 ...
- Struts2的核心配置文件
Struts2的详细配置: 配置的是struts2的核心配置文件:,在struts2的核心配置文件中主要有三个标签需要进行配置:package,action,result. 1. 配置package标 ...