Почему мои php $ _POST и $ _SESSION не очищаются после каждого запуска моей последовательности входа в систему?

#php #mysql #phpstorm

#php #mysql #phpstorm

Вопрос:

К вашему сведению: это домашнее задание, поэтому я не могу опубликовать весь код.

Я использую Ubuntu 18.04, используя PhpStorm в режиме отладки, и просто чтобы убедиться, я добавил

 $_POST = array();
$_SESSION = array();
  

для очистки этих массивов в конце целевой страницы вызывается view_mainpage.php при успешном входе в систему, а также controller.php вызывается справа перед exit() .

У меня есть оператор switch controller.php для присоединения или входа. Половина входа выглядит так:

 switch ($command) {  // When a command is sent from the client
        case 'SignIn':  // With username and password
            if (user_exists($username)== false) {//user does not exist
                something_wrong();
            }
            else { //user exists validate entries first
                if((check_username()!='ok') || (check_password()!='ok')){
                    something_wrong();
                }
                else{//all entries are well formatted
                    //set valid_username
                    $valid_username = $username;
                    $_SESSION['valid_user'] = $valid_username;
                    //validate existing user
                    if(validate_existing_user($username, $password)==false){
                        something_wrong();//row with username, pass not found
                    }
                    else {
                        //get user id
                        $user_id = get_user_id($username);
                        if($user_id!=-1){
                            include('w4_view_mainpage.php');
                        }

                    }
                }

            }
            $_POST = array();
            $_SESSION = array();
            exit();
  

В верхней части controller.php , он обрабатывает первый раз, когда он приземляется controller.php вот так:

 <?php
//When controller.php is accessed for the first time
if(!isset($_SESSION)){
    session_start();
}
if (empty($_POST['page'])) {
    $d_type = 'none';
    //$_SESSION['display_type'] = $d_type;
    include ('w4_view_startpage.php');
    exit();
}

/*
*   When commands come from StartPage or MainPage meaning it's not the first time we landed
on controller.php so it goes to the switch statement.
*/

require ('model.php');  // connect to MySQL database; functions to access DB tables

// When commands come from StartPage
if ($_POST['page'] == 'StartPage') {
    $command = $_POST['command'];
    $username = $_POST['username'];
    $password = $_POST['password'];
    $email='';
    if(!empty($_POST['email'])){
        $email = $_POST['email'];
    }
.
.
.
  

Я включил еще немного кода и комментариев, чтобы показать, как происходит вход / присоединение.

  • Итак, в самый первый раз, когда он перенаправляется на view_startpage.php это, есть небольшое интерактивное меню и всплывающие модальные окна для присоединения или входа.

  • При успешном «присоединении» пользователь перенаправляется view_startpage.php , но при успешном входе перенаправляется туда view_mainpage.php , где, как упоминалось выше, я очищаю сообщение и сеанс.

  • Но когда я обновляю страницу в Firefox и обновляю на PhpStorm, $_POST и $_REQUEST у меня уже есть элементы для page , command , username , password из предыдущего входа, поэтому я никогда не смогу вернуться к view_startpage.php , он просто перезагружает view_mainpage.php .

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

Соединение с MySQL и model.php все мои функции, похоже, работают, поэтому я понятия не имею, что я могу сделать, чтобы каждый раз «начинать заново».

Редактировать: ответы на некоторые вопросы в комментариях ниже.

  1. $username $password и $email отправляются через форму на startpage.php .
 <form method='post' action='w4_controller.php'>
                <input type='hidden' name='page' value='StartPage'>
                <input type='hidden' name='command' value='SignIn'>
                <label class='modal-label'>Username:</label>
                <input type='text' name='username' required>
                <span id="username-error">
                    <?php
                    ...left out php as it is the homework. basically inline error messages when input is invalid
                    }?>

                </span>
                <br>
                <br>
                <label class='modal-label'>Password:</label>
                <input type='password' name='password' required>
                <span id="password-error">
                    <?php
                    ...left out php per above
                    }?>

                </span>
                <br>
                <br>
                <input type='submit'>amp;nbsp;amp;nbsp;
                <input id='cancel-signin-button' type='button' value='Cancel'>amp;nbsp;amp;nbsp;
                <input type='reset'>
            </form>
  

Комментарии:

1. Я не вижу смысла использовать сеансы, если вы очищаете переменную сеанса в конце скрипта? Сеансы используются для хранения данных между запросами, поэтому их удаление в конце сценария / запроса противоречит цели. Или something_wrong() перенаправить пользователя?

2. Вы также должны опубликовать весь соответствующий код, например, из какой-либо из этих «магических переменных», например $username , $password из формы, как вы отправляете данные (ajax или просто обычная отправка формы?) Было бы неплохо с пошаговым руководством, как вы воспроизводите проблему. На данный момент это немного неясно. Мы можем помочь лучше, если у нас будет более широкий взгляд. Кроме того, это просто проблема при отладке в PhpStorm или у вас такая же проблема при тестировании через браузер (без участия PhpStorm вообще)?

3. Без PhpStorm мой код работает. Я запустил его через терминал в VSCode в стеке LEMP (Nginx, MySQL) без проблем. Я настроил X-debug на PhpStorm и вижу, что он использует файлы cookie, так что это связано с этим или ответ amit177 правильный?

Ответ №1:

 $_POST = array();
  

Очистка массива на самом деле не очищает его на стороне клиента, только на стороне сервера — с вашей стороны.

Что вам нужно сделать, это перенаправить пользователя на ту же страницу (заголовок местоположения), таким образом, запрос будет изменен с POST на GET, и предыдущая информация не будет отправлена, когда клиент обновит страницу.

Пример:

 header("Location: ".$_SERVER["PHP_SELF"]);
exit();
  

Комментарии:

1. можете ли вы привести небольшой фрагмент в качестве примера для вашего ответа?

2. добавлено, не совсем уверен, насколько это было бы полезно. P.S. Mangus также верен, нет смысла использовать сеансы, если вы загружаете его один раз, а затем удаляете все данные. Возможно, вы захотите рассмотреть возможность изменения способа работы вашего потока. например, вместо загрузки страницы в части входа, перенаправьте на другую страницу, на которой есть проверка (или на ту же страницу, а затем загрузите ее с помощью сеанса). очевидно, что это всего лишь пример, есть много способов заставить его работать.

3. вы имеете в виду целевую страницу, которая снова проверяет правильность всей информации о входе в систему?

4. да, в значительной степени. если пользователь имеет действительный сеанс (вошел в систему), загрузите главную страницу / панель мониторинга. в противном случае загрузите страницу входа. если вам достаточно удобно, вы также можете создать разные файлы. например, login.php для логинов и index.php для целевой страницы (или чего-нибудь еще).

5. Это выглядело бы намного чище и должно дать вам лучшую оценку 🙂