【问题标题】:How can I clear my php session data correctly?如何正确清除我的 php 会话数据?
【发布时间】:2013-03-07 16:43:33
【问题描述】:

我的 php 网站流程是这样的:

  • Page1.php 有一个 POST 到 Page2.php 的 html 表单
  • Page2.php 将所有 POST 数据存储到 SESSION 变量中,并有一个指向 Page3.php 的按钮
  • Page3.php 有另一种形式将其数据 POST 到 Page4.php
  • Page4.php 然后将其所有 POST 数据存储到 SESSION 变量中

我的问题是用户可能需要单击 Page4.php 上的后退按钮以返回到 Page3.php 并更改一些输入。我确信当他们回到 Page3.php 时,您都知道该表单将是空白的,因为整个页面在其默认状态下重新呈现。

要解决这个问题并重新显示用户之前的输入,我正在这样做:

<input value="<?php echo $_POST["guest1Ticket"];?> " type="text"  name="guest1Ticket" id="guest1Ticket" onblur="isTicketNumber(this)"  size ="22"/>

这是重要的部分 - &lt;?php echo $_POST["guest1Ticket"];?&gt;

这可行,但给我带来了另一个问题。如果用户返回到 Page1.php(在关闭他们的浏览器之前)并在他们到达 Page3.php 时重新开始该过程,则他们上次运行的数据将被加载到表单中。

我认为我需要做的是在用户访问 Page1.php 时清除所有 sdession 变量。我试过这样:

<?php 
 session_start(); 
 session_unset(); 
 session_destroy(); 
?> 

(上面是我文件的最顶部,第一个字符之前没有空格。)

当 Page1.php 加载但会话变量没有被取消设置时,不会生成警告。当我到达 Page3.php 时,上次运行的数据仍在输入到表单中。

如何正确清除会话数据?

顺便说一句我只需要它在 Chrome 中工作,这就是我正在测试的地方。

【问题讨论】:

    标签: php session


    【解决方案1】:

    使用 session_unset()。像这样:

    <?php session_start(); ?><!DOCTYPE html>
    <html>
      <body>
        <?php
          $_SESSION["variabletounset"] = "I am going to be unset soon along with all of the other session variables.";
          print '<pre>' . "\n";
          print_r($_SESSION);
          print '    </pre>' . "\n";
    
          session_unset();
    
          print '    <pre>' . "\n";
          print_r($_SESSION);
          print '    </pre>' . "\n";
        ?>
      </body>
    </html>
    

    这将输出:

    Array
    (
    variabletounset => I am going to be unset soon along with all of the other session variables.
    )
    
    Array
    (
    )
    

    【讨论】:

      【解决方案2】:

      只对不使用 $_SESSION 的旧代码使用 session_unset()。

      session_destroy manual

      你可以尝试看看它是如何工作的例子

      session.php

      <?php
      session_start();
      $_SESSION = array('session1'=>1,'session2'=>2);
      
      echo $_SESSION['session1']; //1
      $_SESSION['session1'] = 3;
      echo "<pre>";
      print_r($_SESSION); //session one now updated to 3
      echo "</pre>";
      
      
      $_SESSION = array();
      if ($_SESSION['session1']) {
       echo $_SESSION['session1']; //  IS NOW EMPTY
      } else {
       echo "woops... nothing found";
      }
      ?>
      <p>
      <a href="destroyed.php">NOW GOING TO DESTROYED PHP<a/>
      </p>
      
      <?php
      session_destroy();
      ?>
      

      destroyed.php

      <?php
      session_start(); // calling session start first on destroyed.php
      
      print_r($_SESSION); // prints Array ( )  
      ?>
      

      【讨论】:

      • 也看到了那个链接,我试过$_SESSION = array();,但也没有使用变量,所以我回到了上面的方法。似乎我在某处遗漏了什么
      • 我已经编辑了我之前的评论,为你添加了一个代码 sn-p。所以你可以看到它是如何工作的,记住每次你使用 $_SESSION 你都需要调用 session_start();在那个文件中。
      • 这看起来应该可以工作,但它不会,这是每次我去 Page1.php 1 Array ( [session1] => 3 [session2] => 2 ) 时打印出来的内容。 .. 没有找到
      • 嗯,这是正确的...如果您复制并粘贴该代码,它每次都会这样做,您运行它。这只是一个示例,让您了解会话如何工作......首先,我创建会话 1 和 2,使用 (int) 3 重命名或更新会话 1,使用空数组更新所有内容.... 将更新放在第二页中的评论
      • 现在可以正常工作了。在发布之前,我实际上确实尝试过$_SESSION = array();。原来我使用它的测试最初因为一个奇怪的原因没有工作。当我到达我的 Page4.php 时,我使用 Chrome 中的“收藏夹”链接返回到 Page1.php。出于某种原因,如果我这样做,会话变量实际上并没有取消设置,或者至少表单仍然可以以某种方式看到它们。我在第 4 页上放了一个链接到第 1 页。如果我真的单击该链接,一切都会按预期工作。奇怪..但至少我让它工作了。非常感谢您的帮助。
      【解决方案3】:

      来自文档:

      If $_SESSION (or $HTTP_SESSION_VARS for PHP 4.0.6 or less) is used,
      use unset() to unregister a session variable, i.e. unset ($_SESSION['varname']);
      

      并注意 session_destroy:

      session_destroy 销毁与当前会话关联的所有数据。它不会取消设置与会话关联的任何全局变量

      【讨论】:

      • 是的,我看到了,但我有大约 100 个变量,不想单独取消每个变量。我正在寻找一种方法来一次清除它们
      • 您可以轻松地迭代您的 $_SESSION 而无需了解其中的每个元素。
      • 很公平,毕竟它是一个数组。我只知道有一种标准方法可以一次完成所有操作,但无法使其正常工作。不过感谢您的帮助!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 2019-01-19
      • 2016-06-21
      • 2019-04-30
      相关资源
      最近更新 更多