2016-04-02 7 views
2

У меня есть код PHP для проверки состояния входа пользователя, который проверяет, установлены ли переменные сеанса или установлены файлы cookie. Если какое-либо из условий истинно, тогда это большое разрешение иначе перенаправляется на страницу входа. Код выглядит следующим образом:isset и if function in php with or operator

if(isset($_SESSION["userid"]) || isset($_COOKIE["userid"]) && isset($_SESSION["username"]) || isset($_COOKIE["username"]) && isset($_SESSION["password"]) || isset($_COOKIE["password"])){ 
} else { 
header("location : register.php"); 
} 

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

+0

'если ((Исеть ($ _ SESSION [ "UserID"]) && Исеть ($ _SESSION ["username"]) && isset ($ _ SESSION ["password"])) || (isset ($ _ COOKIE ["userid"]) && isset ($ _ COOKIE ["username"]) && isset ($ _ COOKIE ["password"]))) { } else { header ("location: register.php"); } ' –

+0

Когда вы публикуете этот код, можете ли вы предоставить мне ссылку? Я попробую что-нибудь. –

+0

Я серьезно рекомендую вам узнать больше о ООП или использовать фреймворк вроде Slim или Silex. http://www.phptherightway.com/ – Lucas

ответ

1

Вы должны изменить ваше состояние немного, потому что вы путаете его в SESSION и Cookie. Поместите их вместе с && и разделить их с ||, как показано ниже: -

if((isset($_SESSION["userid"]) && isset($_SESSION["username"]) && isset($_SESSION["password"])) || (isset($_COOKIE["userid"]) && isset($_COOKIE["username"]) && isset($_COOKIE["password"]))){ 

    // your action that you want 

} else { 

    header("location : register.php"); 
} 

Примечание: - Будьте осторожны, что одни и те же вещи собираются применять везде (друг на друга страницы и условия), в противном случае вы будете сталкиваться с проблемой ,

Кроме того, зависимость от cookie не является хорошей, поскольку она может быть изменена пользователем в любое время.

1

Вам нужно добавить пару прерывателей группировать высказывания, как это:

if( 
    (isset($_SESSION["userid"]) || isset($_SESSION["username"]) && isset($_SESSION["password"])) 
|| 
    (isset($_COOKIE["userid"]) || isset($_COOKIE["username"]) && isset($_COOKIE["password"])) 
){ 
    // Your action 
} else { 
header("location : register.php"); 
} 

Такое заявление будет проверять, если установлен COOKIE или SESSION и проверить или user_id или имя пользователя и пароль. Если вам нужно AND user_id AND username, то замените || в скобках между функциями isset() для этих полей.

2

&& имеет более высокий приоритет, чем ||, поэтому вам необходимо защитить || с помощью скобок. Кроме того, имея пустую if заявления просто лишнее:

if(!(isset($_SESSION["userid"]) || isset($_COOKIE["userid"]) || 
    !(isset($_SESSION["username"]) || isset($_COOKIE["username"])) || 
    !(isset($_SESSION["password"]) || isset($_COOKIE["password"]))) { 
    header("location : register.php"); 
} 
1

Я думаю, что ваше состояние if отсутствует в скобках. Для того, чтобы сделать код более удобным для чтения, вы можете создать две функции

function isSessionValid() 
{ 
    return isset($_SESSION["userid"]) && isset($_SESSION["username"]) && isset($_SESSION["password"]); 
} 

function isCookieValid() 
{ 
    return isset($_COOKIE["userid"]) && isset($_COOKIE["username"]) && isset($_COOKIE["password"]); 
} 

, а затем использовать эти функции в вашем случае заявление:

if (isSessionValid() || isCookieValid()) { 

} else { 

}