File directory:
Iplocation
-----Qqwry
----------QQWry.Dat
-----ipCity.class.php
ipCity.class.php File Code:
Copy the Code code as follows:
Class IpCity {
/**
* Obtain the corresponding city according to the IP address
* @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 ' 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 integer result is computed.
$userip = Explode ('. ', $userip);
$useripNum = $userip [0] * 16777216 + $userip [1] * 65536 + $userip [2] * + + $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 to index position read 4 bytes
Fseek ($FD, $useripbegin + 7 * $Middle);
$useripData 1 = fread ($FD, 4);
if (strlen ($useripData 1) < 4) {
Fclose ($FD);
Return ' File Error ';
}
Extracted data transformation growth shaping, if the data is negative, plus 2 of the power of 32
$userip 1num = Implode (', Unpack (' L ', $useripData 1));
if ($userip 1num < 0)
$userip 1num + = POW (2, 32);
Extract the number of long integers greater than our IP address then modify the end position for the next loop
if ($userip 1num > $useripNum) {
$EndNum = $Middle;
Continue
}
Remove an index after the last index is taken
$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);
IP address not found for the 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 for 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 string
* @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.php.net/201311/yuanma/qqwry.dat (php.net). zip
Use Demo:
Copy the Code code as follows:
Include Fcpath. ' plugin/iplocation/ipcity.class.php ';
$city = new IpCity ();
$ADDR = $city->getcity (' 172.0.0.1 ');
Echo $addr; Echo Local Address