我使用ip2location_db11.CSV数据库查找详细的ips。它创建一个如下表:
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"因为ips所有ip的大列表都位于2列的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范围中找到我的ips
发布于 2015-08-01 17:07:02
查看示例数据,并根据ip的列类型判断,我会说ip已被转换为int,使用ip2long() ~ ipv4地址,而不是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;';发布于 2017-04-13 14:01:07
下面是简单的查询
SELECT * FROM ip2location_db11 WHERE INET_ATON('xxx.xxx.xxx.xxx') BETWEEN ip_from AND ip_to发布于 2015-08-01 17:08:44
这是怎么回事
$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扩展是不推荐的,并且不允许参数化查询。
https://stackoverflow.com/questions/31763965
复制相似问题