PHP未定义索引:HTTP_USER_AGENT

29
以下代码验证访问站点的用户代理,但我收到了错误提示。我需要更新什么才能适应没有设置用户代理的情况吗? 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
        );
    }
2个回答

62

用户代理头是可选的。防火墙可能会过滤它,或者人们可能会配置客户端省略它。只需使用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
}

然而,由于你的所有代码似乎在空字符串上都能正常工作并产生"unknown"值,你可以简单地更改以下行:

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

像这样:

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

9

使用isset:

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

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

在我看来,巨大的else块让代码看起来相当丑陋。 - ThiefMaster
9
了解,但那不是问题的关键。 - Green Black

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接