Php 从ip2location_db11数据库中查找ip

Php 从ip2location_db11数据库中查找ip,php,sql,Php,Sql,我使用ip2location_db11.CSV数据库查找详细的IP。它可以创建如下表: 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` DO

我使用ip2location_db11.CSV数据库查找详细的IP。它可以创建如下表:

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;
有了这些细节:

"16777216","16777471","AU","Australia","Queensland","Brisbane","-27.467940","153.028090","4000","+10:00"
cuz ip大列表所有ip位于两列中的ip范围(ip_-from,ip_-to)

如何在此表中查找我的ip?我知道这一点:

    $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范围内的ip查看示例数据,并根据ip的列类型判断,我认为ip已使用ip2long()转换为int,对于ipv4地址来说很好,但对于ipv6则不太好。因此,您的sql将需要考虑ip2long转换,并且php中有一些大数字的问题,因此我建议也使用sprintf

$ip = sprintf( '%u', ip2long( $_SERVER['REMOTE_ADDR'] ) );
$sql= 'select * from `ip2location_db11` where `ip_from` >= '.$ip.' and `ip_to` <= '.$ip.' limit 1;';
$ip=sprintf(“%u”,ip2long($\u服务器['REMOTE\u ADDR']);
$sql='从'ip2location\u db11'中选择*,其中'ip\u from`>='.$ip.'和'ip\u to`这是怎么回事:

$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
扩展已被弃用,并且不允许使用PDO 参数化查询

INET\u ATON(expr)
将IP地址转换为数值

$ip = $_SERVER['REMOTE_ADDR'];

SELECT *
FROM ip2location_db11
WHERE ip_from >= INET_ATON('$ip')
AND ip_top <= INET_ATON('$ip')
LIMIT 1
$ip=$\u服务器['REMOTE\u ADDR'];
挑选*
来自ip2location_db11
其中ip_from>=INET_ATON(“$ip”)

这是一个简单的查询

SELECT * FROM ip2location_db11 WHERE INET_ATON('xxx.xxx.xxx.xxx') BETWEEN ip_from AND ip_to