ip2addr($nowClientIP);
//更改为数据库查询
$tempIp = new IPfromeSql();
$ResultCountry = $tempIp -> getCountry($nowClientIP);
$locationShen = strpos($ResultCountry,"省");
$locationShi = strpos($ResultCountry,"市");
if ($locationShen){
$tempProvince = substr($ResultCountry,0,$locationShen);
if ($locationShi){
$tempCity = substr($ResultCountry,$locationShen+3,$locationShi-$locationShen-3);
}else{
//只有省或者没有“市”
if(substr($ResultCountry,$locationShen+3) !=""){
$tempCity = substr($ResultCountry,$locationShen+3);
}
}
}else{
if ($locationShi){
$tempProvince = substr($ResultCountry,0,$locationShi);
$tempCity = substr($ResultCountry,0,$locationShi);
}
if (strpos("=-=".$ResultCountry,"内蒙古")){
$tempProvince = "内蒙古";
if ($locationShi){
$tempCity = substr($ResultCountry,9,$locationShi-9);
}
}
for($i=0;$i<4;$i++){
$zizhiqu =strpos("=-=".$ResultCountry,$this->zizhiquList[$i]);
$locationShi = strpos($ResultCountry,"市");
if ($zizhiqu){
$tempProvince = $this->zizhiquList[$i];
if ($locationShi){
$tempCity = substr($ResultCountry,$zizhiqu+3,$locationShi-$zizhiqu-3);
}
}
}
}
if ($tempProvince == "无" && $tempProvince == "无"){
if($locationShen){$tempProvince = $tempCountry;}else{$tempProvince = "无";}
}
$this->Province = $tempProvince;
$this->City = $tempCity;
// echo '
',$tempProvince;
// echo '
',$tempCity,'
';
}
}
class IPfromeSql{
function getCountry($ip){
// if(!$this -> checkIp($ip)){
// return false;
// }
$ipNumber = ip2long($ip);
//当ip地址比较大时,ip2long会出现负数-----32位机器
if($ipNumber < 0){
$ipNumber = sprintf("%u",ip2long($ip));
}
//连接数据库--在iptable表中查询
$link = mysql_connect('localhost:3306','root','bjdd2015');
if (!$link) {
die(iconv("GB2312","UTF-8",'连接服务器失败:'."
"). mysql_error());
}
mysql_query("set names 'utf8'");
mysql_select_db("door", $link);
//$query = "SELECT * FROM `iptable` WHERE `StartIPNum` <= '$ipNumber' ORDER BY `StartIPNum` DESC limit 1";
$query = "SELECT `Country` FROM `iptable` WHERE `ID`=(SELECT `ID` FROM `iptable` WHERE `StartIPNum` > '$ipNumber' limit 1)-1";
$result = mysql_query($query);
$temparry = mysql_fetch_array($result);
$ResultCountry = $temparry['Country'];
return $ResultCountry;
}
//检查IP合法性
function checkIp($ip) {
$arr = explode('.',$ip);
if(count($arr) !=4 ) {
return false;
} else {
for ($i=0; $i < 4; $i++) {
if ($arr[$i] <'0' || $arr[$i] > '255') {
return false;
}
}
}
return true;
}
}
class ip {
var $fh; //IP数据库文件句柄
var $first; //第一条索引
var $last; //最后一条索引
var $total; //索引总数
//构造函数
function __construct() {
$this->fh = fopen('qqwry.dat', 'rb'); //qqwry.dat文件
$this->first = $this->getLong4();
$this->last = $this->getLong4();
$this->total = ($this->last - $this->first) / 7; //每条索引7字节
}
//检查IP合法性
function checkIp($ip) {
$arr = explode('.',$ip);
if(count($arr) !=4 ) {
return false;
} else {
for ($i=0; $i < 4; $i++) {
if ($arr[$i] <'0' || $arr[$i] > '255') {
return false;
}
}
}
return true;
}
function getLong4() {
//读取little-endian编码的4个字节转化为长整型数
$result = unpack('Vlong', fread($this->fh, 4));
return $result['long'];
}
function getLong3() {
//读取little-endian编码的3个字节转化为长整型数
$result = unpack('Vlong', fread($this->fh, 3).chr(0));
return $result['long'];
}
//查询信息
function getInfo($data = "") {
$char = fread($this->fh, 1);
while (ord($char) != 0) { //国家地区信息以0结束
$data .= $char;
$char = fread($this->fh, 1);
}
return $data;
}
//查询地区信息
function getArea() {
$byte = fread($this->fh, 1); //标志字节
switch (ord($byte)) {
case 0: $area = ''; break; //没有地区信息
case 1: //地区被重定向
fseek($this->fh, $this->getLong3());
$area = $this->getInfo(); break;
case 2: //地区被重定向
fseek($this->fh, $this->getLong3());
$area = $this->getInfo(); break;
default: $area = $this->getInfo($byte); break; //地区没有被重定向
}
return $area;
}
function ip2addr($ip) {
if(!$this -> checkIp($ip)){
return false;
}
$ip = pack('N', intval(ip2long($ip)));
//二分查找
$l = 0;
$r = $this->total;
while($l <= $r) {
$m = floor(($l + $r) / 2); //计算中间索引
fseek($this->fh, $this->first + $m * 7);
$beginip = strrev(fread($this->fh, 4)); //中间索引的开始IP地址
fseek($this->fh, $this->getLong3());
$endip = strrev(fread($this->fh, 4)); //中间索引的结束IP地址
if ($ip < $beginip) { //用户的IP小于中间索引的开始IP地址时
$r = $m - 1;
} else {
if ($ip > $endip) { //用户的IP大于中间索引的结束IP地址时
$l = $m + 1;
} else { //用户IP在中间索引的IP范围内时
$findip = $this->first + $m * 7;
break;
}
}
}
//查询国家地区信息
fseek($this->fh, $findip);
$location['beginip'] = long2ip($this->getLong4()); //用户IP所在范围的开始地址
$offset = $this->getlong3();
fseek($this->fh, $offset);
$location['endip'] = long2ip($this->getLong4()); //用户IP所在范围的结束地址
$byte = fread($this->fh, 1); //标志字节
switch (ord($byte)) {
case 1: //国家和区域信息都被重定向
$countryOffset = $this->getLong3(); //重定向地址
fseek($this->fh, $countryOffset);
$byte = fread($this->fh, 1); //标志字节
switch (ord($byte)) {
case 2: //国家信息被二次重定向
fseek($this->fh, $this->getLong3());
$location['country'] = $this->getInfo();
fseek($this->fh, $countryOffset + 4);
$location['area'] = $this->getArea();
break;
default: //国家信息没有被二次重定向
$location['country'] = $this->getInfo($byte);
$location['area'] = $this->getArea();
break;
}
break;
case 2: //国家信息被重定向
fseek($this->fh, $this->getLong3());
$location['country'] = $this->getInfo();
fseek($this->fh, $offset + 8);
$location['area'] = $this->getArea();
break;
default: //国家信息没有被重定向
$location['country'] = $this->getInfo($byte);
$location['area'] = $this->getArea();
break;
}
//gb2312 to utf-8(去除无信息时显示的CZ88.NET)
foreach ($location as $k => $v) {
$location[$k] = str_replace('CZ88.NET','',iconv('gb2312', 'utf-8', $v));
}
return $location;
}
//析构函数
function __destruct() {
fclose($this->fh);
}
}
class getIP {
public $proListIP = array("1.0","60.4","61.153","61.235","110.104","123.136","183.95","199.68","211.10","218.12","218.60","218.92","219.153","221.131","222.89","255.255");
//16组
function getLocation($NowIP){
$NowIPArray = explode('.', $NowIP);
if (count($NowIPArray) != 4){
return "IP格式出错";
}
$willCheckNumber = getIP::getCheckNumber($NowIP);
if (count($willCheckNumber) > 1){
for ($i = 0; $i < count($willCheckNumber); $i++) {
echo "$i:".$willCheckNumber[$i].'
';
}
}else{
echo $willCheckNumber;
}
//$NowIPArray[0]
return 0;
}
function getLocationFormMysql($NowIP){
}
function getCheckNumber($NowIP){
$NowIPArray = explode('.', $NowIP);
$MAXInt = 15;
for ($i = 0; $i < $MAXInt; $i++) {
$NowProListIPArray0 = explode('.', $this->proListIP[$i]);
$NowProListIPArray1 = explode('.', $this->proListIP[$i+1]);
if($NowIPArray[0] == $NowProListIPArray0[0]){
if($NowIPArray[1] == $NowProListIPArray0[1]){
if ($i == 0){
$willCheckNumber = $i;return $willCheckNumber;
}
$willCheckNumber = array($i,$i-1);return $willCheckNumber;
}else{
$willCheckNumber[] = $i;
}
if($NowIPArray[1] > $NowProListIPArray0[1] && $NowIPArray[1] < $NowProListIPArray1[1]){
$willCheckNumber = $i;return $willCheckNumber;
}
//IP第一位和I0第一位相等时,最后才写如果,IP第一位小于I1第一位。那么返回值
if($NowIPArray[0] < $NowProListIPArray1[0]){
$willCheckNumber = $i;return $willCheckNumber;
}
}
if($NowIPArray[0] == $NowProListIPArray1[0]){
if($NowIPArray[1] == $NowProListIPArray1[1]){
if ($i == 15){
$willCheckNumber = $i;return $willCheckNumber;
}
$willCheckNumber = array($i,$i+1);return $willCheckNumber;
}else{
$willCheckNumber[] = $i;
}
}
if($NowIPArray[0] > $NowProListIPArray0[0] && $NowIPArray[0] < $NowProListIPArray1[0]){
$willCheckNumber = $i;return $willCheckNumber;
}
}
}
function clientIP(){
$cIP = getenv('REMOTE_ADDR');
$cIP1 = getenv('HTTP_X_FORWARDED_FOR');
$cIP2 = getenv('HTTP_CLIENT_IP');
$cIP1 ? $cIP = $cIP1 : null;
$cIP2 ? $cIP = $cIP2 : null;
return $cIP;
}
function serverIP(){
return gethostbyname($_SERVER["SERVER_NAME"]);
}
}
?>