echo后无法取消设置会话变量

时间:2017-03-17 13:18:09

标签: php html session unset

我在会话变量中存储了一条错误消息,我想只显示一次。我的方法是检查它是否存在,然后回显并在之后取消设置。

<div class="signin">

  <form name="signuser" action="php/signin_user.php" onsubmit="return validateForm()" method="POST">
    <input type="text" name="email" placeholder="E-mail" value="<?php echo $_SESSION['signin']['email']; ?>"><br>
    <input type="password" name="password" placeholder="Password"><br>
    <input type="submit" value="Sign in">
  </form>

  <br>
  <div id="login-error" style="display: none"></div>
  
  <?php

  if(isset($_SESSION['msg']['signin-error'])) {	
      echo '<div id="login-php-error">';
echo '<p>'.$_SESSION['msg']['signin-error'].'</p>';
      echo '</div>';
}

  if(isset($_SESSION['msg']['signin-error'])) {
      unset($_SESSION['msg']['signin-error']);
  }

  if (isset($_SESSION['signin']['email']))
      unset($_SESSION['signin']['email']);

  ?>

</div>

我也试过了!=“”:

<?php

  if($_SESSION['msg']['signin-error'] != "") {	
    echo '<div id="login-php-error">';
    echo '<p>'.$_SESSION['msg']['signin-error'].'</p>';
    echo '</div>';
  }

  if($_SESSION['msg']['signin-error'] != "") {
    unset($_SESSION['msg']['signin-error']);
  }

  if ($_SESSION['signin']['email'] != "")
    unset($_SESSION['signin']['email']);

?>

没有任何作用。我在所有页面上都有session_start()。它仍会显示每次刷新。

编辑:

显然我是PHP的新手,我现在看到使用session来提供用户反馈是愚蠢的。我最终使用GET来显示错误消息,它非常适合我的需要。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

会话在标题中声明。在任何其他内容之前发送标题,echo'内容/或只有文字(例如HTML)将结束标题。这意味着您无法在echo之后更改会话。

然而,有一种方法可以使用PHP output buffering。您在脚本开头使用ob_start(),最后使用ob_end_flush()。使用这些功能,您可以在回显内容后编辑会话。

有关详细信息,请参阅this answer

修改
正如@ccKep所说,您仍然可以在发送标题后更改$_SESSION变量($_SESSION['something'] = 'else')。在发送标题后,您无法启动或销毁会话。