我在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
的公式答案 0 :(得分:3)
您可以对指定的表使用以下SQL查询:
SELECT `country_iso2` FROM `countryip` WHERE `ip_from` <= inet_aton('$ip') AND ip_to >= inet_aton('$ip')
这将为您指定的IP地址选择两个字符的国家/地区ISO代码。从这里开始,只需将ISO代码与禁止的国家代码表中的条目进行比较即可。
答案 1 :(得分:1)
我知道这不是你问题的直接答案,但我最近使用了这个API;
http://ipinfodb.com/ip_location_api_json.php
使用JSON非常容易,也可以从服务器快速回复。它是免费的,试一试,可以节省数据库中的一些存储空间。
答案 2 :(得分:1)
不是问题的直接答案,但是根据我的经验,自己维护IP数据库有点麻烦。
我已经使用了MaxMind免费的GeoLite2数据库,因为它经常更新并提供非常精确的结果:
答案 3 :(得分:0)
如果您对performance感到担忧,我建议您使用PHP Extension API。使用PHP(C API)扩展,您每秒可以获得超过700万次查询。 MySQL没有针对这些类型的查询进行调整,并且通过SQL管理不断变化的IP地址更新可能会成为一个难点。 Maxmind发布您可以轻松下载的每月更新。
我将介绍如何编译扩展,以及如何使用PHP中的mmdb数据库通过iso-3316双字符代码限制国家/地区:
Intro to Maxmind GeoLite2 with Kohana PHP