Проблема сброса переменной сеанса
На моем сайте есть форма, которая используется для приглашения друзей. Это простое текстовое поле и кнопка отправки. Если возникает ошибка, я перенаправляю обратно на эту страницу и отображаю сообщение об ошибке, если установлена переменная сеанса.
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 ответа
Начните сеанс, прежде чем начинать буферизацию вывода. Итак, переключите ob_start()
а также session_start()
звонки.
Поскольку cookie-файлы сеансов определены в заголовках, отправляемых браузеру, а заголовки отправляются в браузер при запуске буфера, необходимо начинать сеансы до начала буфера.
Приведенный вами пример должен работать. Возможно, какой-то сессионный кеш мешает вам. Вы можете попробовать изменить свой код следующим образом:
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();
}
По моему опыту, PHP-сессии не стоят того, чтобы их использовать, они были разработаны как быстрое и простое решение. Поведение $_SESSION не всегда очевидно, но использование сессий в традиционном смысле в большинстве случаев неизбежно. Создайте свои собственные куки-файлы идентификаторов и токенов и сохраните значения сеансов по ним, возможно, в базе данных. Это также имеет преимущество в том, что оно масштабируется между серверами.
Может быть, вы можете изменить значение после отображения ошибки
if (isset($_SESSION['invite_error'])) {
echo $_SESSION['invite_error'];
$_SESSION['invite_error'] = null;
unset($_SESSION['invite_error']);
}