原生PHP接收$_POST的几种方式

HTTP 常见 Content-Type

> application/x-www-form-urlencoded
> multipart/form-data
> application/json

$_POST 默认只能接收到 Content-Type: application/x-www-form-urlencoded 的数据

如果Content-Type: application/json 需要用到php://input 处理输入流

> 请求内容 {"account": "123456"}
> $tmpData = strval(file_get_contents("php://input"));
> $DataArray = json_decode($tmpData, true);
> $account = $DataArray['account'];

Content-Type: multipart/form-data

> $tmpData = strval(file_get_contents("php://input"));
> public function parseData($data) {
> $list = explode("\r\n", $data);
> foreach($list as $value) {
> if($value) {
> if(strstr($value, '--')) continue;
> if(strpos($value, '-')) {
> $key = str_replace('"', '', strchr($value, '"'));
> continue;
> };
> if($value) {
> $array[$key] = $value;
> }
> }
> }
> return $array;
> }
> $DataArray = $this->parseData($tmpData);
> $DataArray['account'];

百度知道

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

说明:只能接收Content-Type: application/x-www-form-urlencoded提交的数据
解释:也就是表单POST过来的数据
方法2、file_get_contents(“php://input”);

说明:
允许读取 POST 的原始数据。
H T T P R A W P O S T D A T A 比 起 来 , 它 给 内 存 带 来 的 压 力 较 小 , 并 且 不 需 要 任 何 特 殊 的 p h p . i n i 设 置 。 p h p : / / i n p u t 不 能 用 于 e n c t y p e = " m u l t i p a r t / f o r m − d a t a " 。 解 释 : 对 于 未 指 定 C o n t e n t − T y p e 的 P O S T 数 据 , 则 可 以 使 用 f i l e g e t c o n t e n t s ( “ p h p : / / i n p u t ” ) ; 来 获 取 原 始 数 据 。 事 实 上 , 用 P H P 接 收 P O S T 的 任 何 数 据 都 可 以 使 用 本 方 法 。 而 不 用 考 虑 C o n t e n t − T y p e , 包 括 二 进 制 文 件 流 也 可 以 。 所 以 用 方 法 二 是 最 保 险 的 方 法 方 法 3 、 HTTP_RAW_POST_DATA 比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini 设置。 php://input 不能用于 enctype="multipart/form-data"。 解释: 对于未指定 Content-Type 的POST数据,则可以使用file_get_contents(“php://input”);来获取原始数据。 事实上,用PHP接收POST的任何数据都可以使用本方法。而不用考虑Content-Type,包括二进制文件流也可以。 所以用方法二是最保险的方法 方法3、 HTTPRAWPOSTDATAphp.iniphp://inputenctype="multipart/formdata"ContentTypePOST使filegetcontents(php://input);PHPPOST使ContentType,3GLOBALS[‘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过来的原始数据。
P O S T 或 _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’]中

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,这是一个使用原生 AJAX 发送 POST 请求的完整案例: HTML 代码: ``` <!DOCTYPE html> <html> <head> <title>使用原生 AJAX 发送 POST 请求</title> <meta charset="UTF-8"> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script> </head> <body> <h1>使用原生 AJAX 发送 POST 请求</h1> <form> <label for="name">姓名:</label> <input type="text" id="name" name="name"><br><br> <label for="email">邮箱:</label> <input type="email" id="email" name="email"><br><br> <button type="button" id="submit">提交</button> </form> <div id="result"></div> <script src="main.js"></script> </body> </html> ``` JavaScript 代码: ``` document.getElementById("submit").addEventListener("click", function() { var name = document.getElementById("name").value; var email = document.getElementById("email").value; var xhr = new XMLHttpRequest(); xhr.open("POST", "submit.php", true); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.onreadystatechange = function() { if (this.readyState === XMLHttpRequest.DONE && this.status === 200) { document.getElementById("result").innerHTML = this.responseText; } }; xhr.send("name=" + name + "&email=" + email); }); ``` PHP 代码(submit.php): ``` <?php $name = $_POST["name"]; $email = $_POST["email"]; echo "姓名:" . $name . "<br>邮箱:" . $email; ?> ``` 注意:这个案例使用了 jQuery 库,但是只是为了方便引入 Ajax 库。实际上,这个案例并不需要 jQuery。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值