【问题标题】:js fetch post works, but php is empty [duplicate]js fetch post工作,但php为空[重复]
【发布时间】:2021-03-25 04:18:01
【问题描述】:

我有这个获取方法

loginbutton.onclick = (e)=> {
    e.preventDefault();
    var creds = {
        login: login.value,
        pass: pass.value
    }
    
    fetch('functions/asklogin.php', {
        method: "POST",
        header: {"Content-type": "application/json; charset=UTF-8"},
        body: JSON.stringify(creds)
    })
    .then(resp => resp.text())
    .then(data => console.log(data));
}

当我点击时,我的 xhr 身体已经吃饱了:

但是,如果我尝试从我的 asklogin.php 中回显这些参数

echo "no".$_POST['pass'].":".$_POST['login'];

我得到的只是no:

感谢您的帮助

【问题讨论】:

  • var_dump($_POST)的结果是什么?
  • 这应该可以帮助你 - stackoverflow.com/q/8893574/4287624
  • @Richard .. 简而言之,要让$_POST 工作,您需要将数据作为表单数据连同相应的内容类型一起发送。如果你发送json数据那么你需要使用php://input来读取发布的数据。
  • 对不起,伙计们,我应该提到我知道流是提要(但我认为它是明确的,因为我已经发布了它的屏幕截图)。无论如何,谢谢@HymnZzy 是的,但是如何在 fetch api 中将数据作为经典形式传递?我在 api 文档中找不到正确的语法
  • 你可以像 HymnZzy 所说的那样做,但仅仅改变 PHP 读取数据的方式可能更简单(而且不那么脆弱)。

标签: javascript php fetch-api


【解决方案1】:

PHP 中的$_POST 将识别唯一具有指定内容类型标题的表单数据(application/x-www-form-urlencodedmultipart/form-data)。

对于任何其他内容类型,您需要使用php://input 来读取和解析数据。

对于您的情况,更改您通过fetch 发送的数据应该可以解决问题。

...
fetch('functions/asklogin.php', {
    method: "POST",
    headers: {"Content-type": "application/x-www-form-urlencoded; charset=UTF-8"},
    body: Object.entries(creds).map(([k,v])=>{return k+'='+v}).join('&') // in jQuery simply use $.param(creds) instead
})
...

另一种解决方案是改变 PHP 端读取数据的方式

...
if( is_empty($_POST) ){ $_POST = json_decode(file_get_contents('php://input', true)) }
...

【讨论】:

  • 好的,php端适配工作了。不是 fetch 方法,它似乎在字符串中丢失了一些东西?无论如何,谢谢!
猜你喜欢
  • 2021-07-04
  • 2019-10-22
  • 2018-02-06
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 2016-07-06
相关资源
最近更新 更多