【问题标题】:PHP logout system not working. (session_destroy on MAMP)PHP注销系统无法正常工作。 (MAMP 上的 session_destroy)
【发布时间】:2012-12-16 18:51:35
【问题描述】:

我最近将我的网站从 XAMPP 转移到了 MAMP。问题是我的注销系统不再工作。注销小部件:

<a href="logout.php">Log Out</a>

我的注销页面本身:

<?php 
session_start()
session_destroy()
header('Location:login.php');
?>

奇怪的是,当我对 logout.php 进行一些更改时,例如使其成为一个简单的 echo 语句:

<?php 
echo 'test';

//session_start()
//session_destroy()
//header('Location:login.php');
?>

我仍然没有在浏览器中看到“测试”;我只是留在 index.php,即使我已经注释掉了页面中的标题。我是 100% 链接路径没问题。

不管我是否修改了logout.php 文件,我可以看到服务器没有删除tmp/php 中的会话文件。这很奇怪,因为我在 MAC OS X 中允许每个人都可以读取和写入这个 tmp/php 文件夹。

操作系统:MAC OS X
服务器:MAMP 中的 Apache
PHP:5.4.4
浏览器:Google Chrome 和 Safari 都出现问题

(这是我在stackoverflow上发布问题的处女航,如果您提出改进我的提问的建议,请告诉我)

【问题讨论】:

  • 如果你“留在index.php”,你肯定不会在浏览器中看到“test”,因为你说你改变了logout.php 到echo 'test'; 语句。您应该改为访问 logout.php。
  • 在 url 中手动输入 path_to_logout.php 时看到什么错误?
  • 会不会是您遇到了错误,但 error_reporting 设置为 0?
  • 注意:原生 PHP 会话文件不会在 session_destroy() 之后立即删除。它们按session configuration 指定的时间间隔被删除
  • 这听起来很傻,但是 session_start 和 session_destroy 末尾缺少的逗号怎么办?尝试: session_start(); session_destroy();

标签: php session mamp logout


【解决方案1】:

尝试改用这个:

<?
    session_start();

    $_SESSION = array();
    header("Location: index.php");
?>

我刚刚清除了 $_SESSION,它总是对我有用

【讨论】:

    【解决方案2】:

    如果在包含以下代码时调用 logout.php 不打印 test 则有其他错误,与会话无关。

    <?php 
    echo 'test';
    //session_start()
    //session_destroy()
    //header('Location:login.php');
    ?>
    

    你提到它仍然显示 index.php,这让我觉得你的 .htaccess 文件中有一个重写规则,它将调用从 logout.php 重定向到索引。检查您的 htaccess 文件是否有任何规则。

    您可以在此处找到有关htaccess on MAMP 的信息

    【讨论】:

    • 感谢您的回答。不幸的是,我无法修复它。我只有一个 .htcacces 文件,不在我的站点根文件夹中: Options -Indexes 我刚刚测试了以下内容:我将菜单中的链接更改为 logout1.php 并创建了一个 logout1.php 文件; logout.php 和 logout1.php 都位于站点根文件夹中。在 logout1.php 中我做了一个简单的 echo 语句: 仍然没有到达这个文件。我在菜单中的所有其他链接都可以正常工作。在 XAMPP 下也没有问题。您有解决此问题的建议吗?
    • 你说达不到。你看到了什么? 404 未找到错误或其他页面?
    • 出于某种原因,logout1.php 现在只是显示。所以我看到“测试”得到了回应。如果您查看我上面的评论,现在会出现两个问题: 1. 当我通过单击链接转到 logout.php 时,会话信息文件不会被破坏(我在 finder 中看到)。 2. 如果我手动输入地址,会话信息文件会在几秒钟后被删除。 3. 如果我回到 index.php,它首先看起来好像我已登录。然后我刷新,index.php 看起来好像我已注销。你知道解决办法吗? (感谢您迄今为止的帮助!)
    • 添加:当我将 menu.php 中的链接路径从 logout1.php 更改为 logout.php 时,需要退出几秒钟才能在实际页面上更新(我保存后会刷新变化)。也许这些信息对你有帮助。
    • 还有一个补充:在我点击刷新按钮后,我似乎只获得了注销的人的 index.php,因此: 1. 点击 logout.php 的链接不会删除会话文件;手动去那里确实会删除会话文件。 2. 然后返回 index.php 并单击 index.php 的链接,然后它仍然显示好像我已登录。如果我单击刷新此更改。
    【解决方案3】:

    这些是注销的基本部分,假设您的脚本正在使用 PHP 会话。请注意,您的注销脚本会导致解析错误,因为它在语句末尾缺少分号。也许只是一个错字。

    <?php // RAY_EE_logout.php
    session_start();
    
    // CLEAR THE INFORMATION FROM THE $_SESSION ARRAY
    $_SESSION = array();
    
    // IF THE SESSION IS KEPT IN COOKIE, FORCE SESSION COOKIE TO EXPIRE
    if (isset($_COOKIE[session_name()]))
    {
       $cookie_expires  = time() - date('Z') - 3600;
       setcookie(session_name(), '', $cookie_expires, '/');
    }
    
    // TELL PHP TO ELIMINATE THE SESSION
    session_destroy();
    
    // REDIRECT TO THE HOME PAGE
    header("Location: /");
    exit;
    

    HTH,~雷

    【讨论】:

      【解决方案4】:

      尝试使用输出缓冲区。

      <?php 
      ob_start();
      session_start();
      session_destroy();
      header('Location:login.php');
      ?>

      【讨论】:

        【解决方案5】:

        在我的情况下,它与未正确定义的 php 代码块有关。我有&lt;? ?&gt; 而不是&lt;?php ?&gt;

        希望这对某人有所帮助。

        【讨论】:

          【解决方案6】:

          @tom.e.degroot:上次我检查时,“它不起作用”不是错误消息。你需要多描述一些症状。请遵循此处的指导:http://SSCCE.org 并提供一些我们可以在我们自己的服务器上安装和测试的东西。谢谢,~雷

          【讨论】:

          • 亲爱的雷,感谢您的建设性评论。我是新来的,很高兴你给了我这个有用的提示。当我尝试您的建议时,我的浏览器出现 404 错误(因此,不是 CodeIgniter 生成的 404 消息。这是更好的描述吗?
          猜你喜欢
          • 2013-01-11
          • 2017-06-30
          • 1970-01-01
          • 2015-07-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多