【问题标题】:PHP session being lostPHP会话丢失
【发布时间】:2012-06-03 02:22:29
【问题描述】:

我正在尝试使用 jQuery 和 PHP 实现和身份验证系统。所有的 php 工作都是在控制器和数据处理程序类中完成的。 .html 文件中没有 php 代码,.html 文件中的所有值都是通过 jQuery 呈现的,该 jQuery 从 php 服务器请求数据。所以我想做的是:

  1. 当用户单击登录按钮时,jQuery 会调用我的控制器类中的 authenticate() 方法,它会检查用户是否正确,如果正确,则启动会话并将 user_id 设置为session 以便我稍后可以访问它,并将 userId 再次返回给 jQuery 客户端。
  2. 之后,如果一切正常,在 jQuery 中我将其重定向到 html 文件。在 html 文件中,我从 <script> 标记调用一个 jQuery,它将处理其他权限。但是这个 jQuery 会访问 getPermissionString 方法(来自前面提到的 authenticate() 方法的同一类),它需要获取在 authenticate 方法中设置的会话值。

问题:

当我尝试在getPermissionString() 中获取会话值时,它会说:

注意:未定义的变量:_SESSION

我尝试检查会话是否在第二种方法中注册,但看起来不是。这是我的 PHP 代码。

有什么想法吗?谢谢。

public function authenticate($login, $password)
{
    $result = $this->userDataHandler->authenticateUser($login, $password);

    if(is_numeric($result) && $result != 0) 
    {
        session_start();
        $_SESSION["uid"] = $result;

        if(isset($_SESSION["uid"]))
        {
            echo "registered";
            $userId = $_SESSION["uid"]; 
        }
        else
        {
            echo "not registered";  
        }

        echo $result;
    }
    else
    {
        echo 0; 
    }
}

public function getPermissionString()
{
    if(isset($_SESSION["uid"]))
    {
        echo "registered";
        $userId = $_SESSION["uid"]; 
    }
    else
    {
        echo "not registered";  
    }
}

【问题讨论】:

  • $_SESSION 是未定义的,除非会话已经开始。开始会话,你就没事了。
  • @hakre 但正如你所见,我正在启动它。
  • 您是否尝试过将 session_start() 放在函数之外?可能是 jquery 调用的页面顶部?
  • 回到学校,重新阅读 PHP 中的会话:php.net/sessions
  • @rogcg:你知道吗,有一个 阿波罗任务登陆月球。但在那次任务之后,还有其他人没有。美国宇航局并没有试图告诉每个人他们总是设法去那里只是因为他们做了一次。这与您的会话类似。只是因为您的代码中某处有一些session_start,这并不意味着会话已启动。

标签: php jquery session session-variables session-cookies


【解决方案1】:

在您可以在第二个函数中访问$_SESSION 之前,您需要确保程序已经事先调用了session_start()。仅当激活会话时才会填充全局变量。如果您不记得在使用之前启动会话,那么您可以更改下面的 php.ini 变量:

[session]
session.auto_start = 1

此外,您说您正在为您的代码使用一个类。在这种情况下,您还可以在每次使用魔术方法创建类时自动启动会话:

class auth {
  function __construct() {
    session_start();
  }
  function yourfunction() {
    ...
  }
  function yoursecondfunction(){
    ...
  }
}

【讨论】:

  • 此外,您说您的代码在一个类中。您可以使用魔术方法在每次创建类时自动启动会话:
【解决方案2】:

如果会话未启动,则不应使用该功能。所以抛出一个异常:

public function getPermissionString()
{
    if (session_status() !== PHP_SESSION_ACTIVE)
    {
        throw new Exception('No active session found.');
    }

    if(isset($_SESSION["uid"]))
    {
        echo "registered";
        $userId = $_SESSION["uid"]; 
    }
    else
    {
        echo "not registered";  
    }
}

这样可以确保在函数内部检查函数的前置条件,因此您无需每次在调用函数之前都检查它。

如果您错误地使用该函数,您现在将看到一个异常,它会为您提供回溯,以便您可以更轻松地分析您的代码。

【讨论】:

    【解决方案3】:

    如果你没有启用session.auto_start,并且authenticategetPermissionString 被两个不同的请求调用,你需要在每个函数中调用session_start()

    如果您需要有关如何传递会话 ID 的更多信息,请阅读Passing the Session ID

    【讨论】:

      【解决方案4】:

      要使 php 会话正常工作,您必须在每次浏览器请求脚本时调用 session_start()

      【讨论】:

        猜你喜欢
        • 2013-08-10
        • 2012-05-09
        • 1970-01-01
        • 2011-12-05
        • 2020-07-11
        • 1970-01-01
        • 2011-11-11
        • 1970-01-01
        相关资源
        最近更新 更多