Php 如何使用ip start&;ip端查找位置

Php 如何使用ip start&;ip端查找位置,php,ip,Php,Ip,我有一个包含国家、州和城市ip列表的表格 我的问题是如何从数据库中检测用户的ip位置 如果我使用php$ip=$\u SERVER[“HTTP\u CLIENT\u ip”],HTTP_X_转发_FOR&REMOTE_ADDR以查找用户的ip 如何使用此变量从数据库中找出哪个国家、州和城市? ip\u如何开始和结束工作? 例如,如果我的ip是$ip=123.243.51.83 如何使用此$ip从数据库中查找位置?ip地址可以转换为数字。您可以使用它来确定ip在哪个范围内 使用MySQL和INET

我有一个包含国家、州和城市ip列表的表格

我的问题是如何从数据库中检测用户的ip位置

如果我使用php
$ip=$\u SERVER[“HTTP\u CLIENT\u ip”],HTTP_X_转发_FOR&REMOTE_ADDR
以查找用户的ip

如何使用此变量从数据库中找出哪个国家、州和城市?

ip\u如何开始和结束工作?

例如,如果我的ip是
$ip=123.243.51.83


如何使用此$ip从数据库中查找位置?

ip地址可以转换为数字。您可以使用它来确定ip在哪个范围内

使用MySQL和
INET\u ATON

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
使用PHP和
ip2long

SELECT country FROM table WHERE 
INET_ATON("123.243.51.83") BETWEEN INET_ATON(ip_start) AND INET_ATON(ip_end);
$yourIpLong=ip2long($yourIp);
如果($yourIpLong>ip2long($ipStart)&&$yourIpLong$ipEnd
}否则{
//IP不在范围内。
}

请注意,这两种解决方案都适用于IPv4。

如果以整数表示形式存储IP地址,效果会更好。您可以使用MySql函数来实现这一点

在PHP中,您可以使用以下公式计算:

$yourIpLong = ip2long($yourIp);
if($yourIpLong > ip2long($ipStart) && $yourIpLong < ip2long($ipEnd)){
     //IP is in range $ipStart -> $ipEnd
}else{
    //IP is not in range.
}
查询(如果以整数形式存储在DB中)将是:

$address = '174.36.207.186';

$addressArray = explode('.', $address);

$integerIp =   ( 16777216 * $addressArray[0] )
             + (    65536 * $addressArray[1] )
             + (      256 * $addressArray[2] )
             +              $addressArray[3];

您也可以像Jim回答的那样直接在DB中进行转换,但是如果您可以预计算,为什么要让DB进行计算呢?

所以ip start&ip end是范围?例如,开始-1结束-5比4在这个范围内6不会吗?@BenWong更正,在您的示例中123.243.51.83转换为介于125.0.0.0和100.0.0.0之间的数字为什么125.0.0.0-100.0.0.0?为什么不是124.0.0.0-125.0.0.0?抱歉,应该是100.0.0.0和125.0.0.0。在morment i存储ipv4和ipv6 int(10)时,它也在124.0.0.0和125.0.0.0.0之间(以及123.243.51.82和123.243.51.84之间)同时,我尝试将此列转换为ip_start_longs,因此我必须转换数据库中的所有ip_start和ip_end?是的,我建议创建两个新的整数字段
ip_start_num
ip_end_num
,并使用
更新表集ip_start_num=INET_ATON(ip_start),ip_end_num=INET_ATON(ip_end)
我的数据库有300多万行,哈哈,我想我需要3到4天的时间来更新。这正是我要预计算它的原因。您只需运行一次更新。让我先进行查询,看看它运行得有多快,以后可能会更新
SELECT *
FROM table
WHERE
".$integerIp." BETWEEN ip_start AND ip_end
LIMIT 1