ユーザーエージェントによってページをドコモ用・ソフトバンク用・EZ用・PC用に振り分けるphpがあるのですが、
これをユーザーエージェントではなくIPによってページを振り分けるようにしたいです。
http://tool-3.net/?id=useragent&pn=0
上記がソースです。これをIPで判別するように修正して頂きたいです。
IPは数が多いのでここではそれぞれ3つとします。
# DoCoMo
124.146.174.0/24
210.136.161.0/24
202.229.177.0/24
# Softbank
202.179.204.0/24
210.169.130.112/28
211.8.159.128/25
# AU
111.86.141.128/26
210.230.128.224/28
219.125.148.160/27
上記以外のIPは全てPCと判別
PHP 5.1.6
mysql 5.0.45
以上、宜しくお願い致します。
こんな感じでどうでしょう?
<?php define("_CARRIER_PC", "1"); define("_CARRIER_DOCOMO", "2"); define("_CARRIER_SOFTBANK", "3"); define("_CARRIER_EZWEB", "4"); function getCarrierByIP($ip=null) { $ranges = array( _CARRIER_DOCOMO => array( '124.146.174.0/24', '210.136.161.0/24', '202.229.177.0/24', ), _CARRIER_SOFTBANK => array( '202.179.204.0/24', '210.169.130.112/28', '211.8.159.128/25', ), _CARRIER_EZWEB => array( '111.86.141.128/26', '210.230.128.224/28', '219.125.148.160/27', ), ); if($ip == null) { $ip = $_SERVER['REMOTE_ADDR']; } foreach($ranges as $carrier => $ranges) { foreach($ranges as $range) { if(cidr_match($ip, $range)) { return $carrier; } } } return _CARRIER_PC; } function cidr_match($ip, $range) { list ($subnet, $bits) = split('/', $range); $ip = ip2long($ip); $subnet = ip2long($subnet); $mask = -1 << (32 - $bits); $subnet &= $mask; # nb: in case the supplied subnet wasn't correctly aligned return ($ip & $mask) == $subnet; } switch(getCarrierByIP()) { case _CARRIER_PC: //略 break; case _CARRIER_DOCOMO: //略 break; case _CARRIER_SOFTBANK: //略 break; case _CARRIER_EZWEB: //略 break; }
回答者 | 回答 | 受取 | ベストアンサー | 回答時間 | |
---|---|---|---|---|---|
1 | あすか | 856回 | 784回 | 97回 | 2011-02-21 18:43:47 |
回答ありがとうございます。
ひとつ書き忘れてしまったのですが、このファイル名はMobile.clsなのですが、あるファイルにインクルードされています。
インクルード元のソースは以下の通りです。
include_once Mobile.cls;
$Carrier = Mobile::getCarrierUserAgent($GLOBALS['_SERVER']['HTTP_USER_AGENT']);
上記の書き換え方は
include_once Mobile.cls;
$Carrier = Mobile::getCarrierByIP($GLOBALS['_SERVER']['REMOTE_ADDR']);
上記で問題ないですか?画面が真っ白になってしまうのです。
ご教示頂けると幸いです。
宜しくお願い致します。