我有一些PHP代码来检查用户登录状态,检查是否设置了会话变量或设置了cookie。如果其中一个条件为真,那么它将获得盛大权限,否则将重定向到登录页面。代码如下所示:
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仍然存在(我已经检查过echo cookie数据仍然存在cookie)。
答案 0 :(得分: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 :(得分: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而不是replace ||在此字段的isset()函数之间的括号中。
答案 2 :(得分: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
的依赖程度也不高,因为用户可以随时更改。
答案 3 :(得分: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语句中使用这些函数:
if (isSessionValid() || isCookieValid()) {
} else {
}