2013-01-02 54 views
16

下面的代碼驗證用戶代理訪問該網站,但是我正在錯誤。我需要更新以適應沒有設置用戶代理的場景。PHP未定義指數:HTTP_USER_AGENT

ERROR PHP說明:未定義指數:HTTP_USER_AGENT在utils.php中第7行

CODE

public static function detectBrowser() 
    { 
     $userAgent = strtolower($_SERVER['HTTP_USER_AGENT']); 

     if (preg_match('/opera/', $userAgent)) { 
      $name = 'opera'; 
     } 
     elseif (preg_match('/webkit/', $userAgent)) { 
      $name = 'safari'; 
     } 
     elseif (preg_match('/msie/', $userAgent)) { 
      $name = 'msie'; 
     } 
     elseif (preg_match('/mozilla/', $userAgent) && !preg_match('/compatible/', $userAgent)) { 
      $name = 'mozilla'; 
     } 
     else { 
      $name = 'unrecognized'; 
     } 

     if (preg_match('/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/', $userAgent, $matches)) { 
      $version = $matches[1]; 
     } 
     else { 
      $version = 'unknown'; 
     } 

     if (preg_match('/linux/', $userAgent)) { 
      $platform = 'linux'; 
     } 
     elseif (preg_match('/macintosh|mac os x/', $userAgent)) { 
      $platform = 'mac'; 
     } 
     elseif (preg_match('/windows|win32/', $userAgent)) { 
      $platform = 'windows'; 
     } 
     else { 
      $platform = 'unrecognized'; 
     } 

     return array(
      'name'  => $name, 
      'version' => $version, 
      'platform' => $platform, 
      'userAgent' => $userAgent 
     ); 
    } 

回答

41

用戶代理標題是可選的。防火牆可能會對其進行過濾,或者人們可能會將其客戶端配置爲忽略它。如果存在,只需使用isset()進行檢查。甚至更好,使用!empty()一個空的標頭將不適合之一:

public static function detectBrowser() { 
    if(empty($_SERVER['HTTP_USER_AGENT'])) { 
     return array(
      'name' => 'unrecognized', 
      'version' => 'unknown', 
      'platform' => 'unrecognized', 
      'userAgent' => '' 
     ); 
    } 

    // your old code here 
} 

然而,由於所有的代碼似乎很好地工作在一個空字符串,並得到「未知」的價值觀,你可以簡單地更改以下行:

$userAgent = strtolower($_SERVER['HTTP_USER_AGENT']); 

這樣的:

$userAgent = isset($_SERVER['HTTP_USER_AGENT']) 
       ? strtolower($_SERVER['HTTP_USER_AGENT']) 
       : ''; 
3

使用isset:

if(!isset($_SERVER['HTTP_USER_AGENT'])){ 
    $name = "none"; 
}else{ 
    $userAgent = strtolower($_SERVER['HTTP_USER_AGENT']); 

    if (preg_match('/opera/', $userAgent)) { 
     $name = 'opera'; 
    } [... yourcode ...] 
} 
+0

漂亮與巨大的'else'塊IMO – ThiefMaster

+5

我知道難看,但這不是問題。 –