2011-08-25 89 views
1

我正在嘗試編寫一個if語句,它基本上檢查用戶引用者是否位於允許的引用列表中,如果不失敗。檢查引用者是否爲空或者它是否在數組中

我有兩個變量控制着這個$this->allowAllReferer$this->allowEmptyReferer,它們根據它們的名字決定是否允許每個引用者訪問以及是否允許空引用者。以及$this->allowedReferers這是一個允許的推薦人數組。

我有這個功能下面,我很確定是不正常工作,但我一直在盯着和調整了半個小時,我已經到了我不能說,如果它的工作點或不。

//If the referee is empty and allow empty referrer is false 
//or 
//If it is not in the allowed list and allow all referer is false 
if(!(empty($_SERVER['HTTP_REFERER']) && $this->allowEmptyReferer) 
    && 
    !(!$this->allowAllReferer && in_array(
     strtolower(empty($_SERVER['HTTP_REFERER']) ? null : $_SERVER['HTTP_REFERER']), //Silly php access null variable 
     $this->allowedReferers) 
    )) { 
    throw new sfException("Internal server error. Please contact system administrator. File download disabled."); 
} 

您是否知道正確或更好的方法來做到這一點/您能否確認上述作品?


案例,希望這使得它更清晰

empty_referrer | allowEmpty | in_array | allReferer | result 
---------------------------------------------------------------- 
true   | true  | false | false  | false - no error - empty allowed 
false   | true  | false | false  | true - error - not in array 
false   | true  | false | true  | false - no error - not in array but allowed 
false   | false  | false | false  | true - error - empty and now allowed 
+2

您的真值表不完整;)需要16(2^4)行^^ – knittl

+0

ha!是的,我知道,只是失去了興趣後,四,並認爲我會有這個想法在那時xD –

回答

3

如果你想保持一個龐大的,如果塊內的邏輯,那麼請嘗試以下操作:

if (
    // throw an error if it's empty and it's not allowed to be 
    (empty($_SERVER['HTTP_REFERER']) && !$this->allowEmptyReferer) 
    || (
     // don't bother throwing an error if all are allowed or empty is allowed 
     (!empty($_SERVER['HTTP_REFERER']) && !$this->allowAllReferer) 
     // throw an error if it's not in the array 
     && !in_array((empty($_SERVER['HTTP_REFERER']) ? null : strtolower($_SERVER['HTTP_REFERER'])), $this->allowedReferers) 
    ) 
) 
{ 
    throw new sfException("Internal server error. Please contact system administrator. File download disabled."); 
} 

第二檢查空現在將跳過in_array如果它是空的。

3

如何:

$ref = &$_SERVER['HTTP_REFERER']; 
if($allowAll) { 
    // allowed 
} else if($allowEmpty && empty($ref)) { 
    // allowed 
} else if(!empty($ref) && in_array($ref, $allowedReferers)) { 
    // allowed 
} else { 
    // fail 
} 

如果你想在一個單一的if所有檢查,你可以簡單地鏈在一起條件使用or/||。短路評價確保正確的變量值和健康檢查的立即終止:

$ref = &$_SERVER['HTTP_REFERER']; 
if($allowAll 
    || ($allowEmpty && empty($ref)) 
    || (!empty($ref) && in_array($ref, $allowedReferers))) { 
    // allowed 
} else { 
    // fail 
} 
+0

我更願意在一個聲明中做到這一點,更多的挑戰比任何東西,但謝謝你的職位。 –

+0

@pez:只需使用'||'而不是'else if'。短路魔術做其餘 – knittl

+0

這裏如果它是空的,但不允許是,第二行失敗,所以第三行檢查一個空值會發生什麼? –

0

如果我理解正確的話你的要求,那麼這是最符合你的原始代碼

 if((!$this->allowEmptyReferer && empty($_SERVER['HTTP_REFERER']) 
      || (!$this->allowAllReferer && !in_array(
      strtolower(empty($_SERVER['HTTP_REFERER']) ? null : $_SERVER['HTTP_REFERER']), 
      $this->allowedReferers) 
     ) { // throw your exception } 
0

我保持會簡化你的邏輯,像這樣:

if (!$this->allowAllReferer) 
{ 
    if (empty($_SERVER['HTTP_REFERER']) && !$this->allowEmptyReferer) 
    { 
     // emtpy referer - not allowed. handle as you wish (throw exception?) 
    } 

    else if (!empty($_SERVER['HTTP_REFERER']) && 
     !in_array(strtolower($_SERVER['HTTP_REFERER'])), $this->allowedReferers) 
    { 
     // referer supplied is not approved/allowed. - handle appropriately. 
    } 

    else 
    { 
     // referer should be ok if we get here. 
    } 

} 

ie。首先,如果你允許所有查閱者,那麼你不需要做任何處理 - 只需跳過這個(if (!this->allowAllReferer))。其次,將您的邏輯檢查分解爲管理塊,使其更容易編寫,讀取和維護。

0
if(isset($_SERVER['HTTP_REFERER'])) { 
    echo $_SERVER['HTTP_REFERER']; 
}