Ошибка при использовании сеансов PHP (два экрана входа в систему)

#php #session

#php #сеанс

Вопрос:

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

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

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

Вот фрагменты из соответствующих файлов:

     index.php
    <?php
    include_once 'db_functions.php';

    require_once 'access.php';

    if (isset($_POST['action'])) {
        if (userIsLoggedIn()) {
            header('Location: http://www.myapp.com/index.php');         //prevents users from having to confirm form resubmission if they refresh the page
        }

    }

    if (!userIsLoggedIn()) {
        include 'login.php';
        exit();
    }
  

login.php:

 login.php
<body>
<h1>Log In</h1>

<?php
    if (isset($loginError)) {
          echo $loginError; 
    }
?>

    <form action="" method="post">
    <div>
    <label for="email">Email: <input type="text" name="email" id="email" /> </label>
    </div>
    <div>
    <label for="password">Password: <input type="password" name="password" id="password" /></label>
    </div>
    <div>
    <input type="hidden" name="action" value="login" />
    <input type="submit" value="Log in"  />
    </div>
    </form>
</body>
  

access.php:

  <?php
 function userIsLoggedIn() {
    if (isset($_POST['action']) and $_POST['action'] == 'login') {

        if (!isset($_POST['action']) or $_POST['email'] == '' or
        !isset($_POST['password']) or $_POST['password'] == '') {

            $GLOBALS['loginError'] = 'Please fill in both fields';
            return FALSE;
        }

    $email = $_POST['email'];
    $password = $_POST['password'];

    if (databaseContainsAuthor($email, $password)) {
        session_start();  //LINE 17
        $_SESSION['loggedIn'] = TRUE;
        $_SESSION['email'] = $email;
        $_SESSION['password'] = $password;
        return TRUE;
    }
    else {
        session_start();
        unset($_SESSION['loggedIn']);
        unset($_SESSION['email']);
        unset($_SESSION['password']);
        $GLOBALS['loginError'] = 'The specified email address or password was incorrect.';
        return FALSE;
    }
    }

    if (isset($_POST['action']) and $_POST['action'] == 'logout') {
        session_start();
        unset($_SESSION['loggedIn']);
        unset($_SESSION['email']);
        unset($_SESSION['password']);
        header('Location: ' . $_POST['goto']);
        exit();
    }

    session_start();
    if (isset($_SESSION['loggedIn'])) {
        return databaseContainsAuthor($_SESSION['email'], $_SESSION['password']);
    }
}

function databaseContainsAuthor($email, $password) {
    include_once './db_functions.php';
    $db = new DB_Functions();
    $result = $db->accountExists($email, $password);
    return $result;
}

?>
  

Любая помощь будет принята с благодарностью!

ОБНОВЛЕНИЕ: журналы ошибок показывают несколько случаев возникновения этой ошибки:

 PHP Notice:  A session had already been started - ignoring session_start() in /home3/monitot5/public_html/app/access.php on line 17
  

Access.php строка 17:

 if (databaseContainsAuthor($email, $password)) {
    session_start();  //LINE 17
    $_SESSION['loggedIn'] = TRUE;
  

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

1. Вы должны вызывать session_start() ровно один раз за запрос — не больше и не меньше. Это не должно быть в if / else structures или скрыто в функции, но вызывается в верхней части скрипта.

Ответ №1:

Что вам нужно сделать, так это использовать

 session_start();
  

в начале access.php файла и больше не используйте эту функцию.

Вы также должны полностью изменить логин вашего access.php файла. Первое, что вы всегда должны делать в этом файле, это проверять, существует ли допустимый сеанс для этого пользователя. Теперь вы проверяете это в конце файла и, вероятно, раньше очищаете его, потому что вы отменяете сеанс, если нет $_POST данных.

Кроме того, вы также не должны использовать пароль в своем сеансе. Это довольно небезопасно. Вы должны просто сохранить логин для своей системы, когда пользователь заполнил форму действительным именем пользователя / электронной почтой и паролем, и отменить его, если пользователь вышел из системы.

Извините, но я не буду писать весь код за вас. Вы должны просто взглянуть на некоторые примеры кода в Google, чтобы проверить, как обрабатывать вход / выход пользователя в PHP.