PHP、Smarty、ケータイサイトについて発信中。書籍 「Smarty動的webサイト構築入門」(技術評論社) 好評発売中
RSS icon Home icon
  • PHP:ケータイのキャリア判別


     アクセスしてきたケータイがi-mode/EZweb/SoftBankかの判定は、かつてはUserAgentだけで判別していました。しかし、vodafoneの一部機種はUserAgentに”UP.Browser”を含んでいたり、UserAgentに”vodafone”がなかったりします。今後もUserAgentがイレギュラーな新機種が発売される可能性もあり、UserAgentだけに頼るのは無理があるようです。

     今回紹介する方法は、UserAgentと他の変数を使う方法です。UserAgentで判別できない場合は、SoftBank特有・EZweb特有の変数があるかどうかを調べます。もし新機種が発売されて、UserAgentで判別できなかったとしても「未対応です」と表示せずにすみます。

     例えば、Smartyのテンプレートを切替えたい場合は、templates/0/hoge.tpl ~ templates/3/hoge.tpl を用意して、次のように使います。

    require_once( 'bc.inc.php' );
    $n = BC_get_carrier();
    $smarty->display( "$n/hoge.tpl" );
    

     各キャリアごとのディレクトリ名を数字にするのは、正直なところ私もしっくりきません。”pc”/”i”/”ez”/”sb”などにしたいところです。しかし、J-PHONE→vodafone→SoftBankと社名変更があったので、考えざるを得ません。数字が一番気にならないと思います。

     以下を適当なファイル名(例えばbc.inc.php)で保存してください。(<?php と ?>で囲んでください。)

    define( "BC_PC"       ,  0 );
    define( "BC_EZWEB"    ,  1 );
    define( "BC_VODAFONE" ,  2 );
    define( "BC_SOFTBANK" ,  2 );
    define( "BC_IMODE"    ,  3 );
    
    function BC_get_carrier ()
    {
      $ua = $_SERVER['HTTP_USER_AGENT'];
      $ca = BC_PC;
    
      if ( preg_match('/docomo/i', $ua) ) {
        $ca = BC_IMODE;
      } else if ( preg_match('/j-phone|vodafone|softbank/i', $ua) ) {
        $ca = BC_SOFTBANK;
      } else if ( preg_match('/J-EMULATOR|Vemulator/i', $ua) ) {
        $ca = BC_SOFTBANK;
      } else if ( preg_match('/kddi/i', $ua) ) {
        $ca = BC_EZWEB;
    
      } else if ( isset($_SERVER['HTTP_X_JPHONE_DISPLAY']) ) {
        $ca = BC_SOFTBANK;
      } else if ( isset($_SERVER['HTTP_X_EMULATOR_DISPLAY']) ) {
        $ca = BC_SOFTBANK;
    
      } else if ( isset($_SERVER['HTTP_X_UP_SUBNO']) ) {
        $ca = BC_EZWEB;
      } else if ( isset($_SERVER['HTTP_X_UP_DEVCAP_SCREENPIXELS']) ) {
        $ca = BC_EZWEB;
      }
    
      return $ca;
    }
    

     なお、もっとも確実な方法は、アクセス元のIPアドレス(REMOTE_ADDR)で判別する方法です。各キャリアごとにゲートウェイのIPアドレス範囲が公開されています。IPアドレス範囲は、ごくたま~に変更されるので、定期的に各キャリアの技術ページをチェックする必要があります。

    2007-05-28 admin No comments 02.PHP, 04.ケータイ

    Leave a reply