IP 地理的位置クエリ クラス
- /**
- ファイル名: IpLocation.class.php
- * IP 地理的位置クエリ クラス (メイン ファイルとテスト ファイルをアップロードしました。QQWry.Dat もあります。これは、Innocence IP ライブラリからダウンロードできます。6M を超えているため、ここにはアップロードしません)
- *
- * @author Ma Bingyao
- * @version 1.5
- * @copyright 2005 CoolCode.CN
- */
- class IpLocation {
- /**
- * QQWry.Dat ファイルポインタ
- * @var リソース
- */
- var $fp
- /**
- * 最初の IP レコードのオフセット アドレス
- * @var int
- */
- var $firstip; ;
-
- /**
- * 最後の IP レコードのオフセット アドレス
- * @var int
- */
- var $lastip;
-
- /**
- * IPレコードの総数(バージョン情報レコードを除く)
- * @var int
- */
- var $totalip;
- function __construct($filename = " .Dat") {
- $this->fp = 0;
- if (($this->fp = @fopen($filename, 'rb')) !== false) {
- $this->firstip = $this->getlong();
- $this->lastip = $this->getlong();
- $this->totalip = ($this->lastip - $this->firstip) / 7;
- //プログラム実行の最後に実行されるようにデストラクターを登録します
- register_shutdown_function(array(&$this, '__construct'));
- /**
- * コンストラクター、QQWry.Dat ファイルを開き、クラス内の情報を初期化します
- * @param string $filename
- * @return IpLocation
- */
- function getlong() {
- //読み取った 4 バイトのリトルエンディアンエンコーディングを long 整数に変換します
- $result = unpack('Vlong', fread($this->fp, 4));
- return $result[ 'long'];
- }
- /**
- * 読み込んだ長整数を返します
- * @access private
- * @return int
- */
- function getlong3() {
- //読み取った 3 バイトのリトルエンディアンエンコーディングを long 整数に変換します
- $result = unpack('Vlong', fread($this->fp, 3).chr(0));
- return $result['long'];
- /**
- * 読み取った 3 バイト長整数を返します
- *
- * @access private
- * @return int
- */
- function package($ip) {
- / / PHP5ではIPアドレスをlong型の整数に変換します
- // このとき、intvalはFleseを整数-1に変換してからビッグエンディアンに圧縮します。エンコードされた文字列
- return Pack('N', intval(ip2long($ip)));
- }
- /**
- * 比較可能な圧縮された IP アドレスを返します
- *
- * @access private
- * @param string $ip
- * @return string
- */
- function getstring($data = "") {
- $ char = fread($ this->fp, 1);
- while (ord($char) > 0) { // 文字列は C 形式で保存されます。
- if ($ip < $beginip) { // ユーザーの IP が中間レコードの開始 IP アドレスより小さい場合
- $u = $i - 1; // 検索の上限を中間レコードに変更します。マイナス 1
- } else {
- fseek($this->fp, $this->getlong3());
- $endip = strrev(fread($this->fp, 4)); // 終了を取得中間レコードの IP アドレス
- if ($ip > $endip) { // ユーザーの IP が中間レコードの終了 IP アドレスより大きい場合
- $l = $i + 1; // の下限を変更します。中間レコードに 1 を加えたものを検索します
- } else { // ユーザーの IP が中間レコードの IP 範囲内にある場合
- $findip = $this->firstip + $i * 7; // これは意味します。結果が見つかり、ループが終了します
- }
- }
- }
-
- //見つかった IP 地理的位置情報を取得します
- fseek($this->fp, $findip)
- $location['beginip'] = long2ip ($this->getlong()); // ユーザー IP が存在する範囲の先頭
- $offset = $this->getlong3();
- fseek($this->fp, $offset );
- $location['endip'] = long2ip($this->getlong()) / / ユーザー IP 範囲の終了アドレス
- $byte = fread($this->fp, 1); Flag byte
- switch (ord($byte)) {
- case 1: // フラグ バイトは 1 で、国と地域の情報が同時にリダイレクトされることを示します
- $countryOffset = $this->getlong3() / / リダイレクトアドレス
- fseek($this->fp, $countryOffset);
- $byte = fread($ this->fp, 1); // フラグバイト
- switch (ord($byte)) {
- case 2 : // フラグバイトは 2 で、国情報が再度リダイレクトされたことを示します
- fseek($this-> ;fp, $this->getlong3()); $location['country'] = $this-> ;getstring();
- fseek($this->fp, $countryOffset + 4);
- $location ['area'] = $this->getarea();
- デフォルト: //国情報がリダイレクトされないことを意味します
- $location['country'] = $this->getstring($byte );
- $location['area'] = $this->getarea(); }
- Break;
- case 2: // フラグバイトは 2 で、国情報がリダイレクトされることを示します
- $location['country' ] = $this->getstring();
- fseek($this->fp, $offset + 8);
- $location['area'] = $this->getarea();
- デフォルト: // それ以外の場合は、国情報がリダイレクトされないことを意味します
- $location['country'] = $this->getstring ($byte);
- $location['area'] = $this->getarea( );
- Break;
- }
- if ($location['country'] == " CZ88.NET") { // CZ88 .NET は有効な情報がないことを示します
- $location['country'] = "Unknown" ;
- }
- if ($location['エリア'] == " CZ88.NET") {
- $location['エリア'] = " ";
- }
- $location; &*/
- function __desctruct() {
- if ($this->fp) {
- fclose($this->fp)
- }
- $this->fp = 0;
- }
- ?> ;
-
-
- コードをコピー
-
-
-
-
- require_once('IpLocation.class.php');
- $ip='127.0.0.1';
- $idADDR=new IpLocation()
- print_r($idADDR->getlocation($) ip));
- ?>
-
コードをコピー - /**
- * IP 地理的位置クエリ クラス
- *
- * @author Ma Bingyao
- * @version 1.5
- * @copyright 2005 CoolCode.CN
- */
- class IpLocation {
- /**
- * QQWry.Dat ファイルポインタ
- * @var リソース
- */
- var $fp
- /**
- * 最初の IP レコードのオフセット アドレス
- * @var int
- */
- var $firstip; ;
-
- /**
- * 最後の IP レコードのオフセット アドレス
- * @var int
- */
- var $lastip;
-
- /**
- * IPレコードの総数(バージョン情報レコードを除く)
- * @var int
- */
- var $totalip;
- function __construct($filename = " .Dat") {
- $this->fp = 0;
- if (($this->fp = @fopen($filename, 'rb')) !== false) {
- $this->firstip = $this->getlong();
- $this->lastip = $this->getlong();
- $this->totalip = ($this->lastip - $this->firstip) / 7;
- //プログラム実行の最後に実行されるようにデストラクターを登録します
- register_shutdown_function(array(&$this, '__construct'));
- /**
- * コンストラクター、QQWry.Dat ファイルを開き、クラス内の情報を初期化します
- * @param string $filename
- * @return IpLocation
- */
- function getlong() {
- //読み取った 4 バイトのリトルエンディアンエンコーディングを long 整数に変換します
- $result = unpack('Vlong', fread($this->fp, 4));
- return $result[ 'long'];
- }
- /**
- * 読み取った長整数を返します
- * @access private
- * @return int
- */
- function getlong3() {
- //読み取った 3 バイトのリトルエンディアンエンコーディングを long 整数に変換します
- $result = unpack('Vlong', fread($this->fp, 3).chr(0));
- return $result['long'];
- /**
- * 読み取った 3 バイト長整数を返します
- *
- * @access private
- * @return int
- */
- function package($ip) {
- / / PHP5ではIPアドレスをlong型の整数に変換します
- // このとき、intvalはFleseを整数-1に変換してからビッグエンディアンに圧縮します。エンコードされた文字列
- return Pack('N', intval(ip2long($ip)));
- }
- /**
- * 比較可能な圧縮された IP アドレスを返します
- *
- * @access private
- * @param string $ip
- * @return string
- */
- function getstring($data = "") {
- $ char = fread($ this->fp, 1);
- while (ord($char) > 0) { // 文字列は C 形式で保存されます。
- if ($ip < $beginip) { // ユーザーの IP が中間レコードの開始 IP アドレスより小さい場合
- $u = $i - 1; // 検索の上限を中間レコードに変更します。マイナス 1
- } else {
- fseek($this->fp, $this->getlong3());
- $endip = strrev(fread($this->fp, 4)); // 終了を取得中間レコードの IP アドレス
- if ($ip > $endip) { // ユーザーの IP が中間レコードの終了 IP アドレスより大きい場合
- $l = $i + 1; // の下限を変更します。中間レコードに 1 を加えたものを検索します
- } else { // ユーザーの IP が中間レコードの IP 範囲内にある場合
- $findip = $this->firstip + $i * 7; // これは意味します。結果が見つかり、ループが終了します
- }
- }
- }
-
- //見つかった IP 地理的位置情報を取得します
- fseek($this->fp, $findip)
- $location['beginip'] = long2ip ($this->getlong()); // ユーザー IP が存在する範囲の先頭
- $offset = $this->getlong3();
- fseek($this->fp, $offset );
- $location['endip'] = long2ip($this->getlong()) / / ユーザー IP 範囲の終了アドレス
- $byte = fread($this->fp, 1); Flag byte
- switch (ord($byte)) {
- case 1: // フラグ バイトは 1 で、国と地域の情報が同時にリダイレクトされることを示します
- $countryOffset = $this->getlong3() / / リダイレクトアドレス
- fseek($this->fp, $countryOffset);
- $byte = fread($ this->fp, 1); // フラグバイト
- switch (ord($byte)) {
- case 2 : // フラグバイトは 2 で、国情報が再度リダイレクトされたことを示します
- fseek($this-> ;fp, $this->getlong3()); $location['country'] = $this-> ;getstring();
- fseek($this->fp, $countryOffset + 4);
- $location ['area'] = $this->getarea();
- デフォルト: //国情報がリダイレクトされないことを意味します
- $location['country'] = $this->getstring($byte );
- $location['area'] = $this->getarea(); }
- Break;
- case 2: // フラグバイトは 2 で、国情報がリダイレクトされることを示します
- $location['country' ] = $this->getstring();
- fseek($this->fp, $offset + 8);
- $location['area'] = $this->getarea();
- デフォルト: // それ以外の場合は、国情報がリダイレクトされないことを意味します
- $location['country'] = $this->getstring ($byte);
- $location['area'] = $this->getarea( );
- Break;
- }
- if ($location['country'] == " CZ88.NET") { // CZ88 .NET は有効な情報がないことを示します
- $location['country'] = "Unknown" ;
- }
- if ($location['エリア'] == " CZ88.NET") {
- $location['エリア'] = " ";
- }
- $location; &*/
- function __desctruct() {
- if ($this->fp) {
- fclose($this->fp)
- }
- $this->fp = 0;
- }
- ?> ;
-
-
- コードをコピー
-
-
-
-
-
-
-
-
-
-
-
|