PeanutsMonkey
PeanutsMonkey

Reputation: 7095

PHP Undefined index: HTTP_USER_AGENT

The following code validates the user agent accessing the site however I am getting the error. What do I need to update to accommodate scenarios where there is no user agent being set?

ERROR PHP Notice: Undefined index: HTTP_USER_AGENT in Utils.php on line 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
        );
    }

Upvotes: 31

Views: 56471

Answers (2)

ThiefMaster
ThiefMaster

Reputation: 318488

The User-Agent header is optional. Firewalls may filter it or people may configure their clients to omit it. Simply check using isset() if it exists. Or even better, use !empty() as an empty header won't be useful either:

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

    // your old code here
}

However, since all of your code seems to work fine on an empty string and also yield the "unknown" values you could simply change the following line:

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

like this:

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

Upvotes: 65

Green Black
Green Black

Reputation: 5084

use isset:

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

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

Upvotes: 9

Related Questions