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。
如何使用此变量找出哪个国家/地区,州和我的数据库中的城市?
如何ip_start& ip_end工作?
离。如果我的IP是$ip=123.243.51.83;
如何使用此$ ip从我的数据库中查找位置?
答案 0 :(得分:1)
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。
答案 1 :(得分:1)
如果以整数表示形式存储IP地址会更好。您可以使用MySql函数INET_ATON。
在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回答的那样,但为什么让数据库进行计算,如果你可以预先计算它呢?