PHP MVC - SESSION不是持久的

时间:2018-03-16 19:56:09

标签: php session model-view-controller

我最近遇到了PHP会话的问题。

开发我正在使用MVC(模型视图控制器)结构。

重要文件:

├───classes
    ├───controllers
    │       base_controller.php
    |       ...
    │
    ├───helpers
    ├───parts
    └───views
            login_view.php
            register_view.php
            ...
index.php

问题: login_view.php 无法找到"" $ _SESSION [" currentUser"],在 base_controller.php 中设置。

说明:在加载base_controller.php之前,会话在index.php 中启动。

<?php
require_once("php/classes/DB.class.php");
require_once("php/classes/Functions.class.php");
require_once("php/classes/User.class.php");

session_start();

require_once("php/classes/ErrorMsg.class.php");
require_once("php/controllers/base_controller.php");
?>

成功登录后,$ _SESSION [&#34; currentUser&#34;]在base_controller.php中设置。 $ user对象存储在Session中。 (不,不是序列化的,我知道。但是故意。)

if(login($username, $password)){
    $m = "";
    $_SESSION['currentUser'] = $user;
    require_once('php/views/register_view.php');
    exit();
}

会话已成功创建。显示Register_view.php,我可以使用该会话。

然而,当我重新加载页面时,再次显示login_view.php时,我根本无法使用该会话。 此外,似乎base_controller.php本身也无法使用会话。

我的base_controller.php的重要部分:

$user = new User();
$error = new ErrorMsg();

...

//Button Login Pressed
if(isset($_POST["submit_login"])){
    if(isset($_POST["login_username"]) && isset($_POST["login_password"])){
        $username = htmlspecialchars($_POST["login_username"], ENT_QUOTES);
        $password = $_POST["login_password"];

        if(login($username, $password)){
            $m = "";
            $_SESSION['currentUser'] = $user;
            require_once('php/views/register_view.php');
            exit();
        }
        else{
            $m = $error->WriteError("Login nicht möglich. Falsche Zugangsdaten.", "base_controller -> function login", "");
            require_once('php/views/login_view.php');
            exit();
        }
    }
}

...

//Does not work. isset($_SESSION["currentUser"]) returns FALSE
if(isset($_SESSION["currentUser"])){
    if($_SESSION["currentUser"]->isLoggedIn()){
        require_once('php/views/register_view.php');
        exit();
    }
}

// Display Login Page
require_once("php/views/login_view.php");

总结一下: register_view.php可以使用$ _SESSION [&#34; currentUser&#34;], login_view.php和base_controller.php不能

我试过

echo var_dump($_SESSION['currentUser']);

相同
echo var_dump($_SESSION[]);

login_view.php 中使用时返回NULL或空数组 - &gt;但是在register_view.php

中提供有效结果

您是否知道这种非持久性会话的原因是什么?

我真的希望我犯了一个非常愚蠢的错误。欢迎您建设性地欢笑。 ^^

2 个答案:

答案 0 :(得分:0)

您是否也在login_view.php中调用start_session? 应始终在使用会话变量之前调用start_session。

答案 1 :(得分:0)

问题解决了!

我是如何解决的:

请务必阅读原始问题,以便了解修复方法。

主要问题是,我试图将对象$ user直接保存到$ _SESSION中。由于 __ PHP_Incomplete_Class ,整件事情都行不通。我通过将用户数据存储在一个数组中来修复它。

$_SESSION["currentUser"] = array("id"=>$user->GetUserId(),"firstname"=>$user->GetFirstname(),"lastname"=>$user->GetLastname(),"username"=>$user->GetUsername(),"lastlogin"=>$user->GetLastLogin(),"group"=>$user->GetGroup(), "class"=>$user->GetClass());

现在,直接编辑和使用Class中的函数的优势已经消失。我不能使用像

这样的东西
foreach($_SESSION["currentUser"] as $key => $obj){
   return '<p>'.$obj->getContent().'</p>';
}

了。此外,我无法再直接在用户类中设置字段。

$_SESSION["currentUser"]->checkIfOnline();

然而,要退出&#34;我只需要删除会话。

unset($_SESSION["currentUser"]); //To delete User session

将所有用户数据保存在数据库中后,它就完美了会话已删除=用户退出。