Сессия не разрушается при выходе из интернет-сайта, но работает с оффлайн-сайтом - PullRequest
1 голос
/ 25 января 2020

Я только что закончил создание сайта, который включает страницу входа. Когда пользователь пытается войти, я проверяю имя пользователя и пароль по базе данных. Если они совпадают, я запускаю сеанс и устанавливаю переменные сеанса 'id' и 'uid', например, так:

$sql = "SELECT * FROM users WHERE uidUsers = ? OR emailUsers = ?";
        $stmt = mysqli_stmt_init($conn);
        if (!mysqli_stmt_prepare($stmt, $sql)) {
            header("Location: ../login.php?error=sqlerror");
            exit();
        }
        else {
            mysqli_stmt_bind_param($stmt, "ss", $mailuid, $mailuid);
            mysqli_stmt_execute($stmt);
            $result = mysqli_stmt_get_result($stmt);
            if ($row = mysqli_fetch_assoc($result)) {
                $pwdCheck = password_verify($password, $row['pwdUsers']);
                if ($pwdCheck == false) {
                    header("Location: ../login.php?error=wrongpwd&mail=".$mailuid);
                    exit();
                }
                elseif($pwdCheck == true) {
                    session_start();
                    $_SESSION['id'] = $row['idUsers'];
                    $_SESSION['uid'] = $row['uidUsers'];

                    header("Location: ../login.php?login=success");
                    exit();
                }
                else {
                    header("Location: ../login.php?error=wrongpwd");
                    exit();
                }
            }
            else {
                header("Location: ../login.php?error=nouser&mail=".$mailuid);
                exit();
            }
        }

В моем заголовочном файле. php, который связан с каждым php страница, использующая include 'header.php';, у меня есть php код, который отображает либо кнопки входа / регистрации (если $_SESSION['id'] не установлено), либо кнопку выхода (если установлена ​​$_SESSION['id']). Я также начал сеанс в шапке. php страница. Вот как выглядит код заголовка. php выглядит так:

session_start();

      if (isset($_SESSION['id'])) {

          echo 
          "<div id='logout-form'>
            <form action='includes/logout.inc.php' method='post'>
              <button type='submit' name='logout-submit'>Log Out</button>
            </form>
          </div>";

      }

      else {

          echo 
          "<div id='header-form'>
            <form action='includes/login.inc.php' method='post'>
              <button type='submit' name='login-button-header'>Log In</button>
            </form>
            <button id='signup-button'><a href='signup.php' class='header-signup'>Sign Up</a></button>
          </div>";

      }

      if (isset($_SESSION['id'])) {

          echo '<p class="greeting">Hello, <span class="greetingName">' . $_SESSION['uid'] . '</span></p>';

      } 

      date_default_timezone_set("America/Los_Angeles");

Используя xampp, я подключен к apache серверу в автономном режиме. При просмотре моего сайта сеансы работают для каждой страницы; если я вхожу в систему, регистрируется, что я вошел на каждую страницу, на которую я go, как и должно быть. Однако, когда я опубликовал свой веб-сайт несколько дней в go, мне было трудно узнать, был ли я в системе или нет. URL моего сайта: writingboxco.com , если вы хотите узнать, о чем я собираюсь поговорить. Когда я вхожу, мне кажется, что я захожу на каждую веб-страницу; Я знаю это, потому что он предоставляет сообщение «Hello, [username]» на каждой странице, что происходит только при установке $_SESSION['id']. Тем не менее, когда я нажимаю «Выйти» и go вернуться на домашнюю страницу, он все еще думает, что я вошел в систему (потому что я, вероятно, есть, но я не знаю почему). При нажатии кнопки «Выйти» запускается скрипт «logout.in c. php». В этом файле я сбрасываю и уничтожаю переменные сеанса, например:

session_start();
session_unset();
session_destroy();
$_SESSION = [];
header("Location: ../login.php");

Кроме того, я вхожу в систему только на некоторых страницах веб-сайта. Некоторые из них регистрируют, что я вышел из системы, а другие нет. Я не уверен, почему я остаюсь в системе после нажатия кнопки «Выйти», которая должна уничтожить переменные сеанса. Когда мой сайт используется в автономном режиме, он работает отлично; когда я выхожу, каждая страница понимает это. Однако, когда он-лайн, он не работает для каждой страницы. Это работает только для некоторых (некоторые страницы остаются в системе, а некоторые страницы правильно выходят из системы). Кроме того, когда я пытаюсь войти в систему с альтернативной учетной записью, он регистрируется, но на некоторых страницах сообщение «Hello [username]» по-прежнему отображает имя учетной записи, из которой я только что вышел, вместо учетной записи, в которую я только что вошел. в. Есть идеи, в чем может быть проблема? Это проблема с невозможностью уничтожить переменные сеанса? Может ли это быть другой код, на который я должен смотреть? Спасибо.

ОБНОВЛЕНИЕ: Я обнаружил, что в файле error_log есть сообщение об ошибке [28-Jan-2020 00:02:56 UTC] PHP Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /home1/writipe3/public_html/searchUsers.php:1) in /home1/writipe3/public_html/header.php on line 5 . Есть идеи, почему это будет происходить?

1 Ответ

1 голос
/ 25 января 2020

Когда вы уничтожаете сеанс в PHP, вы фактически не удаляете его. Вы просто помечаете его для сбора мусора. Физическое удаление происходит позже. Таким образом, чтобы убедиться, что сеанс действительно уничтожен, вы также должны удалить сеанс cook ie, который распространяет идентификатор сеанса.

Если вы посмотрите на Пример # 1 из session_destory() документации вы увидите пример кода о том, как go сделать это:

<?php
// Initialize the session.
// If you are using session_name("something"), don't forget it now!
session_start();

// Unset all of the session variables.
$_SESSION = array();

// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

// Finally, destroy the session.
session_destroy();

Почему эта переменная поведения на разных платформах?

Причина Вы можете увидеть различия в том, как это обычно работает на практике, потому что разные платформы могут использовать разные методы сбора мусора для очистки данных сеанса. Например, в большинстве Windows систем это может произойти мгновенно. Известно, что некоторые системы на основе Debian (Ubuntu) используют асинхронный метод G C, который происходит за пределами PHP.

PHP, по умолчанию реализует это с помощью алгоритма вероятности c, в котором каждый запрос, сделанный на PHP, будет в пределах определенной вероятности (обычно около 1% времени) запускать цикл G C. Таким образом, очистка не является детерминированной c почти во всех случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...