2013-01-02 6 views
16

Il codice seguente convalida l'agente utente che accede al sito, ma sto ricevendo l'errore. Cosa devo aggiornare per adattarsi agli scenari in cui non è impostato alcun agente utente?PHP Indice non definito: HTTP_USER_AGENT

ERRORE PHP Notice: Undefined index: HTTP_USER_AGENT in Utils.php sulla linea 7

CODICE

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

risposta

41

L'User-Agent l'intestazione è facoltativa. I firewall possono filtrarlo o le persone possono configurare i loro clienti per ometterlo. Basta verificare usando isset() se esiste. O meglio ancora, utilizzare !empty() come un colpo di testa vuota, non sarà utile sia:

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

    // your old code here 
} 

Tuttavia, dal momento che tutto il codice sembra funzionare bene su una stringa vuota e anche dare i valori "sconosciuto" si potrebbe semplicemente modificare la riga seguente:

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

come questo:

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

uso 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

piuttosto brutta con l'enorme 'blocco else' IMO – ThiefMaster

+5

lo so, ma quello non era il problema. –