2013-01-02 16 views
16

Poniższy kod sprawdza, czy agent użytkownika uzyskuje dostęp do witryny, ale pojawia się błąd. Co muszę zaktualizować, aby uwzględnić scenariusze, w których nie ma ustawionego klienta?Niezdefiniowany indeks PHP: HTTP_USER_AGENT

ERROR PHP Wskazówka: Undefined index: HTTP_USER_AGENT w Utils.php na linii 7

KOD

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 
     ); 
    } 

Odpowiedz

41

User-agent nagłówek jest opcjonalny. Zapory ogniowe mogą je filtrować lub ludzie mogą konfigurować swoich klientów, aby go pominąć. Po prostu sprawdź, jeśli istnieje, podając isset(). Albo jeszcze lepiej, użyj !empty() jako pusty nagłówek nie będzie przydatna zarówno:

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

    // your old code here 
} 

Jednakże, ponieważ wszystkie kodu wydaje się działać prawidłowo na pusty ciąg znaków, a także przynoszą „nieznany” wartości, które może po prostu zmienić następujący wiersz:

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

tak:

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

użycie 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

dość brzydki z ogromnym 'else' bloku IMO – ThiefMaster

+5

wiem, ale to nie było pytanie. –

Powiązane problemy