When I’ve got a nasty case of insomnia, such as the current time, I like to browse the web and work on small projects – nothing to get me too engrossed, but still, enough to be useful, and have something functional by when I finally slumber.
As previously mentioned, I usually give David Grant’s QuickBlog a view to see what he’s been up to.
I was a bit suprised to see his rehashing of a rather frightful get_ip() function which was trivially re-encoded for PHP4’s superglobals, yet still had fallback code for PHP3.
The biggest problem is, you can’t trust the data given to you from anyone. Especally when it’s a variable in PHP! Thankfully, the $_SERVER superglobals make it a bit more functional, but I still don’t trust them. I’ve rewritten his get_ip function:
= 167772160) && ($lrealip <= 184549375))
|| (($lrealip >= -1408237568) && ($lrealip <= -1407188993))
|| (($lrealip >= -1062731776) && ($lrealip <= -1062666241))
|| ($lrealip == 2130706433)) {
$realip = “local”;
}
return $realip;
}
}
}
}
?>
As you can see, the function is a bit quirky that it returns alphanumeric text; I’ve written this to be a ‘poor man’s catch-all’. It will return the data of “local” for a local subnet, “unknown” if it isn’t sure, or the IP of the host.
“But Shawn,” you may inquire, “how do I know if it’s an IP or not?”
Ah, good question! I’ve even got it within the code itself! Here’s a sample snippit that decides if the data is a dotted quad, or plaintext. I’ve tried to break everything down and keep it simple. This demonstration merely attempts to find an IP address and log it to a MySQL database logging a “visitor”. About ten more lines of code and a
...
$testip = get_host_ip();
if (preg_match(”/^(\d+\.\d+\.\d+\.\d+)$/”, $testip)) {
// Returned data matches dotted quad, let’s try to get the host name.
// the @ is to suppress any errors, if our lookup fails, it’ll fall back to the IP.
@$testip = gethostbyaddr($testip);
}
// Let’s log the result into our database
$result = mysql_query(“INSERT INTO visitors (id, hostname) VALUES (\\’\\’, $testip)”);
...