解決に至った回答には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

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

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2011/02/21 16:43:13
  • 終了:2011/02/28 16:45:03

回答(2件)

id:y-kawaz No.1

y-kawaz回答回数1421ベストアンサー獲得回数2262011/02/21 18:32:56

ポイント60pt

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

<?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;
}
id:xptree

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

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

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

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

宜しくお願い致します。

2011/02/24 19:04:28

質問者が未読の回答一覧

 回答者回答受取ベストアンサー回答時間
1 あすか 856 784 97 2011-02-21 18:43:47

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません