PHP сессия не работает должным образом - как мне исправить? - PullRequest
0 голосов
/ 08 сентября 2011

Вот мой index.php

<?php 
session_start();
if($_SESSION['authorizedreferral'] == false){       //login.php sets 'authorizedreferral' to false, and redirects to here. That way, login.php can't be accessed directly.
    session_destroy();                              //destroy the session, so the 'authorizedreferral' session is revaluated each time.
    echo "<h1>No ticky, no washy!</h1>";            //Sorry, don't pass go, and don't collect $200

}elseif(!isset($_COOKIE['loggedin'])){              //if there isn't a 'loggedin' cookie set, forward to the login.php page
    $_SESSION['authorizedreferral'] = true;         //yes, this is a correct referral. Otherwise, login.php will kick you out!
    header("Location: login.php");                  //forward to login.php
    exit;                                           //need this for some reason?
}

?>

Вот login.php:

<?php 
    session_start();                                            //start the session
    if(!isset($_SESSION['authorizedreferral'])){                //if 'authorizedreferral' isn't set (i.e. someone just loads login.php directly)

        $_SESSION['authorizedreferral'] = false;                //set 'authorizedreferral' to false - they aren't allowed here! 
        header('Location: http://'.$_SERVER["HTTP_HOST"]);      //and ship 'em back home!
        exit;                                                   //need this for some reason

    }


?>

Вот возможные ситуации:

  1. Пользователь уходитв index.php - поскольку они не вошли в систему (не имеют cookie для входа в систему), они отправляются на страницу login.php для входа в систему.
  2. Пользователь пытается получить доступ к login.php напрямую - онотправили обратно на index.php и получили сообщение «Нет тики, нет шалости!»

Однако, прямо сейчас, пользователь всегда получает «Нет тики, нет, мытье!»при доступе к странице index.php.Чего мне не хватает?

См. http://webify.nitrouscloud.net

1 Ответ

4 голосов
/ 08 сентября 2011

Когда пользователь впервые заходит на сайт, у него будет пустой сеанс.Ваше первое предложение if () всегда будет иметь значение true, потому что в PHP есть правила приведения типов:

if($_SESSION['authorizedreferral'] == false)

Сессия пуста, поэтому в сеансе нет значения авторизованного реферала, поэтому PHP возвращает 'null' (и предупреждение о неустановленном ключе массива).В соответствии с правилами типизации PHP, null == false - ИСТИНА.

Вам придется изменить свою логику, чтобы проверить, вошел ли пользователь в систему (НЕ сохраняйте это в файле cookie - сохраните его в сеансе), и перенаправьтена страницу входа в систему:

session_start();
if (!isset($_SESSION['loggedin']) || ($_SESSION['loggedin'] === false)) {
    header("Location: login.php");
}

Другой альтернативой является использование оператора строгого сравнения:

if ($_SESSION['authorizedreferral'] !== true) {
    ...
}

, который будет успешным только в том случае, если действительно будет БЫЛО авторизованное значение реферала, для которого установлено логическое значениеправда.Тем не менее, вы все равно получите предупреждение о неустановленном массиве для совершенно новых пользователей.

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