2014-10-29 65 views
0

我试图弄清楚为什么我的会话变量没有转到我的其他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

会话是否在后续页面上启动? – 2014-10-29 16:53:40

+0

在尝试访问$ _SESSION之前,不应该调用checkLogin()方法吗? – 2014-10-29 16:57:40

+0

@DavidJones我做了,我只是删除,以节省代码空间在这里。这就是我知道会话变量已设置的方式。 – user2812097 2014-10-29 17:04:05

回答

0

移动session_start();确实早在你的类文件中,而不是在构造函数中。 也将它添加到请求类的第一行(如果您不使用名称空间)。

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

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

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

从构造函数中删除session_start。

在请求中做同样的事情。 如果未启动,则开始会话。

+0

或者在请求类文件中包含会话类文件 – 2014-10-29 16:56:31

+0

@AresDraguna我已经有request_once('Session.php')作为请求php文件中的第一行。它是否必须在实际的课堂上? – user2812097 2014-10-29 16:59:03

+0

@lolka_bolka session_start()在构造函数中工作,但即使它工作,它仍然没有关系? – user2812097 2014-10-29 17:00:00