type ip_start ip_end country state city
ipv4 0.0.0.0 0255.255.255 US California Los Angeles
ipv4 1.0.0.0 1.0.0.255 AU Queensland Brisbane我有一个包含国家、州和城市ip列表的表。
我的问题是如何从我的数据库中检测用户的ip位置
如果我使用php $ip = $_SERVER["HTTP_CLIENT_IP"]; , HTTP_X_FORWARDED_FOR & REMOTE_ADDR来查找用户的ip。
如何使用这个变量从db?中找出哪个国家、州和城市
ip_start & ip_end是如何工作的?
例如。如果我的ip是$ip=123.243.51.83;
如何使用这个$ip从我的数据库中查找位置?
发布于 2013-08-13 12:41:26
IP地址可以转换为数字。您可以使用这个来找出ip在哪个范围内。
使用MySQL和INET_ATON
SELECT country FROM table WHERE
INET_ATON("123.243.51.83") BETWEEN INET_ATON(ip_start) AND INET_ATON(ip_end);使用PHP和ip2long
$yourIpLong = ip2long($yourIp);
if($yourIpLong > ip2long($ipStart) && $yourIpLong < ip2long($ipEnd)){
//IP is in range $ipStart -> $ipEnd
}else{
//IP is not in range.
}请注意,这两种解决方案都适用于IPv4。
发布于 2013-08-13 12:48:42
最好将IP地址存储在整数表示形式中。为此,您可以使用MySql函数阿顿。
在PHP中,您可以使用以下方法计算它:
$address = '174.36.207.186';
$addressArray = explode('.', $address);
$integerIp = ( 16777216 * $addressArray[0] )
+ ( 65536 * $addressArray[1] )
+ ( 256 * $addressArray[2] )
+ $addressArray[3];查询(如果您已将其存储为DB中的整数)将是:
SELECT *
FROM table
WHERE
".$integerIp." BETWEEN ip_start AND ip_end
LIMIT 1您也可以像Jim回答的那样直接在DB中进行转换,但是如果可以预先计算,为什么要让DB执行计算呢?
https://stackoverflow.com/questions/18208876
复制相似问题