Php 取消设置会话变量时出现问题

Php 取消设置会话变量时出现问题,php,session,session-variables,Php,Session,Session Variables,我的网站上有一个用来邀请朋友的表单。它是一个简单的文本字段和一个提交按钮。如果出现错误,我将重定向回此页面,如果设置了会话变量,则显示错误消息 if (isset($_SESSION['invite_error'])) { echo $_SESSION['invite_error']; unset($_SESSION['invite_error']); } 但是,如果我离开此页面并返回到该页面,则仍会显示错误消息。如果我离开,再回来一次,一切都会好起来的。当我刷新那个页面时也是一样

我的网站上有一个用来邀请朋友的表单。它是一个简单的文本字段和一个提交按钮。如果出现错误,我将重定向回此页面,如果设置了会话变量,则显示错误消息

if (isset($_SESSION['invite_error'])) {
   echo $_SESSION['invite_error'];
   unset($_SESSION['invite_error']);
}
但是,如果我离开此页面并返回到该页面,则仍会显示错误消息。如果我离开,再回来一次,一切都会好起来的。当我刷新那个页面时也是一样的…1次刷新不能摆脱它,但2次可以。我不能破坏整个会话,我只想取消设置这个变量。PHP版本是5.2.5 build 6,register globals处于关闭状态,我在本页顶部调用session_start(),我也尝试使用无缓存头

编辑:添加完整代码

<?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");
?>

邀请你的朋友
将多个电子邮件地址与,

您提供的示例应该有效。也许某种会话缓存正在妨碍您。您可以尝试按如下方式修改代码:

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();

}

也许您可以在回显错误后更改该值

if (isset($_SESSION['invite_error'])) {
   echo $_SESSION['invite_error'];
   $_SESSION['invite_error'] = null;
   unset($_SESSION['invite_error']);
}

在启动输出缓冲之前启动会话。因此,切换
ob\u Start()
session\u Start()
调用


由于会话cookie是在发送到浏览器的头文件中定义的,并且当您启动缓冲区时,头文件会发送到浏览器,因此您必须在缓冲区之前启动会话。

以我的经验,PHP会话不值得使用,只被设计为一种快速简单的解决方案$_会话行为并不总是显而易见的,但在传统意义上使用会话是不可避免的。发布您自己的id和令牌cookie,并根据这些cookie存储会话值,可能存储在数据库中。这还具有跨服务器可扩展的优点。

unset($\u SESSION['invite\u error'];=>unset right)不存在。我想这是一个复制粘贴问题。您在请求中的任何位置都使用AJAX吗?错误是否存在于另一个变量中,该变量是在您取消设置$u会话变量之前设置的?当您说“返回”时,您是在使用“返回”按钮,还是再次单击页面链接?@Razed我没有使用“返回”按钮。使用“主页”链接,然后使用“邀请朋友”链接返回页面。在ob_start()时将HTTP头发送到浏览器会破坏输出缓冲的主要功能,你为什么说它会这样做?此外,即使它这样做了,在这种情况下也不会有任何区别。为什么基于错误语句的非sequeuit会得到这么多的升级票?使用WAMP服务器,我必须包含session\u write\u close()来删除会话cookie。没有别的办法。