PHP Session没有设置

时间:2016-03-29 11:53:03

标签: php session

我有一个PHP页面和会话,我在每个站点上启动会话,但这不起作用。 我正在用

设置会话(我将课程设置为会话)
}else if(isset($_POST['username']) and isset($_POST['password'])){
  $account = new Account;
  $password = hash('sha256', $_POST['password']);
  $account->setTheAccount($_POST['username'],$password);
  $acc_data = $account->getDatabaseAccounts('root','','schoolpage','localhost','accounts');
  $acc_status = $account->isAccountTrue();
  if ($acc_status==true){
    $_SESSION['account'] = $account;
    echo 'true';
    header('Location:panel.php');
  }else{
    echo 'false';
  }
}

并通过以下方式访问:

if (isset($_SESSION['account'])){
      $account = $_SESSION['account'];
        if ($account->isAccountTrue() == true){
          echo 'XD';
        }
      }

但它不起作用。 我不知道为什么会话不起作用。

帐户类

class Account{
  private $acc_data,$username,$password;
  function setTheAccount($usernamei, $passwordi){
    $this->username = $usernamei;
    $this->password = $passwordi;
  }
  function getDatabaseAccounts($dbUser,$dbPassword,$dbName,$dbHost, $dbTable){
    $pdo = new PDO('mysql:host='.$dbHost.';dbname='.$dbName, $dbUser, $dbPassword);
    $this->acc_data = $pdo->query('SELECT * FROM `'.$dbTable.'`');
  }
  function isAccountTrue(){
    $acc_status=false;
    foreach ($this->acc_data as $i) {
      if ($i['username'] == $this->username and $i['password'] == $this->password){
        $acc_status = true;
      }
    }
    return $acc_status;
  }
  function isUserLogged(){

  }
}
帐户类var转储
truearray(2) { ["login"]=> bool(true) ["account"]=> object(Account)#1 (3) { ["acc_data":"Account":private]=> object(PDOStatement)#3 (1) { ["queryString"]=> string(24) "SELECT * FROM `accounts`" } ["username":"Account":private]=> string(5) "admin" ["password":"Account":private]=> string(64) "4813494d137e1631bba301d5acab6e7bb7aa74ce1185d456565ef51d737677b2" } }

2 个答案:

答案 0 :(得分:1)

error_reporting(-1);
ini_set('display_errors', true);

在页面顶部启用php错误,您将看到您无法将资源,PDO实例,PDOStatement等序列化为会话。

您无法序列化帐户$acc_data,因为它是PDOStatement的一个实例。您无法序列化或反序列化PDOStatement实例。

更改

$this->acc_data = $pdo->query('SELECT * FROM `'.$dbTable.'`');

$this->acc_data = $pdo->query('SELECT * FROM `'.$dbTable.'`')->fetchAll();

然后删除您的会话并重试。

答案 1 :(得分:1)

要在$ _SESSION中存储对象,您必须对其进行序列化,然后对其进行反序列化以调用方法 - > isAccountTrue(),否则只需存储结果:

$_SESSION['accountValid']=$account->isAccountTrue();
...
if($_SESSION['accountValid']===true){
// do stuff
}