2011-02-23 57 views
4

給出這個輸入:http://example.com/item.php?room=248&supply_id=18823,以下2個塊應該產生相同的結果。他們爲什麼不呢?除了咖啡,我還缺少什麼?意外轉換爲布爾值?

此塊給出的預期值:

if (isset($_GET['supply_id']) && isset($_GET['room'])) { 
    $id=validkey($_GET['supply_id']); //18823 
    $room=validkey($_GET['room']); //248 
    $arr=array('s'=>$id,'r'=>$room); //s=>18823, r=>248 
} 

但是,如果我做了檢查,並在一個步驟中分配,$ ID最後等於1,而不是18823.爲什麼?

if (isset($_GET['supply_id']) && isset($_GET['room'])) { 
    if($id=validkey($_GET['supply_id']) && $room=validkey($_GET['room'])) 
     $arr=array('s'=>$id",'r'=>$room); //s=>1, r=>248 
} 

這是我使用的功能:

function validkey($value){ 
    if(is_scalar($value)){ 
     $value=(int)$value; 
     return ($value>0) ? $value : false; 
    } 
    return false; 
} 

回答

7

要使用括號:

if(($id=validkey($_GET['supply_id'])) && ($room=validkey($_GET['room']))) 

否則的validkey($_GET['supply_id']) && $room=validkey($_GET['room'])結果被分配到$id可變的,因爲&&運營商具有較高的優先於=

+0

這就是答案。我之前遇到過這個問題,第一次遇到它會讓你感到困惑 - '&&'比'='具有更高的優先級。所以你必須把這個任務包裝在一個額外的括號裏。 – Andrew 2011-02-23 14:16:42

+0

但是我認爲這種語法通常是一個壞主意 - 它使代碼更難以遵循,並且更容易出錯。 – BrynJ 2011-02-23 14:18:26

+0

是的,或者使用我不喜歡的'AND'; – meze 2011-02-23 14:18:41

3

運營商&&運營商的結合強於運營商=

所以,你的代碼基本上成爲if ($id = (validkey($_GET['supply_id']) && $room = validkey($_GET['room'])))

- >添加括號圍繞$foo = $bar表情在你的IF語句。

2

你的第二個例子似乎有一個小錯誤 - $ id後的一個流浪的雙倍報價。另外,你的第二種方法通常被忽視(在if結構中賦值變量),因爲它使得代碼難以遵循。更清晰將如下:

if (isset($_GET['supply_id']) && isset($_GET['room'])) {  
    $id=validkey($_GET['supply_id']); //18823  
    $room=validkey($_GET['room']); //248 

    if($id && $room) {  
     $arr=array('s'=>$id,'r'=>$room); //s=>18823, r=>248 
    } 
} 
+0

多餘的報價是一個錯字。我修復了它。我可以看到做這個任務的位置,如果分兩步完成,檢查真相會更清楚,但我不認爲我會兩次調用「validkey」。內部'if'只需要'if($ id && $ room){}' – dnagirl 2011-02-23 14:23:12

+0

你說得很對,我剛纔沒有看到我剪切和粘貼的代碼片段:)我已經更新了我的答案。 – BrynJ 2011-02-23 14:28:09