4

我在MYSQL中有下表

CREATE TABLE IF NOT EXISTS `countryip` (
`ip_from` bigint(10) unsigned NOT NULL DEFAULT '0',
`ip_to` bigint(10) unsigned NOT NULL DEFAULT '0',
`country_iso2` varchar(2) COLLATE utf8_bin NOT NULL DEFAULT '',
`country_iso3` varchar(3) COLLATE utf8_bin NOT NULL DEFAULT '',
`country_name` varchar(32) COLLATE utf8_bin NOT NULL,
KEY `ip_from` (`ip_from`,`ip_to`)) 
ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

在这里,我添加了世界上所有国家的整个 IP 范围。

我想在 php 中创建一个脚本,将用户 ip 与该数据库中的 ip 范围进行比较,然后回显一条消息。从我不明白的开始,我需要先声明

<?php
    mysql_select_db("database_name")   or die(mysql_error());
$ip = $_SERVER['REMOTE_ADDR'];
    $query = mysql_query("SELECT `IP` FROM `ban_ip` WHERE `IP` = '$ip'"); // this works only if i have the single static ip in the dbs, but now i have the ip range
    if (mysql_num_rows($query) > 0)
    {
echo ' <!DOCTYPE html> <html> <head> <script type="text/javascript"> alert("You are not allowed to access this website"); window.location.replace("index.php"); </script> </head> <body> </body> </html>';
    }

我能做什么来代替这个查询

$query = mysql_query("SELECT `column` FROM `table` WHERE `column` = '$ip'");

为了使用户IP和IP范围之间的比较成为可能。

IP FROM 列,TO IP 列看起来像这样 16777216, 16777471,为了找出 ip,有一个类似于 ip = 256 + CLASS B * 256 + CLASS C * 256 * 256 + CLASS D * 256 * 的公式256 * 256

4

4 回答 4

3

您可以对您指定的表使用以下 SQL 查询:

SELECT `country_iso2` FROM `countryip` WHERE `ip_from` <= inet_aton('$ip') AND ip_to >= inet_aton('$ip')

这将为您指定的 IP 地址选择两个字符的国家 ISO 代码。从这里开始,只需将 ISO 代码与禁止国家代码表中的条目进行比较即可。

于 2013-09-19T13:34:34.123 回答
1

我知道这不是您问题的直接答案,但我最近使用了这个 API;

http://ipinfodb.com/ip_location_api_json.php

非常容易与 JSON 一起使用,并且服务器也可以快速回复。它是免费的,试试看,会为您节省一些数据库存储空间。

于 2013-09-19T13:29:07.943 回答
1

不是这个问题的直接答案,但根据我的经验,自己维护 IP 数据库有点麻烦。

我为此使用了 MaxMind 的免费 G​​eoLite2 数据库,因为它经常更新并提供非常精确的结果:

https://github.com/maxmind/GeoIP2-php

于 2013-09-19T14:08:40.803 回答
0

如果您完全关心性能,我建议您使用 PHP 扩展 API 。使用 PHP (C API) 扩展,您每秒可以获得超过 700 万次查询。MySQL 没有针对这些类型的查询进行调整,并且通过 SQL 管理不断变化的 IP 地址更新可能成为一个痛点。Maxmind 每月发布更新,您可以轻松下载这些更新。

我在这里描述了如何编译扩展,以及如何使用 PHP 中的 mmdb 数据库通过 iso-3316 2 字符代码限制国家/地区:

使用 Kohana PHP 介绍 Maxmind GeoLite2

地理定位 IP 地址

于 2014-03-10T21:59:26.517 回答