getenv('http_client_ip');
} else if (getenv('http_x_forwarded_for')) {
$ip = getenv('http_x_forwarded_for');
} else if (getenv('remote_addr')) {
$ip = _addr');
} else {
$ip = $_server['remote_addr' ];
}
return $ip;
PHP通过IP地址判断用户在城市
上文既軏获得用户IP地址、次来、我们就はこのIPアドレスに基づいていますユーザの所在地の城市を取得します。開始する前に、私たちは必要です作成されたデータベース QQ IP データベースをダウンロードします。
最新の IP アドレス データ フィールド: http://www.jb51.net/softs/10529.html QQ IP データベースは非常に便利な方法を使用しており、データも完全に保存されており、データを最新の状態に保つために時間登録を行うこともできます。 1 つの ipaddress.php ファイルは、以下のコードを直接作成して削除することができ、重要な場所には対応するコメントも用意されています。
/*
関数名: ipCity
パラメータの説明: $userip - ユーザーのIPアドレス
関数関数: PHPはIPアドレスを通じてユーザーがいる都市を決定します
author:lee
contact:xpsem2010@gmail .com
* /
function ipCity($userip) {
//IP データベースのパス、QQ IP データベース 20110405 の純粋なバージョンがここで使用されます
$dat_path = 'QQWry.dat';
//IP アドレスが有効です
if(!ereg( "^([0-9]{1,3}.){3}[0-9]{1,3}$", $userip)){
IP データベース
if(! $fd = @fopen($dat_path, 'rb')){
return 'IP データ ファイルが存在しないか、アクセスが拒否されました';
}
//explode 関数は IP アドレスを分解し、整数形式を計算します Result
$userip =explode ('.', $userip);
$useripNum = $userip[0] * 16777216 + $userip[1] * 65536 + $userip[2] * 256 + $userip[3];
// 開始とIP アドレスインデックスの終了位置
$DataBegin = fread($fd, 4);
$DataEnd = fread($fd, 4);
$useripbegin = implode('', unpack('L', $ DataBegin)) ;
if($useripbegin < 0) $useripbegin += pow(2, 32);
$useripend = implode('', unpack('L', $DataEnd));
if($useripend < ; 0) $useripend += pow(2, 32);
$useripAllNum = ($useripend - $useripbegin) / 7 + 1;
$BeginNum = 0;
$EndNum = $useripAllNum;
//二分探索法を使用 一致するIPを検索インデックス レコードからのアドレス レコード
while($userip1num>$useripNum || $userip2num<$useripNum) {
$Middle= intval(($EndNum + $BeginNum) / 2);
インデックス位置のバイト
アウトアウトアウトアウト(strlen($ useripdata1)&lt; 4){
fclose($ fd); Pow(2、32);
$userip2num = implode('', unpack('L', $useripData2));
if($userip2num < 0) $userip2num += pow(2, 32);
//IP地址对应城市
if($userip2num < $useripNum) {
if($Middle == $BeginNum) {
fclose($fd);
return 'データなし';
}
$BeginNum = $Middle;
}
}
$useripFlag = fread($fd, 1);
if($useripFlag == chr(1)) {
$useripSeek = fread($fd, 3);
if(strlen($useripSeek) < 3) {
fclose($fd);
return 'システム エラー';
}
$useripSeek = implode('', unpack('L', $useripSeek.chr(0)));
fseek($fd, $useripSeek);
$useripFlag = fread($fd, 1);
}
if($useripFlag == chr(2)) {
$AddrSeek = fread($fd, 3);
if(strlen($AddrSeek) < 3 ) {
fclose($fd);
return 'システムエラー';
}
$useripFlag = fread($fd, 1);
if($useripFlag == chr(2)) {
$AddrSeek2 = fread($ fd, 3);
if(strlen($AddrSeek2) < 3) {
fclose($fd);
return 'システムエラー';
}
$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)) );
fseek($fd, $AddrSeek2);
} else {
fseek($fd, -1, SEEK_CUR);
}
while(($char = fread($fd, 1)) != chr(0))
$ useripAddr2 .= $ char;
$AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
fseek($fd, $AddrSeek);
while(($char = fread($fd, 1) )) != chr(0))
$useripAddr1 .= $char;
} else {
fseek($fd, -1, SEEK_CUR);
while(($char = fread($fd, 1)) != chr(0))
$useripAddr1 .= $char;
$useripFlag = fread($fd, 1);
if($useripFlag == chr(2)) {
$AddrSeek2 = fread($fd, 3) );
if(strlen($AddrSeek2) < 3) {
fclose($fd);
return 'システムエラー';
}
$Add rSeek2 = implode('', unpack('L', $AddrSeek2.chr(0 )));
fseek($fd, $AddrSeek2);
}else {
}
fclose($fd);
// IP アドレスに対応する都市の結果を返す
if(preg_match('/http/i', $useripAddr2)) {
$useripAddr2 = '';
}
$useripaddr = "$ useripAddr1 $useripAddr2";
$useripaddr = preg_replace('/CZ88.Net/is', '', $useripaddr);
$useripaddr = preg_replace('/^s*/is', '', $useripaddr);
$useripaddr = preg_replace('/s*$/is', '', $useripaddr);
if(preg_match('/http/i', $useripaddr) || $useripaddr == '') {
$useripaddr = 'No Data';
}
return $useripaddr;
}
?>
PHP は IP アドレスに基づいて都市の切り替えまたはジャンプを実装します
ここまでの問題は、実際には非常に単純です、簡単なjsで解決できます。セクション C は次のとおりです:
// 指定されたページ js にジャンプして IP アドレスに基づいて都市を取得します
コードをコピーします
コードは次のとおりです:
var city='';
//すべての都市の IP アドレスに基づいて指定されたページにジャンプします
コードをコピーします
コードは次のとおりです:
if(city .indexOf("上海市")>=0){ window.location .href="http://shanghai.demo.com/";}
先頭のAセグメントコードと上記のCセグメントを配置B セグメント コードの先頭と末尾にそれぞれコードを追加してから、ジャンプする必要があります。次のコードをページに追加します:
コードをコピーします
コードは次のとおりです: