За последние 24 часа нас посетили 34629 программистов и 1695 роботов. Сейчас ищут 879 программистов ...

Проблема с алертом для страницы с формой

Тема в разделе "PHP для новичков", создана пользователем bocharsky, 1 окт 2014.

  1. bocharsky

    bocharsky Новичок

    С нами с:
    18 апр 2014
    Сообщения:
    77
    Симпатии:
    1
    Есть страница с формой (смена пароля).
    Прикрутил там аллерт, выводящий тексты «Смена пароля прошла успешно», либо «Вы не заполнили поля, повторите». Алерт управляется «флагом». Если с заполнением формы все ок ($alert_flag = true;) выводится один текст, если нет – другой.
    После того, как форма отправлена, я перегружаю страницу с помощью header("Location: $dir"). Делаю это для того, чтобы обнулить кэш браузера (или как это правильно называется?), чтобы, например, при нажатии Ф5 не появлялось предупреждение о повторной отправки формы и пр.

    Проблема1:
    Перегрузка страницы «обнуляет» мою переменную флага, т.е. не получается управлять алертами.

    Тогда я сохранил флаг в сессию, после отправки формы (страница перегрузилась), достаю флаг из сессии и вроде бы все ОК.

    Проблема 2: но в этом случае (когда флаг алерта записан в сессии), алерт (тот или иной) выводится всегда, при любом посещении этой страницы.

    На ум приходит, что после извлечения флага из сессии и использования, надо unset ($_SESSION[‘alert_flag’]). Но где бы я не вставлял эту команду, алерт перестает выводиться.

    В принципе, понятно почему: после перегрузки страницы у меня $_SESSION[‘alert_flag’] либо есть, либо нет. Если нет – то и алерта нет. А если есть – то есть всегда.

    Не понимаю, как наладить корректный вывод алерта для такой страницы. Но уверен, что задачка хрестоматийная. Подскажите плиз. Ниже - полная версия моих файлов, они длинные, поэтому изложил сначала суть словами.


    changePassword.php:

    Код (Text):
    1.  
    2.  
    3. session_start();
    4. $email = $_SESSION ['email']; // вынули из сессии имейл, чтобы использовать для UPDATE
    5.  
    6. // Задаем тексты для вывода в плашке алерта
    7. $form_alert_text_success = 'Смена пароля прошла успешно';
    8. $form_alert_text_error = 'Ошибка. Пустые поля, или пароли не совпадают';
    9.  
    10. // Обработка формы
    11. if(isset($_POST['submit']))  // Если кнопка нажата
    12.     {  
    13.    
    14.     // Выводить алерт (ниже решаем, алерт успеха, или ошибки)
    15.     // Сохраняем в сессии, т.к. придется перегрузить страницу с помощью header("Location...
    16.     $_SESSION['alert_flag'] = true;
    17.    
    18.     // Проверка заполнения полей и соответствие паролей из первого и второго полей
    19.     if(trim($_POST['password']) != "" and
    20.     trim($_POST['password2']) != "" and
    21.     trim($_POST['password']) === trim($_POST['password2']))
    22.         {
    23.             // Вставка в базу
    24.             require_once '../../includes/db_connect.inc.php';   // подключаемся
    25.             $password = md5($_POST['password']);       
    26.             $sql = mysql_query("UPDATE User SET password = '$password' WHERE email = '$email'");
    27.            
    28.             // Сохраняем в сессии, т.к. придется перегрузить страницу с помощью header("Location...
    29.             $_SESSION['form_alert_text'] = $form_alert_text_success; // текст алерта успеха
    30.             $_SESSION['form_alert_type'] = 'alert-success'; // тип аллера для подстановки в класс стилей
    31.            
    32.             $dir = $_SERVER['REQUEST_URI'];    
    33.             header("Location: $dir");                  
    34.  
    35.         } // Завершили проверку непустых полей
    36.    
    37.     else // Пустые поля, или несовпадение паролей
    38.     {          
    39.             $_SESSION['form_alert_text'] = $form_alert_text_error; // текст алерта ошибки
    40.             $_SESSION['form_alert_type'] = 'alert-danger'; // тип аллера для подстановки в класс стилей
    41.            
    42.             $dir = $_SERVER['REQUEST_URI'];    
    43.             header("Location: $dir");              
    44.     }
    45.                    
    46. } // Завершили проверку нажатия на кнопку    
    47.  
    48. require_once 'changePassword.html.php';
    49.  
    50. ?>  
    changePassword.html.php:

    Код (Text):
    1.  
    2.  
    3. <?php
    4.  
    5. // извлекли из сессии данные для аллерта
    6. $alert_flag = $_SESSION['alert_flag'];
    7. $form_alert_text = $_SESSION['form_alert_text'];
    8. $form_alert_type = $_SESSION['form_alert_type'];
    9.  
    10. // выводим алерт, если флаг ОК
    11. if ($alert_flag) require_once '../../includes/getAlert.inc.php';
    12.  
    13. // ПРОБЛЕМА: ЕСЛИ Я ЗДЕСЬ УНИЧТОЖУ ПЕРЕМЕННЫЕ В СЕССИИ, ТО АЛЕРТ ВЫВОДИТЬСЯ НЕ БУДЕТ
    14. // СТРАННО. ВЕДЬ Я УДАЛЯЮ ИХ ПОСЛЕ ТОГО, КАК ПЕРЕМЕННЫЕ ПОПАЛИ В getAlert.inc.php
    15. unset ($_SESSION['alert_flag']);
    16. unset ($_SESSION['form_alert_text']);
    17. unset ($_SESSION['form_alert_type']);
    18.  
    19. ?>
    20.    
    21. <div class="container">   <!-- Форма смены пароля -->
    22.    
    23.     <h2 style = "margin-bottom: 20px;"><small>Сменить пароль</small></h2>     
    24.  
    25.     <form method = "post" class="form-horizontal" role = "form" >
    26.  
    27.         <div class="form-group">
    28.             <label for="inputPassword" class="control-label col-sm-1">Пароль</label>
    29.             <div class="col-sm-3">
    30.                 <input type="password" name = "password" class="form-control" id="inputPassword" placeholder="Введите пароль">
    31.             </div>
    32.         </div>         
    33.            
    34.         <div class="form-group">
    35.             <label for="inputPassport2" class="control-label col-sm-1">Еще раз</label>                       
    36.             <div class="col-sm-3">                 
    37.                 <input type="password" name = "password2" class="form-control" id="inputPassword2" placeholder="Повторите пароль">
    38.             </div>
    39.         </div>  
    40.  
    41.         <div class="form-group">
    42.             <div class="col-sm-offset-1 col-sm-3">
    43.                 <button type="submit" name = "submit" class="btn btn-primary">Отправить</button>
    44.             </div>
    45.         </div>
    46.  
    47.     </form>
    48.    
    49. </div>
    50.  

    getAlert.inc.php:
    Код (Text):
    1.  
    2.  
    3. <!-- Алерт -->
    4.  
    5. <div class="container">    
    6.    
    7.     <div class="col-sm-6 alert <?php echo $form_alert_type; ?> alert-dismissible" role="alert">  
    8.         <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
    9.         <?php echo $form_alert_text; ?>
    10.     </div>
    11.        
    12. </div>
    Спасибо!
     
  2. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    $dir это ссылка на страницу с результатом?
    можно сделать так $dir?result=success
    и сделать if($_GET['result'] == 'success') чтобы вывести сообщение, так можно без сессии обойтись
     
  3. bocharsky

    bocharsky Новичок

    С нами с:
    18 апр 2014
    Сообщения:
    77
    Симпатии:
    1
    Да, это та же страница, которую я перегружаю ($dir = $_SERVER['REQUEST_URI']; )

    О, точно! Как же я не догадался(((, сейчас попробую.
    Спасибо!

    Добавлено спустя 15 минут 4 секунды:
    Ура! Работает! И кода стало меньше))
    Спасибо!