Есть страница с формой (смена пароля). Прикрутил там аллерт, выводящий тексты «Смена пароля прошла успешно», либо «Вы не заполнили поля, повторите». Алерт управляется «флагом». Если с заполнением формы все ок ($alert_flag = true выводится один текст, если нет – другой. После того, как форма отправлена, я перегружаю страницу с помощью header("Location: $dir"). Делаю это для того, чтобы обнулить кэш браузера (или как это правильно называется?), чтобы, например, при нажатии Ф5 не появлялось предупреждение о повторной отправки формы и пр. Проблема1: Перегрузка страницы «обнуляет» мою переменную флага, т.е. не получается управлять алертами. Тогда я сохранил флаг в сессию, после отправки формы (страница перегрузилась), достаю флаг из сессии и вроде бы все ОК. Проблема 2: но в этом случае (когда флаг алерта записан в сессии), алерт (тот или иной) выводится всегда, при любом посещении этой страницы. На ум приходит, что после извлечения флага из сессии и использования, надо unset ($_SESSION[‘alert_flag’]). Но где бы я не вставлял эту команду, алерт перестает выводиться. В принципе, понятно почему: после перегрузки страницы у меня $_SESSION[‘alert_flag’] либо есть, либо нет. Если нет – то и алерта нет. А если есть – то есть всегда. Не понимаю, как наладить корректный вывод алерта для такой страницы. Но уверен, что задачка хрестоматийная. Подскажите плиз. Ниже - полная версия моих файлов, они длинные, поэтому изложил сначала суть словами. changePassword.php: Код (Text): session_start(); $email = $_SESSION ['email']; // вынули из сессии имейл, чтобы использовать для UPDATE // Задаем тексты для вывода в плашке алерта $form_alert_text_success = 'Смена пароля прошла успешно'; $form_alert_text_error = 'Ошибка. Пустые поля, или пароли не совпадают'; // Обработка формы if(isset($_POST['submit'])) // Если кнопка нажата { // Выводить алерт (ниже решаем, алерт успеха, или ошибки) // Сохраняем в сессии, т.к. придется перегрузить страницу с помощью header("Location... $_SESSION['alert_flag'] = true; // Проверка заполнения полей и соответствие паролей из первого и второго полей if(trim($_POST['password']) != "" and trim($_POST['password2']) != "" and trim($_POST['password']) === trim($_POST['password2'])) { // Вставка в базу require_once '../../includes/db_connect.inc.php'; // подключаемся $password = md5($_POST['password']); $sql = mysql_query("UPDATE User SET password = '$password' WHERE email = '$email'"); // Сохраняем в сессии, т.к. придется перегрузить страницу с помощью header("Location... $_SESSION['form_alert_text'] = $form_alert_text_success; // текст алерта успеха $_SESSION['form_alert_type'] = 'alert-success'; // тип аллера для подстановки в класс стилей $dir = $_SERVER['REQUEST_URI']; header("Location: $dir"); } // Завершили проверку непустых полей else // Пустые поля, или несовпадение паролей { $_SESSION['form_alert_text'] = $form_alert_text_error; // текст алерта ошибки $_SESSION['form_alert_type'] = 'alert-danger'; // тип аллера для подстановки в класс стилей $dir = $_SERVER['REQUEST_URI']; header("Location: $dir"); } } // Завершили проверку нажатия на кнопку require_once 'changePassword.html.php'; ?> changePassword.html.php: Код (Text): <?php // извлекли из сессии данные для аллерта $alert_flag = $_SESSION['alert_flag']; $form_alert_text = $_SESSION['form_alert_text']; $form_alert_type = $_SESSION['form_alert_type']; // выводим алерт, если флаг ОК if ($alert_flag) require_once '../../includes/getAlert.inc.php'; // ПРОБЛЕМА: ЕСЛИ Я ЗДЕСЬ УНИЧТОЖУ ПЕРЕМЕННЫЕ В СЕССИИ, ТО АЛЕРТ ВЫВОДИТЬСЯ НЕ БУДЕТ // СТРАННО. ВЕДЬ Я УДАЛЯЮ ИХ ПОСЛЕ ТОГО, КАК ПЕРЕМЕННЫЕ ПОПАЛИ В getAlert.inc.php unset ($_SESSION['alert_flag']); unset ($_SESSION['form_alert_text']); unset ($_SESSION['form_alert_type']); ?> <div class="container"> <!-- Форма смены пароля --> <h2 style = "margin-bottom: 20px;"><small>Сменить пароль</small></h2> <form method = "post" class="form-horizontal" role = "form" > <div class="form-group"> <label for="inputPassword" class="control-label col-sm-1">Пароль</label> <div class="col-sm-3"> <input type="password" name = "password" class="form-control" id="inputPassword" placeholder="Введите пароль"> </div> </div> <div class="form-group"> <label for="inputPassport2" class="control-label col-sm-1">Еще раз</label> <div class="col-sm-3"> <input type="password" name = "password2" class="form-control" id="inputPassword2" placeholder="Повторите пароль"> </div> </div> <div class="form-group"> <div class="col-sm-offset-1 col-sm-3"> <button type="submit" name = "submit" class="btn btn-primary">Отправить</button> </div> </div> </form> </div> getAlert.inc.php: Код (Text): <!-- Алерт --> <div class="container"> <div class="col-sm-6 alert <?php echo $form_alert_type; ?> alert-dismissible" role="alert"> <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button> <?php echo $form_alert_text; ?> </div> </div> Спасибо!
$dir это ссылка на страницу с результатом? можно сделать так $dir?result=success и сделать if($_GET['result'] == 'success') чтобы вывести сообщение, так можно без сессии обойтись
Да, это та же страница, которую я перегружаю ($dir = $_SERVER['REQUEST_URI']; ) О, точно! Как же я не догадался(((, сейчас попробую. Спасибо! Добавлено спустя 15 минут 4 секунды: Ура! Работает! И кода стало меньше)) Спасибо!