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

时间:2018-02-17 01:14:55

标签: php reactjs fetch-api

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

JavaScript(React)

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
}

现在,问题出在这里!响应正文显示“欢迎,用户#12!”当我按照它应该登录时,$_SESSION['user_id']设置为12而不存储在实际会话中...

如果我向页面发出GET请求,它会将$_SESSION转储出去,$_SESSION['user_id']无处可寻。

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

更新:页面底部的var_dump($_SESSION);转储与我用来存储$_SESSION的{​​{1}}不同的会话。我想知道是什么导致这个?为什么它会转储与我存储变量的会话不同的会话?

"user_id"我正在存储的会话:session_id()

我正在倾销的会话

0q44kc1fkph8fkc8gt35gfabe6session_id()

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

1 个答案:

答案 0 :(得分:1)

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

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

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

有关详细信息:https://stackoverflow.com/a/9797962/823549