PHP会话丢失了

时间:2012-05-28 19:07:33

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

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

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

    当我尝试在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";  
        }
    }
    

4 个答案:

答案 0 :(得分:2)

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

[session]
session.auto_start = 1

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

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

答案 1 :(得分:1)

如果您未启用session.auto_start,并且在两个不同的请求中调用身份验证 getPermissionString ,则需要调用{{3在每个函数中。

如果您需要有关如何传递会话ID的更多信息,请阅读session_start()

答案 2 :(得分:1)

如果未启动会话,则不应使用该功能。因此抛出异常:

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 :(得分:0)

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