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