? /* Function Name: ipCity Parameter description: $userip--User IP address Function: PHP to determine the user's city by IP address Author:lee Contact:xpsem2010@gmail.com */ function IpCity ($userip) { IP database path, here is the QQ IP database 20110405 Pure version $dat _path = ' QQWry.dat '; Determine if the IP address is valid if (!ereg ("^ [0-9]{1,3}.) {3} [0-9] {1,3}$ ", $userip)) { 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 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 conversion growth shaping, if the data is negative then add 2 32 power $userip 1num = Implode (', Unpack (' L ', $useripData 1)); if ($userip 1num < 0) $userip 1num + + POW (2); 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); //No IP address found for City if ($ Userip2num < $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 '; } return $useripaddr; } ?> |