6

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

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

但是,如果我离开此页面并返回到该页面 - 仍然会显示错误消息。如果我离开并再回来一次,它就会完成。当我刷新该页面时,它是一样的...... 1 刷新不会摆脱它,但 2 会。我不能破坏整个会话,我只想取消设置这个变量。PHP 版本是 5.2.5 build 6,注册全局变量已关闭,我在此页面顶部调用 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");
?>
4

4 回答 4

13

在开始输出缓冲之前启动会话。所以,切换ob_start()session_start()调用。

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

于 2009-06-22T16:49:59.620 回答
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();

}
于 2009-06-22T07:38:17.270 回答
2

以我的经验,PHP 会话不值得使用,它只是作为一种快速简便的解决方案而设计的。$_SESSION 行为并不总是很明显,但在传统意义上使用会话几乎是不可避免的。发出您自己的 id 和令牌 cookie 并针对这些存储会话值,可能在数据库中。这还具有跨服务器可扩展的好处。

于 2011-06-08T12:54:00.690 回答
1

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

if (isset($_SESSION['invite_error'])) {
   echo $_SESSION['invite_error'];
   $_SESSION['invite_error'] = null;
   unset($_SESSION['invite_error']);
}
于 2009-06-22T07:49:21.147 回答