【发布时间】: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