php获取post表单数据,这是再正常不过的场景了,这里有几点需要注意,网上也都有提到。别人总结的毕竟不是自己的,为了体会这些注意点,我自己在本地搭建一个web application
, 然后去验证。注意点是:
$_POST
file_get_contents("php://input")
$GLOBALS['HTTP_RAW_POST_DATA']
这三者到底有什么却别?上前端代码:
<form name="form1" id="form1" method="post" action="index.php" enctype="application/x-www-form-urlencoded">
<fieldset class="form">
<p>
<label class="loginlabel" for="user_name">
Username:</label>
<input class="logininput ui-keyboard-input ui-widget-content ui-corner-all" name="user_name"
id="user_name" type="text" value="" />
</p>
<p>
<label class="loginlabel" for="user_password">
Password:</label>
<span>
<input class="logininput" name="user_password" id="user_password" type="password" /><img
id="passwd" class="tooltip" alt="Click to open the virtual keyboard" title="Click to open the virtual keyboard"
src="keyboard.png" /></span>
</p>
</fieldset>
上php代码:
<?php
var_dump($_POST);
var_dump(file_get_contents("php://input"));
var_dump($GLOBALS["HTTP_RAW_POST_DATA"]);
这三种获取POST表单数据的方式跟前端提交表单的enctype
(entity-body coding type)有关系,浏览器会在request的Content-type
字段给出post表单数据的编码方式。常见的编码方式:
1. URLencoded: application/x-www-form-urlencoded
2. Multipart: multipart/form-data
3. JSON: application/json
4. XML: text/xml
5. 纯文本: text/plain
在Web开发中,前三种格式非常常见。HTML中<form>支持urlencoded,multipart,plain text, 通过enctype属性来进行设置。AJAX中默认的则是JSON编码格式。我配置了下php.ini中的 always_populate_raw_post_data = On
。测试结果如下:
content_type = application/x-www-form-urlencoded => $_POST 和 file_get_contents("php://input")都可以获取表单数据,至于$GLOBALS['HTTP_RAW_POST_DATA']能不能就得看php.ini的配置了。
content_type = multipart/form-data => file_get_contents("php://input") 和 $GLOBALS['HTTP_RAW_POST_DATA']都获取不到数据,但$_POST可以,这点结论与网上其他文章不一样
content_type = text/plain => $_POST获取不到数据,file_get_contents("php://input")和$GLOBALS['HTTP_RAW_POST_DATA']可以获取到
content_type = application/json => $_POST 和 file_get_contents("php://input")都可以获取表单数据, $GLOBALS['HTTP_RAW_POST_DATA']不行
这里简单记录下POST表单数据的读取问题,网上针对这个问题的文章很多,这里只是简单备忘和验证。
end~
网友评论