【发布时间】:2021-10-01 18:23:44
【问题描述】:
我正在尝试使用 PHP 学习会话,并在创建身份验证应用程序时发现,当我进行硬刷新(点击 URL 并点击刷新)时,会话数据会丢失,即使它不是我设置的 3000 秒。我真的需要你的帮助。我被困在这里两天了,找不到任何解决方案。首先,我尝试了 PHP 实时服务器 localhost:3030,然后还尝试了实时托管站点,但仍然没有运气。请在这里帮助我。
<?php
session_name('auth_app');
session_start([
'cookie_lifetime' => 3000,
]);
$loggedin = logged_value() ?? false ;
function logged_value() {
if(isset($_POST['username']) && isset($_POST['password'])) {
if('admin' == $_POST['username'] && 'a51e47f646375ab6bf5dd2c42d3e6181' == md5($_POST['password'])) {
return true;
}
}
}
$_SESSION['loggedin'] = $loggedin;
if(isset($_POST['logout'])) {
$_SESSION['loggedin'] == false;
session_destroy();
}
?>
<!doctype html>
<html lang="en">
<head>
...
</head>
<body>
<div class="container">
<div class="row">
<div class="column column-60 column-offset-20">
<h2>AUTH Example</h2>
<?php
if( true == $_SESSION['loggedin'] ) {
printf("<p>Hello %s, Welcome!</p>", $_POST['username']);
}else {
printf("<p>Hello %s, Welcome!</p>", 'Stranger' );
}
?>
</div>
</div>
<div class="row">
<div class="column column-60 column-offset-20">
<?php if(false == $_SESSION['loggedin']) : ?>
<form method="post">
<input type="text" name="username" id="username" placeholder="Username">
<input type="password" name="password" id="password" placeholder="Password">
<button type="submit" class="button-primary" name="submit">Login</button>
</form>
<?php else: ?>
<form method="post">
<input type="hidden" name="logout" value="1">
<button type="submit" class="button-primary" name="submit">Logout</button>
</form>
<?php endif; ?>
</div>
</div>
</div>
</body>
</html>
【问题讨论】:
-
你的
if(isset($_POST['logout']))检查总是正确的,因为isset()只有在$_POST['logout']为空时才会返回false。所以每次你提交表单时,输入就在那里。 -
在注销块中
$_SESSION['loggedin'] == false;应该是$_SESSION['loggedin'] = false; -
@Sherif - 这通常是人们检查表单是否提交的方式,所以我真的看不出有什么问题?如果提交了注销表单,
logoutpost 值将存在,这可能是他们想要运行注销代码的时候。 -
您遇到的一个问题是您总是设置:
$_SESSION['loggedin'] = $loggedin;。如果您登录并访问此页面,它会将会话$_SESSION['loggedin']设置为false,因为函数logged_value()将不会返回任何内容(因此将$loggedin设置为false)。跨度> -
@MagnusEriksson 如果我将
$_SESSION['loggedin'] = true;设置为仅在isset 的if 条件中不使用函数,它可以解决我的问题,但有一个警告Undefined array key "loggedin"
标签: php session session-cookies session-variables