Очистить переменную сеанса после использования - PullRequest
12 голосов
/ 28 июля 2010

Можно ли использовать переменную сеанса, а затем сбросить ее сразу после?

Пример:

//====
//Process Form
if ($_POST['Submit']) {
    $update = $userSettings->update($_POST);

    //If there are form errors
 if (!$update) {
        //Load the errors into an array
        $errors = $update[1];
    } else {
        //Set the session
        $_SESSION['showUpdated'] = true;

        //Redirect to this page
        header("Location: http://www.mysite.com/settings");
    }
}

//==================

if ($_SESSION['showUpdated']) {
 echo "Settings Updated";
    unset($_SESSION['showUpdated'];
}

Итак, после отправки формы, если нет ошибок:

  • Установить сеанс, чтобы сказать, что отправка формы была в порядке
  • Перезагрузить страницу (чтобы предотвратить повторную отправку данных POST)
  • Если установлена ​​переменная сеанса showUpdated, отобразить сообщение «Обновлено»
  • Сброс переменной сеанса (поэтому мы не видим сообщения при следующей перезагрузке)

В настоящее время проблема заключается в том, если вы сразу же сбросили переменную сеанса; Это как если бы вы удалили его перед частью «если существует».

Есть какие-нибудь решения? Это даже лучший способ сделать это?

Большое спасибо!

Ответы [ 6 ]

23 голосов
/ 16 ноября 2012

Я заметил небольшую ошибку в исходном примере, которая может вызвать другие проблемы.

unset($_SESSION['showUpdated'];

должно быть

unset($_SESSION['showUpdated']);

Не включая этот конец ) в unset вызовет ошибку.

3 голосов
/ 28 июля 2010

Похоже, это должно работать.Убедитесь, что вы вызываете session_start (), прежде чем пытаться использовать сеанс, и всегда выходите () или die () после заголовка перенаправления.

Я выполняю то, что вы делаете, немного по-другому.Я сохраняю элемент сообщения в сессии.Я вставлю текст, например, «Ваши данные были сохранены», сообщения об ошибках и т. Д. Затем на каждой странице (фактически в классе шаблона страницы) я проверяю, установлен ли $_SESSION['message'] и не пусто ли.Если что-то есть, я отображаю сообщение и устанавливаю значение в пустую строку или ноль.

3 голосов
/ 28 июля 2010

Я делаю это время от времени.У меня никогда не было проблем с этим.Но то, что я хотел бы добавить к вашему, - это вызов функции exit() после перенаправления заголовка.

РЕДАКТИРОВАТЬ: Причина для exit() состоит в том, что это предотвратит его дальнейшую обработку кода и исключит возможностьunset, прежде чем вы хотели проверить после перенаправления.

2 голосов
/ 28 июля 2010

Вызов заголовка без выхода после продолжит работу страницы.

header("Location: http://www.mysite.com/settings");
exit;

Использование этого вместо этого должно убить страницу и не сбрасывать переменную сеанса при том же вызове страницы.

1 голос
/ 28 июля 2010

Просто проверьте, существует ли он. Это безопасно сделать до того, как он будет определен, и сообщит вам ваш ответ после того, как он будет определен.

if(!empty($_SESSION['showUpdated'])) {
0 голосов
/ 28 июля 2010

Или вы можете просто установить его на false.

if ($_SESSION['showUpdated']) {
 echo "Settings Updated";
 $_SESSION['showUpdated'] = false;
}

И похоже, что вы используете меньшую версию PHP, чем 5.3, потому что в 5.3 вы получите уведомление при использовании неинициализированного значения. Поэтому вы должны использовать функцию isset:

if (isset($_SESSION['showUpdated']) && $_SESSION['showUpdated']) {
 echo "Settings Updated";
 $_SESSION['showUpdated'] = false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...