我最近遇到了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
中提供有效结果您是否知道这种非持久性会话的原因是什么?
我真的希望我犯了一个非常愚蠢的错误。欢迎您建设性地欢笑。 ^^
答案 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
将所有用户数据保存在数据库中后,它就完美了会话已删除=用户退出。