【问题标题】:echo $_SESSION then unsetecho $_SESSION 然后取消设置
【发布时间】:2011-09-27 16:20:41
【问题描述】:

我知道这是一个业余问题,但我需要回显一个会话变量然后销毁该变量。

我试过了:

if(isset($_SESSION['m'])){
   echo($_SESSION['m']);
   unset($_SESSION['m']);
}

我也试过 session_destroy();

我尝试在页面末尾取消设置/销毁会话(在关闭 HTML 标记之后)

我遇到的问题是会话在回显之前被破坏。我之前使用过上面的代码没有任何问题。有没有办法做我需要做的事情,还是我必须找到不同的解决方案?

提前致谢:)

【问题讨论】:

  • 请原谅,如果这已经被覆盖了,但是你的'if'会触发吗?如果您忘记调用session_start(),则根本不会设置。
  • 抱歉,忘记添加了,我肯定包含了 session_start()。如果我不包括 unset() 或 session_destroy(),它也会很好地呼应
  • 添加到@Nanne 的问题:当您不取消设置会话时,您有回声吗? - 哎呀,看看你的答案
  • 你确定那个变量甚至存在吗?
  • 是的..$_SESSION['m'] = "<div id=\"contact_success\"><strong>Thank you for your message!</div>";

标签: php session


【解决方案1】:

你应该使用 die();标头重定向后。

header("Location: index.php");
die();

【讨论】:

    【解决方案2】:

    Ben 的回答对我不太适用。无论出于何种原因,我的exit()close() 之后仍在触发。

    它不漂亮,但我可以使用它:

    if(condition) {
        $_SESSION["foo"] = "print this";
        $_SESSION["bar"] = 1;
        header("Location: $self");
    }
    <html>
    ...
    <?php
    if(isset($_SESSION["foo"])){
        echo($_SESSION["foo"]);
        $_SESSION["bar"] += 1;
        if($_SESSION["bar"] >=3) {
            unset($_SESSION["foo"]);
            unset($_SESSION["bar"]);
        }
    }
    

    【讨论】:

      【解决方案3】:

      我刚刚又遇到了这个问题,而且我似乎总是以不同的方式解决它。这一次,我决定使用 php、jquery 和 ajax 的组合。

      <script>
      var message = '<?php echo $_SESSION['message'];?>';
      $(document).ready(function(){
      if (message != ''){
      alert(message);
      $('#dump').load("http://{your absolute path here}/killthemessenger.php");   
      }
      });
      </script>
      <div class="hidden" id="dump" >This Should Be Hidden With CSS</div>
      

      这个脚本在我的导航菜单上,它包含在每个页面上,因此我可以轻松地向用户所在的任何页面发送消息。它将会话消息加载到 javascript var 中,然后提醒用户,然后将 php 页面加载到隐藏的“转储”div 中,这只是取消设置会话消息,因此它不会多次发出警报。

      killthemessenger.php

      <?php
      session_start();
      unset($_SESSION['message']);
      ?>
      

      【讨论】:

        【解决方案4】:

        在 标记上方键入此内容。

        <?php
         session_start();
         if(isset($_SESSION['m']))
              $_SESSION['m']=$_SESSION['m']+1;
         else
              $_SESSION['m']=1;
         echo "Session = ". $_SESSION['m'];
         ?> 
        

        并在下面输入标签

         <?php
        
              if(isset($_SESSION['m']))
                  unset($_SESSION['m']);
         ?> 
        

        【讨论】:

          【解决方案5】:

          问题在于 $_SESSION 是一个引用,所以当你复制它(或其中的一些偏移量)时,你实际上是在复制一个引用。即:

          $a = $_SESSION['a'];
          

          将 $_SESSION['a'] 的指针值复制到 $a 以便它们指向内存中的相同位置。因此,当您取消设置 $_SESSION['a'] 时,您将删除 $a 指向的数据。这就是为什么 $a 似乎在您的回声中消失了。

          这个答案并没有解决问题或课程,但它至少解释了发生了什么。

          【讨论】:

            【解决方案6】:

            我知道有点晚了,但最近我遇到了这个问题,我会为有需要的人解答。

            我很确定您使用header 方法重定向到执行会话unset 的同一页面。大致如下:

            <?php
                if(condition)
                    $_SESSION = "foo";
                header("Location: $self");
            ?>
            <html>
                ...
                <?php echo $_SESSION["foo"]; unset($_SESSION["foo"]); ?>
                ...
            

            header 的问题在于它不会停止脚本的执行(看起来如此),因此脚本会继续执行并取消设置会话。

            解决方案是在标头重定向之后添加exit(0)(或您可能需要的任何标志),如下所示:

            <?php
                if(condition)
                    $_SESSION = "foo";
                header("Location: $self");
                exit(0);
            ?>
            

            这确实是一个非常晦涩且耗时的问题。

            【讨论】:

              【解决方案7】:

              使用这个也许它有效:

              if(isset($_SESSION['m'])){
                 echo($_SESSION['m']);
                 str_pad(' ',4096);
                 flush();
                 sleep(1); // You can remove this line 
                 unset($_SESSION['m']);
              }
              

              【讨论】:

                【解决方案8】:

                或者这个

                if(isset($_SESSION['m'])){
                   $sessionVar = $_SESSION['m'];
                   unset($_SESSION['m']);
                
                   echo $sessionVar;
                }
                

                【讨论】:

                • 不,仍然没有运气。我认为问题是会话在其他任何事情之前都没有设置。所以在设置$sessionVar 之前取消设置会话
                【解决方案9】:

                我认为这可能会对您有所帮助,或者至少让您朝着正确的方向前进。尝试将每个操作放入自己的 if 语句中。

                if ((isset($_SESSION['m']))) {
                echo $_SESSION['m'];
                }
                if ((isset($_SESSION['m']))) {
                unset($_SESSION['m']);
                }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2012-01-26
                  • 2012-08-30
                  • 2020-03-02
                  • 2017-09-12
                  • 1970-01-01
                  • 2014-06-09
                  • 2016-01-05
                  • 1970-01-01
                  相关资源
                  最近更新 更多