ホームページ  >  記事  >  バックエンド開発  >  IP アドレスに基づいて都市を取得する PHP 固有の実装_PHP チュートリアル

IP アドレスに基づいて都市を取得する PHP 固有の実装_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:17:431161ブラウズ

ファイルディレクトリ:

ipLocation
-----qqwry
----------QQWry.Dat
-----ipCity.class.php


ipCity.class.php ファイルコード:

コードをコピーします コードは次のとおりです:

class ipCity {

/**
* IP アドレスに基づいて対応する都市を取得します
* @param type $userip ユーザー IP アドレス
* @return string
*/
public function getCity($userip, $dat_path = '') {
= Fcpath. 'Plugin/iPlock/QQwry/QQwry.dat'
// IP アドレスが有効かどうかを判断します。
(preg_match ("/^/9] 9] {1,3} $/", $ userip) == 0) {
Return 'IP アドレスが無効です'; ' ) ) {
「 IPデータファイルが存在しないか、アクセスが拒否されました'; useripNum = $userip[0] * 16777216 + $userip[1] * 65536 + $userip[2] * 256 + $userip[3];
useripNum = $userip[0] * 16777216 + $userip[ 1] * 65536 + $userip[2] * 256 + $userip[3];
$DataEnd = fread( $fd, 4 );
$useripbegin = implode( '', unpack( 'L' , $DataBegin ) );
if ( $useripbegin < 0 )
$useripbegin + = pow ( 2, 32 ); $useripAllNum = ($useripend - $useripbegin) / 7 + 1;
$BeginNum = 0;
$ endnum = $ useripallnum;
//バイナリ検索方法を使用して、インデックスレコードのIPアドレスレコードの一致を検索しますwhile($ userip1num&gt; $ useripnum || $ userip2num&lt; $ useripnum){
fd、$ useripbegin + 7 * $Middle ); return 'File Error';提}

// データが負の場合、プラス 2 32 倍のデータ変換増加
$ userip1num = Implode ('', unpack ('l' , $ useripdata1));
IF ($ Userip1num & lt; 0) $ $ Userip1num += POW (2, 32); // 抽出の抽出は IP アドレスの抽出より大きく、終了位置は次のサイクル用に変更されました
(($ userip1num & gt; $ useripnum) {
$ $ $ $ $ EndNum = $Middle;
_return 'file error'; {
( 1 ) ) {
implode ('', unpack ('l', $ useripseek. chr (0));
fseek ($ fd, $ useripseek); pflag == chr( 2 ) ) {
システムエラー';
}
$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 'システムエラー';
}
$AddrSeek2 = implode( '', Pack( 'L', $AddrSeek2 . chr( 0 ) ) );
fseek( $fd, $AddrSeek2 );
} else {
fseek( $fd, -1, SEEK_CUR );
}
while ( ($char = fread( $fd, 1 )) != 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 = 'データなし';
} elseif ( !$this->is_utf8( $useripaddr ) ) {
$useripaddr = iconv( 'GBK', 'UTF-8', $useripaddr );
}
return $useripaddr;
}

/**​​​​*/
プライベート関数 is_utf8( $string ) {
if ( preg_match( "/^([" . chr( 228 ) . "-" . chr( 233 ) . "]{1}[ " . chr( 128 ) . "-" . chr( 191 ) . "]{1}[" . chr( 128 ) . "-" . chr( 191 ) . "]{1}){1}/", $string ) == true || preg_match( "/([" . chr( 228 ) . "-" . chr( 233 ) . "]{1}[" . chr( 128 ) . "-" . chr( 191 ) . "]{1}[" 。 chr( 191 ) 。 $string ) == true || [" . chr( 228 ) . "-" . chr( 233 ) . "]{1}[" . chr( 128 ) . "-" . chr( 191 ) . "]{1}[" . chr( 128 )。
}



QQWry.Dat文件下載地址:http://xiazai.jb51.net/201311/yuanma/qqwry.dat(jb51.net).zip


使用演示:


复制代価

代価如下:


FCPATHを含めます。 'plugin/ipLocation/ipCity.class.php';

$city = new ipCity();

$addr = $city->getCity( '172.0.0.1' );

echo $addr; // echo 本地地址

http://www.bkjia.com/PHPjc/621713.html

www.bkjia.com

tru​​e
http://www.bkjia.com/PHPjc/621713.html

技術記事

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。