一、PHP获取POST数据的几种方法

php获取post表单数据,这是再正常不过的场景了,这里有几点需要注意,网上也都有提到。别人总结的毕竟不是自己的,为了体会这些注意点,我自己在本地搭建一个web application,
然后去验证。注意点是:

方法1、最常见的方法是:$_POST[‘fieldname’];

$_POST
file_get_contents("php://input")
$GLOBALS['HTTP_RAW_POST_DATA']

说明:只能接收Content-Type:
application/x-www-form-urlencoded提交的数据
解释:也就是表单POST过来的数据

这三者到底有什么却别?上前端代码:

方法2、file_get_contents(“php://input”);

<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>

                        <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" />
                </p>
            </fieldset>

说明:
允许读取 POST 的原始数据。
和 $HTTP_RAW_POST_DATA
比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini 设置。
php://input 不能用于 enctype=”multipart/form-data”。
解释:
对于未指定 Content-Type
的POST数据,则可以使用file_get_contents(“php://input”);来获取原始数据。
事实上,用PHP接收POST的任何数据都可以使用本方法。而不用考虑Content-Type,包括二进制文件流也可以。
所以用方法二是最保险的方法

上php代码:

方法3、$GLOBALS[‘HTTP_RAW_POST_DATA’];

<?php
var_dump($_POST);
var_dump(file_get_contents("php://input"));
var_dump($GLOBALS["HTTP_RAW_POST_DATA"]);

说明:
总是产生 $HTTP_RAW_POST_DATA  变量包含有原始的 POST 数据。
此变量仅在碰到未识别 MIME 类型的数据时产生。
$HTTP_RAW_POST_DATA  对于 enctype=”multipart/form-data” 
表单数据不可用
如果post过来的数据不是PHP能够识别的,可以用
$GLOBALS[‘HTTP_RAW_POST_DATA’]来接收,
比如 text/xml 或者 soap 等等
解释:
$GLOBALS[‘HTTP_RAW_POST_DATA’]存放的是POST过来的原始数据。
$_POST或$_REQUEST存放的是 PHP以key=>value的形式格式化以后的数据。
但$GLOBALS[‘HTTP_RAW_POST_DATA’]中是否保存POST过来的数据取决于centent-Type的设置,即POST数据时
必须显式示指明Content-Type:
application/x-www-form-urlencoded,POST的数据才会存放到
$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

1、PHP 如何获取POST过来的XML数据和解析XML数据

在Web开发中,前三种格式非常常见。HTML中<form>支持urlencoded,multipart,plain
text,
通过enctype属性来进行设置。AJAX中默认的则是JSON编码格式。我配置了下php.ini中的
always_populate_raw_post_data = On。测试结果如下:

比如我们在开发微信企业号时,如何处理用户回复过来的数据呢?
文档:
首先查阅文档,可知道:启用开发模式后,当用户给应用回复信息时,微信服务端会POST一串XML数据到已验证的回调URL

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']不行

假设该URL为 http://www.xxx.com
Http请求方式: POST

这里简单记录下POST表单数据的读取问题,网上针对这个问题的文章很多,这里只是简单备忘和验证。
end~

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注