Php query IP location (dat database)-If someone shares a pure IP database, share a classic query using a pure IP database, I believe many people have seen or even used this code. But you may not know that this code is actually changed from a pecl c ++ code. PHP code
/* ++ Program name: IP resolution program function: QQ-based binary database QQWry. dat program author: strongc usage method: Please file QQWry. dat is placed in the current directory or you can modify define ('_ QQWRY _', dirname (_ FILE __). ". \ QQWry. dat "); statement custom QQWry. dat path # instance ++ $ ip = "202.201.48.1 "; $ QQWry = new QQWry; $ ifErr = $ QQWry-> QQWry ($ ip); echo "$ QQWry-> Country $ QQWry-> Local "; ++ */define ('_ QQWRY __', dirname (_ FILE __).". \ QQWry. dat "); class QQWry {var $ StartIP = 0; var $ EndIP = 0; var $ Country =''; var $ Local = ''; var $ CountryFlag = 0; // identify the Country position // 0x01, followed by a Country offset of 3 bytes without Local // 0x02, followed by a Country offset of 3 bytes, followed by Local // others, country, Local, and Local have similar compression. Multiple references are allowed. Var $ fp; var $ FirstStartIp = 0; var $ LastStartIp = 0; var $ EndIpOff = 0; function getStartIp ($ RecNo) {$ offset = $ this-> FirstStartIp + $ RecNo * 7; @ fseek ($ this-> fp, $ offset, SEEK_SET ); $ buf = fread ($ this-> fp, 7); $ this-> EndIpOff = ord ($ buf [4]) + (ord ($ buf [5]) * 256) + (ord ($ buf [6]) * 256*256); $ this-> StartIp = ord ($ buf [0]) + (ord ($ buf [1]) * 256) + (ord ($ buf [2]) * 256*256) + (ord ($ buf [3]) * 256*256*25 6); return $ this-> StartIp;} function getEndIp () {@ fseek ($ this-> fp, $ this-> EndIpOff, SEEK_SET ); $ buf = fread ($ this-> fp, 5); $ this-> EndIp = ord ($ buf [0]) + (ord ($ buf [1]) * 256) + (ord ($ buf [2]) * 256*256) + (ord ($ buf [3]) * 256*256*256 ); $ this-> CountryFlag = ord ($ buf [4]); return $ this-> EndIp;} function getCountry () {switch ($ this-> CountryFlag) {case 1: case 2: $ this-> Country = $ this-> getFlagStr ($ this-> EndIp Off + 4); $ this-> Local = (1 = $ this-> CountryFlag )? '': $ This-> getFlagStr ($ this-> EndIpOff + 8); break; default: $ this-> Country = $ this-> getFlagStr ($ this-> EndIpOff + 4 ); $ this-> Local = $ this-> getFlagStr (ftell ($ this-> fp) ;}} function getFlagStr ($ offset) {$ flag = 0; while (1) {@ fseek ($ this-> fp, $ offset, SEEK_SET); $ flag = ord (fgetc ($ this-> fp )); if ($ flag = 1 | $ flag = 2) {$ buf = fread ($ this-> fp, 3); if ($ flag = 2) {$ this-> CountryFlag = 2; $ this-> EndIpOff = $ Offset-4;} $ offset = ord ($ buf [0]) + (ord ($ buf [1]) * 256) + (ord ($ buf [2]) * 256*256);} elsebreak;} if ($ offset <12) return ''; @ fseek ($ this-> fp, $ offset, SEEK_SET ); return $ this-> getStr ();} function getStr () {$ str = ''; while (1) {$ c = fgetc ($ this-> fp ); if (ord ($ c [0]) = 0) break; $ str. = $ c;} return $ str;} function QQwry ($ dotip = '') {if (! $ Dotip) return; if (ereg ("^ (127)", $ dotip) {$ this-> Country = 'local network'; return ;} else if (ereg ("^ (192)", $ dotip) {$ this-> Country = 'Lan '; return ;}$ nRet; $ ip = $ this-> IpToInt ($ dotip); $ this-> fp = fopen (_ QQWRY __, "rb "); if ($ this-> fp = NULL) {$ szLocal = "OpenFileError"; return 1 ;}@ fseek ($ this-> fp, 0, SEEK_SET ); $ buf = fread ($ this-> fp, 8); $ this-> FirstStartIp = ord ($ buf [0]) + (ord ($ buf [1]) * 256) + (ord ($ buf [2]) * 256*256) + (ord ($ buf [3]) * 256*256*256 ); $ this-> LastStartIp = ord ($ buf [4]) + (ord ($ buf [5]) * 256) + (ord ($ buf [6]) * 256*256) + (ord ($ buf [7]) * 256*256*256 ); $ RecordCount = floor ($ this-> LastStartIp-$ this-> FirstStartIp)/7); if ($ RecordCount Country = "FileDataError "; fclose ($ this-> fp); return 2 ;}$ RangB = 0; $ RangE = $ RecordCount; // Match... while ($ RangB <$ RangE-1) {$ RecNo = floor ($ RangB + $ RangE)/2); $ this-> getStartIp ($ RecNo ); if ($ ip = $ this-> StartIp) {$ RangB = $ RecNo; break;} if ($ ip> $ this-> StartIp) $ RangB = $ RecNo; else $ RangE = $ RecNo;} $ this-> getStartIp ($ RangB); $ this-> getEndIp (); if ($ this-> StartIp EndIp >=$ ip) {$ this-> getCountry ();} else {$ this-> Country = 'unknown '; $ this-> Local = '';} fclose ($ this-> fp);} function IpToInt ($ Ip) {$ array = explode ('. ', $ Ip); $ Int = ($ array [0] * 256*256*256) + ($ array [1] * 256*256) + ($ array [2] * 256) + $ array [3]; return $ Int ;}}
2.
[Code][PHP] code
$ Ip = "202.201.48.1"; $ QQWry = new QQWry; $ ifErr = $ QQWry-> QQWry ($ ip); echo $ ip. "$ QQWry-> Country $ QQWry-> Local \ n";/* result: 202.201.48.1 Northwest Normal University of Lanzhou, Gansu province */