在index.php上我想显示一些信息,如果用户已登录我想显示一些额外的信息。 login.php - 简单的登录表单。 login_exe.php - 负责数据库连接和验证。
所以这就是我的想法:
在index.php上,检查会话是否已启动,如果不是:start。
<?php
if (!isset($_SESSION)) {
session_start();
echo "session started";
}
稍后,检查$ _SESSION ['userID']是否包含值,如果是,则:打印字符串
if($_SESSION['userID'] != null){
echo "User logged in";
}
在login_exe.php上,我的代码几乎相同:
<?php
if (!isset($_SESSION)) {
session_start();
echo "session started";
}
验证功能:
$_SESSION['userID'] = $data['userID'];
header("Location: index.php");
问题是每个页面都会启动一个新会话。我该如何解决这个问题并且只启动一次会话?提前致谢
答案 0 :(得分:1)
您应该将session_start()
放在使用会话的文档之上。比方说,如果您有5个使用会话的.php文件,那么将session_start()
放在其上5倍。
这是因为session_start()
发送标头和标头必须在任何输出之前发送(例如,任何 echo 或空白)。
然后,您应该使用类似isset($_SESSION["foo"])
的内容,而不仅仅是整个 $ _ SESSION 数组,其中foo
是您之前设置的内容。
如果您根本不想要会话或需要重置整个阵列,只需调用session_destroy()
即可有效破坏当前会话。当你想摆脱一把钥匙时,请使用unset($_SESSION["foo"])
。
最后,您可能会遇到奇怪的案例,您无法读取您所写的会话密钥。在这些情况下,检查会话的路径是什么,以及它们是否可写,或者改变它们的路径:
$path = session_save_path(); // what is the path
is_writable($path); // can i write to it?
session_save_path("my/new/path"); // change the darn path;
// put -even- before session_start()!
:) 很高兴我帮忙
答案 1 :(得分:0)
我认为PHP手册与...相比真的很好啊,所以请阅读session_start()。它说:
session_start()创建会话或恢复当前会话(...)
所以你需要的只是代码中的session_start()。这必须在每个请求上执行(可能包括在内)。
检查userId的代码看起来很好,这里有一个重要的提示:你应该确切知道PHP中的isset(),empty()等是什么意思,所以总是有comparision of comparison。
答案 2 :(得分:0)
您不应在评论中提出新答案(编辑:问题)。在这里和编码一样系统化。
如何结束会话:
这为讨论提供了空间,因为会话cookie是客户端,会话数据是服务器端。
我建议:
$_SESSION = null;
原因:这将立即清除所有登录和其他相关数据。它使cookie完好无损,这通常无关紧要,因为所有相关数据都已消失。