PHP会话丢失
我在PHP会话删除数据和重定向回登录页面时遇到问题 这是我从顶部看到的目录结构:PHP会话丢失,php,session,session-variables,Php,Session,Session Variables,我在PHP会话删除数据和重定向回登录页面时遇到问题 这是我从顶部看到的目录结构: Login//包含要登录/注销的文件 Main//包含登录用户的页面 index.php//具有完全可操作表单的登录屏幕 在登录目录中:检查_login.php 在主目录中:page1.php、folder1和folder2 在文件夹1中:home.php,include1.php 在文件夹2中:include2.php (如果这不太容易理解,那么很抱歉) 这是我登录check_login.php时运行的代码:
这是我登录check_login.php时运行的代码:
session_start();
$_SESSION["id"] = $id;
header("location:../main/page1.php"); //into main directory
所有页面都包含相同的样式(标题、导航、页脚),并且每个页面都有一个主内容块,因此我使用folder1和folder2中包含的内容,具体取决于要显示的内容。默认情况下,位于folder1中的主页包含home.php。其他页面使用include,如include1.php或include2.php,它们可以来自任何一个文件夹
在page1.php的顶部:
session_start();
if($_SESSION["id"] == '')
{
header("location:../index.php");
}
在page1.php中,如果我导航到一个包含位于folder1中的页面,这就可以了。如果我导航回主页,folder1中的include也可以正常工作。这两次我都可以从会话中读取id变量
但是,如果我导航到一个包含位于folder2中的页面,我会被重定向到我的登录页面
有什么想法吗?您需要始终包括您的会话开始。一种很好的方法是创建header.php或bootstrap.php或类似文件,您可以在依赖会话扩展的每个文件的开头包含一次_。这样,您的代码将变得更干净、更易于管理,而且工作正常。我已经解决了这个问题,无法相信我的白痴
在其中一个包含中,我回显到另一个页面的链接,这是错误的,事实上一直指向我的登录页面。现在一切正常,谢谢你的帮助。典型的学童错误。如果我理解正确,问题可能是您在重定向到文件夹2时没有声明“会话_开始()”。文件夹1中的包含内容我可以在“没有会话_开始()”之间切换;在顶部,效果很好。文件夹2也没有。但是,我已经尝试将会话_start()放入;在两个文件夹中的所有包含的顶部,仍然是同一个问题。“index.php”包含什么?index.php包含标题、导航和页脚的所有HTML代码。导航中的每个链接都指向Index.php,并在该链接中传递一个参数,该参数决定将哪些包含内容放入主内容块中。文件夹2中的文件包含哪些内容?也许问题不在php代码中,而是因为浏览器刷新会话或服务器没有正确保存会话。您的软件堆栈是什么样子的?服务器必须正确保存会话,因为它允许我在同一目录中的包含之间移动。您所说的软件堆栈是什么意思?当您移动到其他目录时,您的服务器可能会将其视为新主机。例如,考虑Apache可能在同一个物理服务器上为5个不同的网站提供电力,但是它不在这些网站上承载这些会话,因为这将是一个巨大的安全缺陷。因此,每个主机都是按名称定义的:Apache将按名称为这些主机保存会话。因此,如果您的软件堆栈是Linux上带有PHP的Apache,我可以帮助您调试这些命名主机,或者如果您的软件是带有PHP的nginx,那么这可能是一个不同的过程。这很有意义。那么,我将如何使我的会话可以在其他目录中使用呢?即使它仅限于特定的。它在Linux上运行Apache和PHP。您正在测试的url是什么?通常只需设置一个特定于项目根的虚拟主机,一旦apache使用基于命名的url指向该根,它就会将所有子目录视为同一根url的一部分。