为什么我不能从 whatwg-fetch 请求中设置 PHP $_SESSION?

Why can't I set PHP $_SESSION from a whatwg-fetch request?

我有一个简单的获取请求,如下所示:

JavaScript(反应)

fetch('/includes/signon.php', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    Email: event.target.form.email.value,
    Password: event.target.form.password.value,
  })
})
.then((response) => {
  return response.text()
}).then((body) => {
  this.displayWelcomeMessage(body);
})

在后端,我有 PHP 像这样处理获取请求:

PHP 5

<?php
require_once('database.php');
session_start();

$request_body = file_get_contents('php://input');
$json = json_decode($request_body);

if (!empty($json->Email) && !empty($json->Password)) {
  global $db, $json;
  $sql = "SELECT `user_id` from users where email = ? AND password = ?;";
  $stmt = $db->initialize_statement();
  if (!$stmt->prepare($sql)) {
    $error = $stmt->error;
    echo $stmt->error;
  } else {
    $email = $json->Email;
    $password = $json->Password; // Stored as a string for the sake of simplicity
    $stmt->bind_param('ss', $email, $password);
    $stmt->execute();
    $stmt->store_result();
    $stmt->bind_result($result);
    while($stmt->fetch()) {
      if ($stmt->num_rows === 0) {
        echo "Incorrect Username or Password";
      } else {
        // Here lies the problem...
        $_SESSION['user_id'] = $result;
        echo "Welcome, User #".$result."!";
      }
    }
    $stmt->close();
  }
} else {
  var_dump($_SESSION); // For debugging purposes only
}

现在,问题来了!当我正常登录时,响应正文显示 "Welcome, User #12!",但 $_SESSION['user_id'] 设置为 12 而未存储在实际会话中...

如果我向该页面发出 GET 请求,它会将 $_SESSION 转储出去,并且找不到 $_SESSION['user_id']

为什么?我究竟做错了什么?我只想完成这个项目...

更新: 页面底部的 var_dump($_SESSION); 正在转储与我用来存储 "user_id"。我想知道是什么原因造成的?为什么它会转储与我存储变量的会话不同的会话?

session_id() 在会话中我存储到:0q44kc1fkph8fkc8gt35gfabe6

session_id() 在会话中我正在倾销:a493j3v5vbnlon02s1s7bpkqj3

所以...每次我设置 "user_id" 时都会创建一个新会话?为什么?

问题很可能在于您为会话启用了 cookie,并且 cookie 的生命周期为 0。例如,让我们尝试在脚本的开头将其设置为 7 天:

ini_set('session.cookie_lifetime', 60 * 60 * 24 * 7);

如果可行,我建议将 session.cookie_lifetime 设置移动到您的 php.ini 文件,这样您编写的每个脚本都不需要 运行 ini_set().

更多信息: