首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ip2location_db11数据库中查找ip

从ip2location_db11数据库中查找ip
EN

Stack Overflow用户
提问于 2015-08-01 16:50:14
回答 4查看 428关注 0票数 3

我使用ip2location_db11.CSV数据库查找详细的ips。它创建一个如下表:

代码语言:javascript
复制
CREATE TABLE `ip2location_db11`(
`ip_from` INT(10) UNSIGNED,
`ip_to` INT(10) UNSIGNED,
`country_code` CHAR(2),
`country_name` VARCHAR(64),
`region_name` VARCHAR(128),
`city_name` VARCHAR(128),
`latitude` DOUBLE,
`longitude` DOUBLE,
`zip_code` VARCHAR(30),
`time_zone` VARCHAR(8),
INDEX `idx_ip_from` (`ip_from`),
INDEX `idx_ip_to` (`ip_to`),
INDEX `idx_ip_from_to` (`ip_from`, `ip_to`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

有了这些细节:

代码语言:javascript
复制
"16777216","16777471","AU","Australia","Queensland","Brisbane","-27.467940","153.028090","4000","+10:00"

因为ips所有ip的大列表都位于2列的ip范围内(ip_from,ip_to)

怎么从这张桌子上找到我的ip?我知道这一点:

代码语言:javascript
复制
    $result = mysql_query("SELECT *
                      FROM ip2location_db11
                      WHERE ip = {$_SERVER['REMOTE_ADDR']}
                      LIMIT 1") or die(mysql_error());

    $row = mysql_fetch_assoc($result);

但是如何在列(ip_from,ip_to)中从这个ip范围中找到我的ips

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-08-01 17:07:02

查看示例数据,并根据ip的列类型判断,我会说ip已被转换为int,使用ip2long() ~ ipv4地址,而不是ipv4地址,我认为这对ipv6不太好。因此,您的sql将需要说明ip2long转换,并且php中有一个有大量数字的小问题,所以我建议也使用sprintf。

代码语言:javascript
复制
$ip = sprintf( '%u', ip2long( $_SERVER['REMOTE_ADDR'] ) );
$sql= 'select * from `ip2location_db11` where `ip_from` >= '.$ip.' and `ip_to` <= '.$ip.' limit 1;';
票数 0
EN

Stack Overflow用户

发布于 2017-04-13 14:01:07

下面是简单的查询

代码语言:javascript
复制
SELECT * FROM ip2location_db11 WHERE INET_ATON('xxx.xxx.xxx.xxx') BETWEEN ip_from AND ip_to
票数 1
EN

Stack Overflow用户

发布于 2015-08-01 17:08:44

这是怎么回事

代码语言:javascript
复制
$db = new PDO( "mysql:dbname=$dbname", $user, $pass, array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
) );
$sth = $db->prepare("
    SELECT *
    FROM ip2location_db11
    WHERE ? BETWEEN ip_from AND ip_to
    LIMIT 1
" );

$sth->execute( array( 
    array_reduce(
        explode(".", $_SERVER['REMOTE_ADDR'] ),
        function($carry,$in) { return ($carry *256) + intval( $in);}
    )
) );

$row = $sth->fetch( \PDO::FETCH_ASSOC );

我在这里使用PDO,因为mysql扩展是不推荐的,并且不允许参数化查询。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31763965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档