Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP会话丢失_Php_Session_Session Variables - Fatal编程技术网

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时运行的代码:

我在PHP会话删除数据和重定向回登录页面时遇到问题

这是我从顶部看到的目录结构:


  • Login//包含要登录/注销的文件
  • Main//包含登录用户的页面
  • index.php//具有完全可操作表单的登录屏幕
  • 在登录目录中:检查_login.php

    在主目录中:page1.php、folder1和folder2

    在文件夹1中:home.php,include1.php

    在文件夹2中:include2.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的一部分。