以下代码验证访问该站点的用户代理但是我收到错误。我需要更新什么才能适应没有设置用户代理的情况?
错误 PHP注意:未定义的索引:第7行的Utils.php中的HTTP_USER_AGENT
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
);
}
答案 0 :(得分:49)
User-Agent标头是可选的。防火墙可以过滤它,或者人们可以配置其客户端以省略它。只需检查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'])
: '';
答案 1 :(得分:6)
使用isset:
if( !isset( $_SERVER['HTTP_USER_AGENT'])){
$name = "none";
}else{
$userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
if (preg_match('/opera/', $userAgent)) {
$name = 'opera';
} [... yourcode ...]
}