<?php
Class IpCity {
/**
* According to the IP address to obtain the corresponding city
* @param type $userip User IP address
* @return String
*/
Public Function getcity ($userip, $dat _path = ') {
IP database path, here is the QQ IP database 20110405 Pure version
Empty ($dat _path) && $dat _path = Fcpath. ' Plugin/iplocation/qqwry/qqwry.dat ';
Determine if the IP address is valid
if (Preg_match (/^) ([0-9]{1,3}.) {3} [0-9] {1,3}$/", $userip) = = 0) {
Return to ' IP address Invalid ';
}
Open IP Database
if (! $fd = @fopen ($dat _path, ' RB ')) {
Return ' IP data file not exists or access denied ';
}
The EXPLODE function decomposes the IP address, and the result of the integer form is calculated
$userip = Explode ('. ', $userip);
$useripNum = $userip [0] * 16777216 + $userip [1] * 65536 + $userip [2] * 256 + $userip [3];
Get IP Address index start and end locations
$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;
Search for matching IP address records from index records using the binary lookup method
while ($userip 1num > $useripNum | | $userip 2num < $useripNum) {
$Middle = Intval (($EndNum + $BeginNum)/2);
Offset pointer reads 4 bytes to index position
Fseek ($FD, $useripbegin + 7 * $Middle);
$useripData 1 = fread ($FD, 4);
if (strlen ($useripData 1) < 4) {
Fclose ($FD);
Return ' File Error ';
}
The extracted data is transformed and shaped, if the data is negative, plus 2 of the 32 power
$userip 1num = Implode (', Unpack (' L ', $useripData 1));
if ($userip 1num < 0)
$userip 1num + + POW (2, 32);
The number of long integers fetched is greater than our IP address to modify the end position for the next loop
if ($userip 1num > $useripNum) {
$EndNum = $Middle;
Continue
}
Remove an index after fetching the previous index
$DataSeek = Fread ($FD, 3);
if (strlen ($DataSeek) < 3) {
Fclose ($FD);
Return ' File Error ';
}
$DataSeek = Implode (', Unpack (' L ', $DataSeek. chr (0)));
Fseek ($FD, $DataSeek);
$useripData 2 = fread ($FD, 4);
if (strlen ($useripData 2) < 4) {
Fclose ($FD);
Return ' File Error ';
}
$userip 2num = Implode (', Unpack (' L ', $useripData 2));
if ($userip 2num < 0)
$userip 2num + + POW (2, 32);
Could not find IP address corresponding city
if ($userip 2num < $useripNum) {
if ($Middle = = $BeginNum) {
Fclose ($FD);
Return ' No Data ';
}
$BeginNum = $Middle;
}
}
$useripFlag = Fread ($FD, 1);
if ($useripFlag = = Chr (1)) {
$useripSeek = Fread ($FD, 3);
if (strlen ($useripSeek) < 3) {
Fclose ($FD);
Return ' System Error ';
}
$useripSeek = Implode (', Unpack (' L ', $useripSeek. chr (0)));
Fseek ($FD, $useripSeek);
$useripFlag = Fread ($FD, 1);
}
if ($useripFlag = = Chr (2)) {
$AddrSeek = Fread ($FD, 3);
if (strlen ($AddrSeek) < 3) {
Fclose ($FD);
Return ' System Error ';
}
$useripFlag = Fread ($FD, 1);
if ($useripFlag = = Chr (2)) {
$AddrSeek 2 = fread ($FD, 3);
if (strlen ($AddrSeek 2) < 3) {
Fclose ($FD);
Return ' System Error ';
}
$AddrSeek 2 = implode (', Unpack (' L ', $AddrSeek 2 chr (0)));
Fseek ($FD, $AddrSeek 2);
} else {
Fseek ($FD,-1, seek_cur);
}
while (($char = Fread ($FD, 1))!= chr (0))
$useripAddr 2. = $char;
$AddrSeek = Implode (', Unpack (' L ', $AddrSeek. chr (0)));
Fseek ($FD, $AddrSeek);
while (($char = Fread ($FD, 1))!= chr (0))
$useripAddr 1. = $char;
} else {
Fseek ($FD,-1, seek_cur);
while (($char = Fread ($FD, 1))!= chr (0))
$useripAddr 1. = $char;
$useripFlag = Fread ($FD, 1);
if ($useripFlag = = Chr (2)) {
$AddrSeek 2 = fread ($FD, 3);
if (strlen ($AddrSeek 2) < 3) {
Fclose ($FD);
Return ' System Error ';
}
$AddrSeek 2 = implode (', Unpack (' L ', $AddrSeek 2 chr (0)));
Fseek ($FD, $AddrSeek 2);
} else {
Fseek ($FD,-1, seek_cur);
}
while (($char = Fread ($FD, 1))!= chr (0)) {
$useripAddr 2. = $char;
}
}
Fclose ($FD);
Returns the city result of the IP address
if (Preg_match ('/http/i ', $useripAddr 2)) {
$useripAddr 2 = ';
}
$USERIPADDR = "$useripAddr 1 $useripAddr 2";
$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 = ' No Data ';
} elseif (! $this->is_utf8 ($useripaddr)) {
$USERIPADDR = Iconv (' GBK ', ' UTF-8 ', $useripaddr);
}
return $useripaddr;
}
/**
* To determine if I utf-8 encoded strings
* @param type $string
* @return Boolean
*/
Private Function 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 (128). "-" . Chr (191). "]{1}" {1}$/", $string) = = True | | Preg_match ("/[". Chr (228). "-" . Chr (233). "]{1}[". Chr (128). "-" . Chr (191). "]{1}[". Chr (128). "-" . Chr (191). ']{1} ' {2,}/', $string) = = True) {
return true;
} else {
return false;
}
}
}
QQWry.Dat File Download Address: Http://xiazai.jb51.net/201311/yuanma/qqwry.dat (jb51.net). zip