PHP Sessions似乎被JS Fetch API破坏了

gt0wga4j  于 2023-03-21  发布在  PHP
关注(0)|答案(1)|浏览(121)

我有一个小问题,我的PHP应用程序。我已经有一个会话管理工作,但有一个路由,我想访问与fetch从我的前面,似乎会话不工作。
这是我的文件/tracking.php中的代码

session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {

    if($_POST['foo'] ?? false) {
        $_SESSION["foo"] = $_POST['foo'];
    }
    else {
        unset($_SESSION['foo']);
    }
}
http_response_code(204);
die();

这是我从前面做的fetch:

const body = new FormData();
body.append('foo', "bar")
fetch(`/tracking`, {
    credentials: "same-origin",
    method: "POST",
    body,
    headers: { "Content-Type": "application/x-www-form-urlencoded" }
})

但是,当我在我的控制台的网络选项卡中观看时,请求没有做任何事情。预览是空白的,我从后面得到了200个答案,但会话没有保留。
所以,为了调试,我将tracking.php修改为:

<?php
session_start();
var_dump($_POST["foo"]);
die();

但还是不行但是
1.如果我注解了session_start();行,它就能正常工作,并按预期执行var_dump。
1.如果我修改前端发送一个表单而不是一个fetch(cf下一个块代码),它就能工作

const form = document.createElement('form')
form.method = "POST"
form.action = "/tracking"
form.innerHTML = `<input type="hidden" name="foo" value="bar">`
document.body.appendChild(form)
form.submit()
form.remove()

关键是我真的需要使用获取API,我不能执行表单发送,你知道为什么它不工作吗?
谢谢你的帮忙!

wz3gfoph

wz3gfoph1#

我找到了我的答案:
问题不在于饼干,而在于取饼干!
我修改了我的代码,在fetch响应中添加了一些对答案的操作,现在它工作得很好!
现在我的代码看起来像这样:

const body = new FormData();
body.append('foo', "bar")
fetch(`/tracking`, {
    credentials: "same-origin",
    method: "POST",
    body,
    headers: { "Content-Type": "application/x-www-form-urlencoded" }
}).then(async r => await r.text())

它看起来工作正常。
我认为这是由于浏览器的东西?

相关问题