2011-08-25 85 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']; 
}