繁体   English   中英

重新加载页面后$ _SESSION为空

[英]$_SESSION is empty after reloading page

我的脚本test.php如下。 当我单击Submit时,它会将其作为登录尝试进行处理,并成功设置$_SESSION变量。 但是当我重新加载页面时(通过单击链接回自身), $_SESSION为空。

<?php
    //test.php

    session_start ();

    function isUserLoggedIn (&$username)    
    {
        $loggedIn = isset ($_SESSION['loggedin']);
        if ($loggedIn) 
            $username = $_SESSION['user']; 
        else 
            $username = ''; 

        return $loggedIn;
    }

    function processLogin () 
    {               
        $_SESSION['loggedin'] = TRUE;
        $_SESSION['user']  = "podunk";

        session_write_close ();         
    } 

    echo '$_SESSION before we do anything..................: '; 
    print_r ($_SESSION); 
    echo "<br>";

    if (isset($_POST['Submit'])) processLogin ();

    $loggedIn = isUserLoggedIn ($username); 

    echo '$_SESSION after processing any login attempt: '; 
    print_r ($_SESSION); 
    echo "<br>";

    if ($loggedIn) 
        echo "I AM LOGGED IN as $username!"; 
    else 
        echo "I am logged out :(";
?>

<html>
  <body>    
    <form name="form1" method="post" action="test.php"> 
        <input type="submit" name="Submit" value="Login">
    </form>

    <a href="test.php">Reload page</a>
  </body>
</html>

这是我在Linux apache2服务器上运行它的时候。 当我在XAMPP上运行它时,$ _SESSION仍然存在并且用户仍然登录。所以我猜它与php.ini有关......但也许我在这里犯了一个错误并且XAMPP正在原谅。

Linux服务器成功运行WordPress,所以它的设置不能太奇怪。 刚刚按照建议进行了系统升级。 session.save_path存在并且今天有一些日期,所以我认为它有效,虽然它由root拥有而不是www-data,所以IDK如果这是一个问题。

这里有一些来自php信息的其他东西。 关于那个cookie_path的IDK,所以我把它改成了session.save_path,FWIW所在的地方。

session.auto_start  On  On
session.cache_expire    180 180
session.cache_limiter   nocache nocache
session.cookie_domain   no value    no value
session.cookie_httponly Off Off
session.cookie_lifetime 0   0
session.cookie_path /   /
session.cookie_secure   Off Off 

使用Chrome,Firefox和IE的行为是相同的。

TIA。

你的脚本流程基本上就是这样

start the session

run processLogin();

run isUserLoggedIn()

但是,在您的processLogin()您使用session_write_close()强制关闭会话,因此当您到达isUserLoggedIn()并查询会话的内容(现在已关闭)时,您似乎没有登录。

尝试运行代码而不强制关闭会话。

我不得不说我会问为什么这似乎适用于你的某个环境!

似乎有两个问题:

1)您的session.save_path不可写。 根据您的评论,我已经解决了这个问题。 无论如何,尝试将此设置在您的脚本之上,只是为了确保:

ini_set('session.save_path', '/tmp');

2)你将session.cookie_pathsession.save_path混淆,这两个设置完全不同。 session.cookie_path设置为/ ,这是指您的网址路径

ini_set('session.cookie_path', '/');

如何在unix 中使会话目录可写

  1. 创建“/ tmp / sessions”目录
  2. 在终端chown www-data:www-data /tmp/sessions
  3. ini_set('session.save_path', '/tmp/sessions');

最后,检查该文件夹中的所有者会话文件。

我确信您正在关闭会话然后调用函数。

使用session_write_close - 您编写会话数据并结束会话

尝试使用session_is_registered - 查明全局变量是否在会话中注册而不是session_write_close以便您可以查看此数据是否已在您的服务器上注册。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM