为什么我不能从 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()
.
更多信息:
我有一个简单的获取请求,如下所示:
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()
.
更多信息: