回显后无法取消设置会话变量
Cannot unset session variable after echo
我在会话变量中存储了一条错误消息,我只想显示一次。我的方法是检查它是否存在,然后回显它并在之后取消设置。
<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 的新手,现在我发现使用会话来提供用户反馈是愚蠢的。我最终使用 GET 来显示错误消息,它非常适合我的需要。感谢您的帮助!
会话在 header 中声明。 Headers 在任何其他内容之前发送,echo
'ing content/or 只有文本(例如 HTML)将结束 header。这意味着您无法在 echo
之后更改 sessions。
但是有一种方法可以使用 PHP output buffering。您在脚本的开头使用 ob_start()
,在结尾使用 ob_end_flush()
。使用这些功能,您可以在回显内容后编辑 sessions。
有关详细信息,请参阅 this answer。
编辑:
正如@ccKep 所说,您仍然可以在发送 header 后更改 $_SESSION
变量($_SESSION['something'] = 'else'
)。在 header 发送后,您无法启动或销毁 session。
我在会话变量中存储了一条错误消息,我只想显示一次。我的方法是检查它是否存在,然后回显它并在之后取消设置。
<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 的新手,现在我发现使用会话来提供用户反馈是愚蠢的。我最终使用 GET 来显示错误消息,它非常适合我的需要。感谢您的帮助!
会话在 header 中声明。 Headers 在任何其他内容之前发送,echo
'ing content/or 只有文本(例如 HTML)将结束 header。这意味着您无法在 echo
之后更改 sessions。
但是有一种方法可以使用 PHP output buffering。您在脚本的开头使用 ob_start()
,在结尾使用 ob_end_flush()
。使用这些功能,您可以在回显内容后编辑 sessions。
有关详细信息,请参阅 this answer。
编辑:
正如@ccKep 所说,您仍然可以在发送 header 后更改 $_SESSION
变量($_SESSION['something'] = 'else'
)。在 header 发送后,您无法启动或销毁 session。