/* 関数名: ipCity パラメータの説明: $userip - ユーザーのIPアドレス 関数関数: PHPがユーザーを決定しますIP アドレス別 City 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 )){ """"""""""" "" '; } //explode 関数は IP アドレスを分解し、演算により整数の結果が得られます $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アドレスレコードを一致させる場合($ userip1num&gt; $ useripnum || $ userip2num&lt; $ useripnum){ $ middle = intval(($ endnum + $ beginnum) / 2);インデックス位置に移動して 4 バイトを読み取ります fseek($fd, $useripbegin + 7 * $Middle) = FREAD ($ fd, 4); If (Strlen ($ Useripdata1) & LT; 4) { fclose ($ fd); Return 'File Error'; } }}} データは負であり、2 回の 32 乗 $ userip1num = Implode ('', unpack ('l', $ useripdata1)) ; if($ userip1num&lt; 0)$ userip1num += pow(2、32);个 // 前のインデックスを取得した後、インデックスを削除します $ dataseek = FREAD ($ fd, 3); fclose ($ fd); Return 'File Error '; } $DataSeek = implode('', unpack('L', $DataSeek.chr(0))); $DataSeek U if ($ userip2num & lt; 0) $ userip2num += POW ( 2, 32);
// 都市に対応する IP アドレスが見つかりません ($ userip2num & lt; $ useripnum) { if ($ middle == $ $ BeginNum) { fclose($fd);
$useripFlag = fread($fd, 1); if($useripFlag == chr(1)) { $useripSeek = implode('', unpack('L', $useripSeek.chr(0)) ); $useripFlag == chr(2)) { U $ useripflag = FREAD ($ fd, 1) if ($ useripflag == chr (2); $ addrseek2 = fread($ fd、3); $AddrSeek = implode('', unpack('L', $AddrSeek.chr(0))); 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 'システムエラー' ; } $AddrSeek2 = implode(' ', unpack('L', $AddrSeek2.chr(0))); fseek($fd, $AddrSeek2); } else { fseek($fd, -1, SEEK_CUR); } しながら(( $char = fread($fd, 1)) != chr(0)){ $useripAddr2 .= $char; } } 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 = 'データなし'; } return $useripaddr; } ?> |