2010年 2月 の記事
携帯のユーザエージェントから様々な情報を引き出すことのできるPEAR::Net_UserAgent_Mobile とても便利で利用させてもらってます。 結構ながいこと地味な開発が続いて、2009年にstableとなったんだけど、まだ致命的なバグがある。 例えば下記のスクリプト <? require_once('Net/UserAgent/Mobile.php'); $user_agent = 'DoCoMo/2.0 N900iS(c100;TB;W24H12)'; $agent = Net_UserAgent_Mobile::factory($user_agent); print "キャリア: ".$agent->getCarrierLongName()."\n"; print "機種:".$agent->getModel(); ?> ユーザエージェントを $user_agent='Vodafone/1.0/V705SH (compatible; Y!J-SRD/1.0; http://help.yahoo.co.jp/help/jp/search/indexing/indexing-27.html)'; に変えると Fatal error: Call to undefined function: getcarrierlongname() とエラーになってしまう。 自分で解析できないユーザーエージェントだと、無視せずにエラーを返して強制終了してしまう。 このバグは致命的。先々未知のユーザエージェントは続々と登場するわけで、その度にエラーが出ることになってしまう。 調べてみると、かなりの人が同じ症状で困っているし作者にバグ報告もされているが、その場しのぎで根本的な問題が修正がされることなくstableとなった。 対処方法 <? require_once('Net/UserAgent/Mobile.php'); $user_agent='Vodafone/1.0/V705SH (compatible; Y!J-SRD/1.0; http://help.yahoo.co.jp/help/jp/search/indexing/indexing-27.html)'; $agent = Net_UserAgent_Mobile::factory($user_agent); if (method_exists($agent,'isNonMobile')){ print "キャリア: ".$agent->getCarrierLongName()."\n"; print "機種:".$agent->getModel(); } のように if (method_exists($agent,'isNonMobile')){ ~ } でラップしてスルーさせればOK - [ 続きを読む ]