文件目录:
ipLocation
-----qqwry
----------QQWry.Dat
-----ipCity.class.php
ipCity.class.php文件代码:
代码如下:
<?php
class ipCity {
/**
* 根据ip地址获取对应所在城市
* @param type $userip 用户IP地址
* @return string
*/
public function getCity( $userip, $dat_path = '' ) {
//IP数据库路径,这里用的是QQ IP数据库 20110405 纯真版
empty( $dat_path ) && $dat_path = FCPATH . 'plugin/ipLocation/qqwry/QQWry.Dat';
//判断IP地址是否有效
if ( preg_match( "/^([0-9]{1,3}.){3}[0-9]{1,3}$/", $userip ) == 0 ) {
return 'IP Address Invalid';
}
//打开IP数据库
if ( !$fd = @fopen( $dat_path, 'rb' ) ) {
return 'IP data file not exists or access denied';
}
//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地址记录
while ( $userip1num > $useripNum || $userip2num < $useripNum ) {
$Middle = intval( ($EndNum + $BeginNum) / 2 );
新闻热点
疑难解答