会话变量在会话类之外不可用

时间:2014-10-29 16:50:26

标签: php session

我试图找出为什么我的会话变量没有转移到我的其他php页面。我创建了一个会话类,它根据_Session控制登录状态,并生成_Sessions变量。每当我检查类时,它都会设置_Session变量,但如果我尝试在其他php页面上使用$_Session[key],我会得到空白值。有人可以告诉我为什么吗?

会话班:

class Session{
private $bLoggedIn = false;

function __construct(){
    session_start();
    $this->checkLogin();
    if(isset($_POST['bLogOut'])){
        $this->logOut();
    }
}

public function isLoggedIn($sUser){
    return $this->bLoggedIn();
}

public function logIn($sTable, $sUserName, $sPassword){
    if($this->bLoggedIn){
        return 'Already logged in.';
    } else{
        $queryResults = makeLoginRequest($sTable, $sUserName, $sPassword);
        $_SESSION['user_Id'] = $queryResults[0]['user_Id'];
        $_SESSION['password'] = $queryResults[0]['password'];
        $_SESSION['firstName'] = $queryResults[0]['firstName'];
        $_SESSION['lastName'] = $queryResults[0]['lastName'];
        $_SESSION['start'] = time();
        $_SESSION['expire'] = $_SESSION['start'] + 1800;
        $this->bLoggedIn = true;
        return $queryResults[0];
    }
}

public function logOut(){
    session_destroy();
    $this->bLoggedIn = false;
    echo 'Successfully logged out.';
}

public function checkLogin(){
    if(isset($_SESSION['user_Id'])){
        $this->bLoggedIn = true;
        return $this->bLoggedIn;
    } else{
        $this->bLoggedIn = false;
        return $this->bLoggedIn;
    }
}
}

请求类(这是我尝试获取会话变量值并返回空值的类):

class request{
private $iUserId;
private $sPassword;
private $sFirstName;
private $sLastName;

public function __construct($sService, $oData, $iAffectedUserId){
    $session = new Session();
    // The four values below are empty because the $_SESSION variables are empty
    $this->iUserId = $_SESSION['user_Id'];
    $this->sPassword = $_SESSION['password'];
    $this->sFirstName = $_SESSION['firstName'];
    $this->sLastName = $_SESSION['lastName'];
    switch($sService){
        case 'follower':
            $this->requestFollower();
            break;
        case 'followee':
            $this->requestFollowee();
            break;
        case 'promoter':
            $this->requestPromoter();
            break;
        case 'promotee':
            $this->requestPromotee();
            break;
        case 'note':
            $this->requestNote();
            break;
        case 'createFollowee':
            $this->createFollowee();
            break;
        case 'createPromotee':
            $this->createPromotee();
            break;
        case 'createNote':
            $this->$sNote = $oData;
            $this->createNote($iAffectedUserId, $this->sNote);
            break;
        case 9:
            break;
        case 1:
            break;
        default:
            echo "ErrorCode: 4000";
            break;
    }
}
}

同样,我检查了会话类中的会话变量并设置了它们。

1 个答案:

答案 0 :(得分:0)

在类文件中很早就移动session_start();,而不是在构造函数中。 还要将它添加到您的第一行请求类中(如果您没有使用命名空间)。

在您的会话课程中,以及您想要开始会话的任何地方,您可以检查是否已有会话。

if (!session_id()) {
   session_start();
}

class Session{
private $bLoggedIn = false;
....

从构造函数中删除session_start。

在请求中执行相同操作。 如果没有开始,它会开始一个会话。