【问题标题】:Session data is not available after refresh刷新后会话数据不可用
【发布时间】: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 - 这通常是人们检查表单是否提交的方式,所以我真的看不出有什么问题?如果提交了注销表单,logout post 值将存在,这可能是他们想要运行注销代码的时候。
  • 您遇到的一个问题是您总是设置:$_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


【解决方案1】:

使用直接会话超时,因为会话开始无法计算秒数cookie_lifetime

session_start();
header('Refresh: 3000; url=logout.php');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-27
    • 2021-03-14
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多