我的网站上有一个用于邀请朋友的表单。这是一个简单的文本字段和一个提交按钮。如果有错误,我会重定向回此页面并显示错误消息,如果它们是会话变量集。
if (isset($_SESSION['invite_error'])) {
echo $_SESSION['invite_error'];
unset($_SESSION['invite_error']);
}
但是,如果我离开此页面并返回该页面,则仍会显示错误消息。如果我离开并再次回来,它将会完成。当我刷新那个页面时它是一样的... 1刷新不会摆脱它,但2会。我不能破坏整个会话,我只是想取消设置这个变量。 PHP版本是5.2.5 build 6,注册全局变量是关闭的,我在这个页面的顶部调用了session_start(),我也尝试过使用no-cache标头。
编辑:添加完整代码。
<?php
ob_start();
session_start();
$user_id = $_SESSION['user_id'];
$user_name = $_SESSION['user_name'];
if ($user_id==null) header("Location: /login.php");
if (isset($_SESSION['invite_errors'])) {
$error = $_SESSION['invite_errors'];
unset($_SESSION['invite_errors']);
}
require_once("ui/header.php");
?>
<div id="invite" class="content">
<?php if($error) { ?>
<div class="errors round">
<?php echo $error ?>
</div>
<?php } ?>
<h3>Invite Your Friends</h3>
<div class="invite-form">
<form method="post" action="controllers/invite.php">
<div class="row">
<textarea class="txt-area" name="emails" id="emails" rows="5"></textarea>
<div class="tip">Separate multiple email addresses with ,</div>
</div>
<div class="row-submit">
<input type="submit" name="submit" id="submit" class="submit-btn" value="Submit" />
</div>
</form>
</div>
</div>
<?php
require_once("ui/footer.php");
?>
答案 0 :(得分:13)
在开始输出缓冲之前启动会话。因此,请切换ob_start()
和session_start()
来电。
由于会话cookie是在发送到浏览器的标头中定义的,并且在启动缓冲区时标题会发送到浏览器,因此必须在缓冲区之前启动会话。
答案 1 :(得分:2)
您提供的示例应该有效。也许某种会话缓存会阻碍你。您可以尝试修改代码,如下所示:
if (isset($_SESSION['invite_errors']) && $_SESSION['invite_errors']) {
$error = $_SESSION['invite_errors'];
$_SESSION['invide_errors'] = false;
unset($_SESSION['invite_errors']);
// Explicitly write and close the session for good measure
session_write_close();
}
答案 2 :(得分:2)
根据我的经验,PHP会话不值得使用,只是设计为一种快速简便的解决方案。 $ _SESSION行为并不总是很明显,但使用传统意义上的会话几乎是不可避免的。发出您自己的id和令牌cookie,并在这些数据库中存储会话值。这还具有跨服务器可扩展的优势。
答案 3 :(得分:1)
也许你可以在回显错误
后更改值if (isset($_SESSION['invite_error'])) {
echo $_SESSION['invite_error'];
$_SESSION['invite_error'] = null;
unset($_SESSION['invite_error']);
}