Javascript Php和fetch-刷新后未存储会话变量
前提:这在MAMP本地环境下运行完全正常。 我有一个经典的设置,通过在验证表单中输入的信息后设置会话来验证用户 这些文件是3个: index.php-->启动会话并检查会话变量“userId”是否存在。 如果没有,它会显示一个要登录的菜单 Register.js-->包含要注册和登录的js函数的文件。这两个函数都使用Fetch将数据发布到phpapi端点 signin.php--?获取发布的信息,检查用户名和密码是否正确,然后创建会话变量并将其作为响应回显 响应按照预期到达fetch请求(我已经通过将会话变量传递给响应对象和控制台进行了验证。将其记录在index.php上),但是当我刷新页面时,会话变量就消失了 ===================== php在页面顶部启动会话。 编辑:在下面添加了文件Javascript Php和fetch-刷新后未存储会话变量,javascript,php,session,fetch,Javascript,Php,Session,Fetch,前提:这在MAMP本地环境下运行完全正常。 我有一个经典的设置,通过在验证表单中输入的信息后设置会话来验证用户 这些文件是3个: index.php-->启动会话并检查会话变量“userId”是否存在。 如果没有,它会显示一个要登录的菜单 Register.js-->包含要注册和登录的js函数的文件。这两个函数都使用Fetch将数据发布到phpapi端点 signin.php--?获取发布的信息,检查用户名和密码是否正确,然后创建会话变量并将其作为响应回显 响应按照预期到达fetch请求(我已经
<?php session_start();
print_r($_SESSION); // This prints an empty array.
?>
<html>
<head>
<!-- Irrelevant -->
</head>
<body>
<div id='main'>
<div class='logo'>
</div>
<div class='searchContainer'>
<!-- Irrelevant -->
</div>
<?php
if (isset($_SESSION["userId"])){
?>
<!-- Logged in menu -->
<div class=menuContainer>
<!-- Irrelevant -->
</div>
<dialog class="nes-dialog is-rounded grrr-dialog" id="dialogAddRage">
<!-- Irrelevant -->
</dialog>
<?php } else { ?>
<!-- Logged out menu -->
<div class=menuContainer>
<!-- Irrelevant -->
</div>
<dialog class="nes-dialog is-rounded grrr-dialog" id="dialogSignup">
<!-- Irrelevant -->
</dialog>
<dialog class="nes-dialog is-rounded grrr-dialog" id="dialogSignin">
<!-- Irrelevant -->
</dialog>
<?php } // else ?>
<div align=center class="masonry-wrapper">
<!-- Irrelevant -->
</div>
<div id="picModal" class="modal">
<!-- Irrelevant -->
</div>
<section class="message-list">
<!-- Irrelevant -->
<section>
<div id='footer'>
<!-- Irrelevant -->
</div>
</section>
</div> <!-- close main -->
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<script src="js/dialog-polyfill.js"></script>
<script src="js/jquery-3.4.1.min.js"></script>
<script src="js/core.js"></script>
<script src="js/register.js"></script>
<script src="js/fetch_functions.js"></script>
<script src="js/add_rage.js"></script>
</body>
</html>
signin.php
<?php
include_once 'db_connections.php';
$responseObj = new stdClass();
if (isset($_POST['name_field_signin'])){
$userCheck = FALSE; //very simple query
$sql = ("SELECT username, password, user_id FROM users");
$result = $dbh->query($sql);
while ($row = $result->fetch()){
if ($_POST['name_field_signin'] == $row[ 'username'] && md5($_POST['password_field_signin']) == $row[ 'password'] ){
$user_id = $row[ 'user_id'];
$userCheck = TRUE;
break;
}
}
if ($userCheck){
$_SESSION["userId"]=$user_id;
$_SESSION["username"]=$_POST['name_field_signin'];
$responseObj->status = 'signin-success';
$responseObj->userId = $_SESSION["userId"];
}
else{
$responseObj->status = 'signin-error';
}
}
else{
$responseObj->status = 'call-error';
}
$responseJSON = json_encode($responseObj);
echo $responseJSON;
我没看到你打电话来。这可能与此有关。此外,我还将编写一个概念证明,测试您是否可以在会话中保存某些内容并检索它。如果失败,请检查PHP进程是否可以写入会话。如前所述,我调用index.PHP顶部的session_start()。如果该文件已经无法实现这一点,您将如何进一步测试会话存储?您声明脚本在顶部调用了session\u start()
,但没有显示它session_start()
可能会自动失败,可能是因为在调用session_start()
之前,脚本无意中输出了空格或其他字符。除非我们能看到你的整个剧本,否则我们永远不会知道。至于测试,我将编写一个独立的PHP脚本,调用session\u start()
,并在会话中保存一些内容。编写另一个独立脚本,调用会话\u start()
并读取会话中的内容。如果这样做行得通,那么会话就不是问题了。我添加了索引的提取,没有了不相关的html片段。我还测试了另一个文件中的会话,它看起来确实像预期的那样保存了下来,所以我这里肯定遗漏了一些东西。另外,请将session\u start()
放在signin.php
的开头。
<?php
include_once 'db_connections.php';
$responseObj = new stdClass();
if (isset($_POST['name_field_signin'])){
$userCheck = FALSE; //very simple query
$sql = ("SELECT username, password, user_id FROM users");
$result = $dbh->query($sql);
while ($row = $result->fetch()){
if ($_POST['name_field_signin'] == $row[ 'username'] && md5($_POST['password_field_signin']) == $row[ 'password'] ){
$user_id = $row[ 'user_id'];
$userCheck = TRUE;
break;
}
}
if ($userCheck){
$_SESSION["userId"]=$user_id;
$_SESSION["username"]=$_POST['name_field_signin'];
$responseObj->status = 'signin-success';
$responseObj->userId = $_SESSION["userId"];
}
else{
$responseObj->status = 'signin-error';
}
}
else{
$responseObj->status = 'call-error';
}
$responseJSON = json_encode($responseObj);
echo $responseJSON;