Удаление данных сессии после вывода

Статус
В этой теме нельзя размещать новые ответы.

NikroVir

Извращённый отшельник
Регистрация
27 Апр 2008
Сообщения
346
Реакции
117
Доброго времени суток, дамы и господа.
Я новичок в программировании на php, в связи с чем прошу яйцами не закидывать.

Есть не сложный код (постарался ещё больше упростить и вырезать некоторые моменты) :
PHP:
session_start();

function messages_handler($msg_type){
  switch ($msg_type) {
    case 'notification':
      $_SESSION['message_handler'] = "Всё ок, бро";
      header('Location: '.$_SERVER['PHP_SELF']);
      break;
  }
}

function check_message(){
  if (isset($_SESSION['message_handler'])) {
    echo $_SESSION['message_handler'];
    unset($_SESSION['message_handler']);
  }
}

if ($_GET['do'] == '3') {
  messages_handler('notification');
}

check_message();

Как видно из кода, мы запускаем сессию, если по гет-запросу получена тройка, то функция messages_handler() записывает в $_SESSION['message_handler'] сообщение что всё ок и редиректит на эту же страницу. Здесь функция check_message() видит, что $_SESSION['message_handler'] определена и выводит её, а после чего и очищает (чтобы при обновлении страницы сообщение больше не показывалось).

И всё бы хорошо, но код не работает, если проводить очистку. Т.е. без строки
PHP:
unset($_SESSION['message_handler']);
всё работает замечательно, но сообщение будет показываться постоянно, что меня не устраивает.

Как сделать так, чтобы и вывести сообщение и очистить $_SESSION['message_handler']?

Великие гуру, помогите. Я уже всю голову сломал!
Видел похожие проблемы на других форумах, но дельных советов не нашёл.
 
Последнее редактирование:
А где редирект?
И после редиректа можно добавить exit(); чтоб уж точно не выполнялся код ниже.
PHP:
if ($_GET['do'] == '3') {
  messages_handler('notification');
  run_redirect();
  exit();
}
 
А где редирект?
И после редиректа можно добавить exit(); чтоб уж точно не выполнялся код ниже.

Редирект выполняется в функции messages_handler()
PHP:
function messages_handler($msg_type){
  switch ($msg_type) {
    case 'notification':
      $_SESSION['message_handler'] = "Всё ок, бро";
      header('Location: '.$_SERVER['PHP_SELF']); //Вот он, родной
      break;
  }
}

PS: Поправил описание кода, чтобы подобные вопросы больше не возникали
 
Редирект выполняется в функции messages_handler()
PHP:
function messages_handler($msg_type){
  switch ($msg_type) {
    case 'notification':
      $_SESSION['message_handler'] = "Всё ок, бро";
      header('Location: '.$_SERVER['PHP_SELF']); //Вот он, родной
      break;
  }
}

PS: Поправил описание кода, чтобы подобные вопросы больше не возникали

break прервёт дальнейшее выполнение switch. Нужен exit().
Но при этом после messages_handler('notification'); которая отсылает заголовок редиректа выполнится check_message(); который вернёт вашу месагу и сотрёт сессию. Для проверки, что это так запустите в консольном режиме или через кеширующий прокси.
 
break прервёт дальнейшее выполнение switch. Нужен exit().
Но при этом после messages_handler('notification'); которая отсылает заголовок редиректа выполнится check_message(); который вернёт вашу месагу и сотрёт сессию. Для проверки, что это так запустите в консольном режиме или через кеширующий прокси.
Скажу честно, вообще не понял почему нужен exit вместо break (а средствами отладки пока не пользуюсь, да и не умею), но код заработал.
 
Скажу честно, вообще не понял почему нужен exit вместо break (а средствами отладки пока не пользуюсь, да и не умею), но код заработал.
exit() останавливает выполнение скрипта, break останавливает выполнение оператора switch. Если не остановить выполнение скрипта то всегда будет вызываться функция check_message(). А эта ф-я должна вызываться только после редиректа.
 
Скажу честно, вообще не понял почему нужен exit вместо break (а средствами отладки пока не пользуюсь, да и не умею), но код заработал.
У вас данные записываются в сессию, после сразу выводится сообщение, данные из сессии удаляются, а только потом происходит редирект. А сообщение вы не увидите, так как не успеете.

Поэтому надо exit после записи сессии. Либо проверку делать, не только что ли данные записали
 
Можно с этого момента подробнее? Ведь, как я понимаю, вариант с exit() - это костыль.

С exit более предпочтительно. В некоторых движках даже при редиректе сразу выполнение кода останавливается. Если у вас редирект - максимум, надо сохранить какие-то данные и всё. Далее не страницу не генерируем, ни сообщения не выводим

PHP:
session_start();

function messages_handler($msg_type){
  switch ($msg_type) {
    case 'notification':
        $_SESSION['message_handler'] = "Всё ок, бро";
        header('Location: '.$_SERVER['PHP_SELF']);
    break;
  }
  exit;
}

function check_message(){
  if (isset($_SESSION['message_handler'])) {
    echo $_SESSION['message_handler'];
    unset($_SESSION['message_handler']);
  }
}

if ($_GET['do'] == '3') {
  messages_handler('notification');
}

check_message();
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху