【问题标题】:Cannot unset session variable after echo回显后无法取消设置会话变量
【发布时间】:2017-08-09 01:48:08
【问题描述】:

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

<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 来显示错误消息,它非常适合我的需要。感谢您的帮助!

【问题讨论】:

  • 如果您还没有开始会话,则需要开始
  • 我有 在我所有的页面之上
  • 检查错误然后php.net/manual/en/function.error-reporting.php - 查看html源代码,var_dump()和echo都是有用的调试工具。
  • 您也这样做了两次if($_SESSION['msg']['signin-error'] != ""),我们不知道这些会话数组的设置位置/方式。
  • 是的,我知道。我尝试了很多事情,这就是其中之一。

标签: php html session unset


【解决方案1】:

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

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

更多信息请参见this answer

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

【讨论】:

  • 这可能有点混乱,当然你可以更改$_SESSION 变量,即使已经发送了输出。 session_start 必须出现在它之前(因为它在 cookie 中声明了会话 ID)。
猜你喜欢
  • 2014-04-03
  • 2015-03-03
  • 2020-03-02
  • 2017-01-06
  • 2023-01-23
  • 2016-10-01
  • 2013-02-17
  • 2018-03-16
相关资源
最近更新 更多