【问题标题】:PHP session problemsPHP会话问题
【发布时间】:2010-11-24 03:25:40
【问题描述】:

我正在使用以下代码使会话无效。我在很多页面中都链接到logout.php。如果单击该注销链接,则会调用 logout.php 页面。以下是logout.php中的代码。

unset($_SESSION['admin']);
session_destroy();
header('Location: index.php');

会话失效后,我想打开页面index.php。 但我收到以下错误:

警告:session_destroy() [function.session-destroy]:试图在第 3 行的 C:\xampp\htdocs\Selection\logout.php 中销毁未初始化的会话

警告:无法修改标头信息 - 标头已由第 4 行 C:\xampp\htdocs\Selection\logout.php 中的(输出从 C:\xampp\htdocs\Selection\logout.php:3 开始)发送

怎么了?

【问题讨论】:

    标签: php session


    【解决方案1】:

    我认为你不能在销毁会话之前调用session_start() 函数。

    【讨论】:

    • 谢谢...无论如何 session_start() 必须在脚本开始时调用。
    【解决方案2】:

    你需要在页面顶部调用 session_start() 来提醒 php 这个页面调用属于会话。 - 至少PHP manual 告诉我们。

    该手册页上的注释给出了提示,session_unset() 仅用于不使用 $_SESSION 变量的旧环境。

    【讨论】:

      【解决方案3】:

      您必须先打开会话:

      header('Location: index.php');
      session_start();
      session_unset();
      session_destroy();
      

      【讨论】:

      • 我认为重定向一定要放在最后,因为像这样写代码脚本做了重定向,不执行其他功能
      • 它只能按预期工作,因为在发送标头后脚本仍然完成执行。但是你应该在 session 被销毁之后放置 header 以减少代码的混乱。
      【解决方案4】:

      问题是您无法销毁尚未启动的会话。然后发出一个警告,该警告正在回显到浏览器。下一个问题是你不能在输出到浏览器后发送标题,所以它会引发另一个警告。

      你只需要先检查一个会话是否存在:

      if (session_name() != '') {
          session_destroy();
      }
      

      【讨论】:

        【解决方案5】:

        您必须始终使用 session_start();在使用会话函数/变量之前。所以用 session_start(); 启动所有 PHP 文件。还有logout.php:

        session_start();
        session_destroy();
        header('Location: index.php');
        

        您也不需要取消设置。

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-15
        • 1970-01-01
        相关资源
        最近更新 更多