-2

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

  1. 当用户单击登录按钮时,jQuery 会调用我的控制器类中的 authenticate() 方法,它会检查用户是否正确,如果正确,则启动会话并在会话上设置 user_id 所以我稍后可以访问它,并再次将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";  
    }
}
4

4 回答 4

2

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

[session]
session.auto_start = 1

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

class auth {
  function __construct() {
    session_start();
  }
  function yourfunction() {
    ...
  }
  function yoursecondfunction(){
    ...
  }
}
于 2012-05-28T19:25:14.413 回答
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";  
    }
}

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

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

于 2012-05-28T19:28:07.527 回答
1

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

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

于 2012-05-28T19:20:21.507 回答
0

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

于 2012-05-28T19:15:26.143 回答