2013-11-28 29 views
-2

我跟婁代碼混淆操作:不能與多個或操作

不工作

拳代碼:

if ($_SESSION['userType'] != 'A' || $_SESSION['userType'] != 'S') 
{ 
    redirect('dashboard.php'); 
} 

即工作二代碼:

if (!($_SESSION['userType'] == 'A' || $_SESSION['userType'] == 'S')) 
{ 
    redirect('dashboard.php'); 
} 

有什麼區別兩個代碼之間?

+0

在第一部分中,兩個條件返回false,第二部分都返回false並且!(false)變成等於true。 –

+3

難道他們不再在學校教授[De Morgan's Law](http://en.wikipedia.org/wiki/De_Morgan's_laws)嗎? – Barmar

回答

2

我知道你已經對你的問題有六個答案,但是他們都沒有使用簡單的英語,所以我會自己做一個嘗試好。

讓我們一步一步看這段代碼,將它分成更小的部分,並精確地解釋每一步。不工作

首先


代碼你有這樣一行:

if ($_SESSION['userType'] != 'A' || $_SESSION['userType'] != 'S') 

而不是在全if語句看則已,讓我們把它分成兩個部分:

  1. if ($_SESSION['userType'] != 'A')
  2. if ($_SESSION['userType'] != 'S')

第一部分將觸發任何時間$_SESSION['userType']A以外的任何值。

第二部分將隨時觸發$_SESSION['userType']是除S以外的任何值。

現在,您已經將它們與「或」運算符一起加入,以便它們中的一個對於if子句可以觸發就足夠了。讓我們看看當我們嘗試時會發生什麼。

  1. 我們設置$_SESSION['userType']'B'並進入if語句。發生的第一件事是PHP查看第一部分if ($_SESSION['userType'] != 'A'),並發現'B' != 'A'。它不需要轉到第二部分,因爲它已經發現if語句的其中一個部分是真實的,因此它決定了完整的if語句也必須是真實的。

  2. 我們將$_SESSION['userType']設置爲'A'並進入if子句。發生的第一件事是PHP查看第一部分if ($_SESSION['userType'] != 'A'),發現'A' == 'A',所以第一部分是錯誤的。然後進入第二部分,即if ($_SESSION['userType'] != 'S'),並發現'A' != 'S'。因爲這意味着if語句的其中一個部分是真實的,所以它再次決定完整的if語句也必須爲真。

現在注意這是什麼意思。即使您將'A'發送到if子句,由於第二部分也會觸發。如果您要發送'S',則會由於第一部分而觸發。所以基本上,無論$_SESSION['userType']設置爲什麼,全部第一條if語句都會觸發。這是一種重言式 - 它總是如此。該工作


代碼這是您的完整的if語句:

if (!($_SESSION['userType'] == 'A' || $_SESSION['userType'] == 'S'))

讓我們忽略!現在,它分爲or的兩個部分運營商。

  1. if ($_SESSION['userType'] == 'A')
  2. if ($_SESSION['userType'] == 'S')

請注意,這是你有沒有工作的代碼的邏輯相反。第一行意味着「僅接受'A'」,第二行意味着「僅接受'S'」。因此,如果您給它0​​或'S',此代碼將觸發只有

現在,如果你把!放在整個事物的前面會發生什麼,就像你做的一樣?

!運算符簡單地顛倒它放在前面的任何東西。因此,這將「A」或「S」的含義更改爲「既不A也不S」。


摘要

你的第一個例子歸結爲 「不得以任何價值」。

第二個例子歸結爲「任何值,但不是A,也不是S」。

如果您想了解更多基本邏輯,我建議您查看De Morgan's laws,正如您在上面的評論中鏈接到的那樣。這會讓你瞭解如何將andor放在一起。

0
if ($_SESSION['userType'] != 'A' || $_SESSION['userType'] != 'S') { 

或多或少相當於
if (!($_SESSION['userType'] == 'A' && $_SESSION['userType'] == 'S')) { 
+0

那麼? ........... –

+0

所以這就是區別。 –

+0

哦,你的意思是'||'和'&&'?你可能已經更清楚了。 –

-1

不工作

if ($_SESSION['userType'] != 'A' || $_SESSION['userType'] != 'S') 
{ 
    redirect('dashboard.php'); 
} 

第一代碼允許simplyfy它作爲下:

if (true || true) //the condition will be true or vice versa 
{ 
    redirect('dashboard.php'); 
} 

第二代碼是工作:

if (!($_SESSION['userType'] == 'A' || $_SESSION['userType'] == 'S')) 
{ 
    redirect('dashboard.php'); 
} 

和簡化版本:

if (!(true || true)) same as if (!(true)) //i.e. false or vice versa 
{ 
    redirect('dashboard.php'); 
} 

所以基本上一個是真的,另一個是假的,反之亦然所以這就是爲什麼他們正在採取行動diffrenetly。

+0

downvote的原因? –

+0

你沒有真正解釋任何事情。 –

+0

@RobertHarvey我認爲上面的例子清楚地表明瞭一切。再次看看 –

1

不...很。

如果我記得布爾邏輯正確,故障在於操作順序。

if ($_SESSION['userType'] != 'A' || $_SESSION['userType'] != 'S') { 

如果USERTYPE等於A,這是不行的...因爲第一個操作是檢查它不等於A和口服補液鹽從左到右...因此,如果第一個是不正確的,整個陳述是錯誤的。

你的第二個方法轉化爲:

if (!($_SESSION['userType'] == 'A' || $_SESSION['userType'] == 'S')) 
{ 
    redirect('dashboard.php'); 
} 

IF NOT USERTYPE等於A或USERTYPE等於S的也就是爲什麼它的工作原理,你的願望它。

嘗試

if ($_SESSION['userType'] != 'A' && $_SESSION['userType'] != 'S')) { 

這意味着如果用戶類型是不是A和用戶類型是不是S

我認爲這會給你什麼你可能尋找。 IE只做循環中的內容,如果userType既不是A也不是S.

+0

第二句中沒有&&。 –

+0

對不起......在這裏遲到:)第二句話是針對發佈的第一個答案,而不是他自己的表示。更新以反映這一點,幷包括他的第二個詞組。 –

+0

別擔心別人的答案。只需在問題中指出您的答案。 –