2014-11-22 105 views
-3

我不明白這一點。如果設置$ _GET ['action']並且action不是「login」或不是「messages」,我想要執行Action()。邏輯運營商在php

我不工作代碼:

if (isset($_GET['action']) && ($_GET['action'] !== "login" || $_GET['action'] !== "messages"))  { 
    doAction(); 
} 

如果我刪除||有用。

if (isset($_GET['action']) && ($_GET['action'] !== "login")) { 
    doAction(); 
} 

任何提示?

+1

'一個!== B'意味着不** **不等於b – kero 2014-11-22 18:09:12

+0

呀。錯字,對不起。請看我編輯的帖子。 – TheG 2014-11-22 18:11:41

+0

非常奇怪的邏輯操作。 – 2014-11-22 18:16:13

回答

0

好吧,讓我們來檢查你的if語句的執行:

  1. 假設,動作some_action 然後isset($_GET['action'])真正$_GET['action'] !== "login"真正

由於PHP有懶執行(truetruetrue)比較停止,你的doAction執行,很好,正是我們需要的。

  • 假設,動作登錄 然後isset($_GET['action'])$_GET['action'] !== "login"$_GET['action'] !== "messages"爲真(如登錄絕對不是消息)。所以(true和(falsetrue))是true

  • 終於想,行動是消息 然後isset($_GET['action'])真正$_GET['action'] !== "login"。考慮到懶惰執行你的doAction再次運行。

  • 好吧!看起來像doAction將始終工作!

    修復的問題在你使用and (&&)代替​​if

    if (isset($_GET['action']) 
        && ($_GET['action'] !== "login" && $_GET['action'] !== "messages")) 
        // that should work properly! 
    
    0

    您正在使用「不等於」運算符(!==)。如果你想測試是否值loginmessages,你應該使用==操作:

    if (isset($_GET['action']) && 
        ($_GET['action'] == "login" || $_GET['action'] == "messages")) { 
        doAction(); 
    } 
    
    +0

    是的,我原來的帖子中有一個錯字。對於那個很抱歉。請看我編輯的帖子。 – TheG 2014-11-22 18:15:25

    0
    if (isset($_GET['action']) && 
        ($_GET['action'] !== "login" || $_GET['action'] !== "messages")) { 
        doAction(); 
    } 
    
    +0

    那麼OP代碼有什麼區別? – 2014-11-22 18:19:07

    +0

    我使用不等於運算符,因爲問題是如果設置$ _GET ['action']並且動作不是「登錄」或不是「消息」並且在上部代碼條件中檢查動作是否設置並且動作是登錄或消息而不是做東西.. – 2014-11-22 18:21:46

    +0

    所以編輯你的答案,包括。我相信@u_mulder得到的是,StackOverflow上的完整答案應該包括固定代碼和解釋固定代碼如何工作和/或問題代碼爲什麼不起作用的解釋。 – ArtOfWarfare 2014-11-22 18:48:53

    0

    當PHP與||測試條件語句,PHP將測試條件語句的順序,他們被寫入,如果其中一個是真的,則整個條件評估爲真。這意味着你的代碼,如果的$ _GET [「行動」]的值爲「信息」,條件的值爲true:

    if (isset($_GET['action']) && ($_GET['action'] !== "login" || $_GET['action'] !== "messages")){ 
        doAction(); 
    } 
    

    因爲在翻譯時評估$ _GET [「行動」] = =「login」並且$ _GET ['action']的值是'messages',那麼評估的結果是true,因此if塊中的代碼將被執行。我建議你改變你的代碼:

    if (isset($_GET['action']) && ($_GET['action'] !== "login" && $_GET['action'] !== "messages")){ 
        doAction(); 
    } 
    

    的||被更改爲& &,這意味着$ _GET ['action']的值不能是'login',並且不能是'messages'。