【问题标题】:PHP MVC - SESSION not persistentPHP MVC - 会话不持久
【发布时间】:2018-03-17 16:47:19
【问题描述】:

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

为了开发,我使用的是 MVC(模型视图控制器)结构。

重要文件:

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

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

说明:会话在 index.php base_controller.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");
?>

成功登录后在base_controller.php 中设置$_SESSION["currentUser"]。 $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["currentUser"],login_view.php 和 base_controller.php 不能

我试过了

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

一样
echo var_dump($_SESSION[]);

login_view.php 中使用时都返回 NULL 或空数组 -> 但在 register_view.php 中给出有效结果

您知道导致此非持久会话的原因是什么吗?

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

【问题讨论】:

  • 在 MVC 中通过类方法处理会话更好,所有 MVC 框架都这样做。
  • 那么像一个类 Session 与方法 CreateSession() 做 session_start()?谢谢你的建议,我会读进去的:)
  • 作为附加提示,创建会话功能应该在课程讲师中,并且无论如何都应该在您的框架中加载这个课程 bootstrapping 在执行开始时确保会话可访问性可用于框架的各个方面,例如模型、视图、助手、控制器等。
  • 不要在问题中包含解决方案。编辑它并将其作为答案发布。
  • 我同意@walther

标签: php session model-view-controller


【解决方案1】:

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

【讨论】:

  • 我也试过了,是的。但在 MVC 中,index.php 中的一个全局 session_start() 就足够了。因为所有其他资源都是在那之后加载的。可惜没用。
  • 您是否在为您的网址使用 mod_rewrite?也许会话 cookie url 是错误的,因为保存在 you.url/login 而不是 your.url
  • 我正在使用我的 .htaccess,是的。但是这个 Session 的有效范围是整个 URL。使用 Chrome 扩展程序“EditThisCookie”进行了检查。所以错误也不存在。
【解决方案2】:

问题解决了!

我是如何解决的:

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

主要问题是,我试图将对象 $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());

现在,直接编辑和使用类中的函数的优势已经不复存在了。我不能使用类似的东西

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

了。另外,我不能再直接在用户类中设置字段了。

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

但是,要“退出”,我只需删除会话即可。

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

一旦所有用户数据都保存在数据库中,这样就完美了会话已删除 = 用户已注销。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 2012-03-29
    • 2012-11-20
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多