View Single Post
  #1 (permalink)  
Old 06-29-2007, 02:17 PM
Humous Humous is offline
Member
 
Join Date: May 2007
Posts: 42
iTrader: 0 / 0%
Thanks: 0
Thanked 0 Times in 0 Posts
Nominated 0 Times in 0 Posts
TOTW/F/M Award(s): 0
Humous is on a distinguished road
Default Geo IP - User location lookup

I've just spent a little time setting up a trial for Geo IPLite to resolve users IP addresses to Country, seeing as you've all been nice and posted things like this here I thought I would too.

I've ran my demo from a Linux apache server running MySQL, I am currently using Perl but have also tested using PHP.

1st off download the CSV data from here and import the data into your database, I found the instructions here to be full and complete for my purposes (I would rewrite it here but it's that good).

Not wanting to install their APIs I set about utilizing the data from Perl, the biggest problem is that the GeoIP lists ip addresses as "ip strings" (which is a term I hadn't come across before).

The IP string is a concatination of the 4 (8bit) binary IP blocks converted to decimal. So as a quick example 192.168.1.0 becomes 3215458560.

I believe the PHP for getting the user IP address/string is
PHP Code:
$ipstring=ip2long($_SERVER);['REMOTE_ADDR'
I couldn't find a perl function so wrote one
Code:
$ipstring=ipstring($ENV{'REMOTE_ADDR'});

sub ipstring
{
	my ($numip) = @_;
	
	my($w,$null,$x,$null,$y,$null,$z,$null)=split /([.])/,$numip;
	
	$numw = substr(unpack("B*", pack("N", $w)),24,8);
	$numx = substr(unpack("B*", pack("N", $x)),24,8);
	$numy = substr(unpack("B*", pack("N", $y)),24,8);
	$numz = substr(unpack("B*", pack("N", $z)),24,8);
	
	$comb="$numw$numx$numy$numz";

	$decval = unpack("N", pack("B32", substr($comb, -32)));
	return $decval;
}
Then use that number in the following SQL query

Code:
select cc.ci,cc.cn from ip,cc where ip.start < "$ipstring" AND ip.end > "$ipstring" AND ip.ci=cc.ci
Hopefully that will get you going.

Humous
Reply With Quote