1. ホーム
  2. php

[解決済み] PHP 未定義のインデックスです。http_user_agent

2022-02-18 02:42:36

質問

以下のコードでサイトにアクセスするユーザーエージェントを検証していますが、エラーが発生します。ユーザーエージェントが設定されていないシナリオに対応するためには、何を更新する必要がありますか?

エラー PHPの通知です。 未定義のインデックスです。 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
        );
    }

解決方法は?

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
}

しかし、あなたのコードはすべて空文字列で問題なく動作し、"unknown" の値も得られるようなので、次の行を変更するだけでよいでしょう。

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

このように

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