[英]Newer style PHP ternary operator has undesired result with isset function
[英]isset and if function in php with or operator
我有一些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)。
&&
的優先級高於||
,因此您需要保護||
帶括號。 同樣,有一個空的if
語句只是多余的:
if(!(isset($_SESSION["userid"]) || isset($_COOKIE["userid"]) ||
!(isset($_SESSION["username"]) || isset($_COOKIE["username"])) ||
!(isset($_SESSION["password"]) || isset($_COOKIE["password"]))) {
header("location : register.php");
}
您需要添加幾個斷路器來對語句進行分組,如下所示:
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密碼。 如果您需要AND user_id和AND用戶名,請替換||。 在此字段的isset()函數之間的括號中。
您需要稍微改變一下條件,因為您在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
更多依賴也是不好的,因為用戶可以隨時更改它。
我覺得你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 {
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.