人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

解決に至った回答には300ポイント付与させて頂きます。
ユーザーエージェントによってページをドコモ用・ソフトバンク用・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

以上、宜しくお願い致します。

●質問者: xptree
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:24 28 AU DoCoMo IP
○ 状態 :終了
└ 回答数 : 1/2件

▽最新の回答へ

1 ● y-kawaz
●60ポイント

こんな感じでどうでしょう?

<?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;
}
◎質問者からの返答

回答ありがとうございます。

ひとつ書き忘れてしまったのですが、このファイル名は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']);

上記で問題ないですか?画面が真っ白になってしまうのです。

ご教示頂けると幸いです。

宜しくお願い致します。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ