Проблема сброса переменной сеанса - PullRequest
6 голосов
/ 22 июня 2009

На моем сайте есть форма, которая используется для приглашения друзей. Это простое текстовое поле и кнопка отправки. В случае ошибки я перенаправляю обратно на эту страницу и отображаю сообщение об ошибке, если установлена ​​переменная сеанса.

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

Однако, если я уйду с этой страницы и вернусь к ней - сообщение об ошибке все еще отображается. Если я уйду и вернусь еще раз, это будет сделано. Это то же самое, когда я обновляю эту страницу ... 1 обновление не избавится от нее, а 2 обновит. Я не могу уничтожить весь сеанс, я просто хочу сбросить эту переменную. Версия PHP - 5.2.5, сборка 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");
?>

Ответы [ 4 ]

13 голосов
/ 22 июня 2009

Запустите сеанс до начала буферизации вывода. Итак, переключите вызовы ob_start() и session_start().

Поскольку cookie-файлы сеансов определены в заголовках, отправляемых в браузер, и заголовки отправляются в браузер при запуске буфера, необходимо начинать сеансы до буфера.

2 голосов
/ 08 июня 2011

По моему опыту, сессии PHP не стоят того, чтобы их использовать, они были разработаны как быстрое и простое решение. Поведение $ _SESSION не всегда очевидно, но использование сессий в традиционном смысле в большинстве случаев неизбежно. Создайте свои собственные куки-файлы идентификаторов и токенов и сохраните значения сеансов по ним, возможно, в базе данных. Это также имеет преимущество, заключающееся в возможности масштабирования на серверах.

2 голосов
/ 22 июня 2009

Приведенный вами пример должен работать. Возможно, какой-то сессионный кеш мешает вам. Вы можете попробовать изменить свой код следующим образом:

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

}
1 голос
/ 22 июня 2009

Может быть, вы можете изменить значение после отображения ошибки

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