Php 如何使用ip start&;ip端查找位置
我有一个包含国家、州和城市ip列表的表格 我的问题是如何从数据库中检测用户的ip位置 如果我使用phpPhp 如何使用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=$\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