1,ip数据数来源 纯真
点击右下的解压,获得ip数据的txt版本。
我们就是要把这个txt文本里的数据逐行导入到数据库
2,创建数据表
CREATE TABLE `ip_data` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`ipstart` int(10) unsigned NOT NULL COMMENT 'ip开始',
`ipend` int(10) unsigned NOT NULL COMMENT 'ip结束',
`region` varchar(512) NOT NULL COMMENT '地区',
`address` varchar(512) NOT NULL COMMENT '详细地址',
PRIMARY KEY (`id`),
KEY `ip` (`ipstart`,`ipend`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=527989 DEFAULT CHARSET=utf8 COMMENT='ip地址数据库';
3,把点格式的ip地址转换成整数表示的ip地址,数据库中存储的是ip整数 8-10位的int类型
使用下面的一个函数进行转换,查询的时候也要把ip先转换成整数再在数据库中使用 `ipstart`,`ipend` 两个字段匹配查询,
function EncodeIp($strDotquadIp) { // 把点格式的ip地址转换成整数表示的ip地址
$arrIpSep = explode('.', $strDotquadIp);
if (count($arrIpSep) != 4) return 0;
$intIp = 0;
foreach ($arrIpSep as $k => $v) $intIp += (int)$v * pow(256, 3 - $k);
return $intIp;
}
4,导入text文本到.sql文件,PHP代码
$arrLines = file("ip".".txt");
$intLen = 0;
$i = 1;
$resFile = fopen("ip".$i.".sql", "w");
foreach ($arrLines as $k => $strLine) {
//$strLine=iconv("gb2312","utf-8",$strLine);
$arrElements = explode(" ", addslashes($strLine));
$arrElements = array_values(array_filter($arrElements));
$intIpStart = EncodeIp($arrElements[0]);
$intIpEnd = EncodeIp($arrElements[1]);
$j = 3;
$strAddress = "";
while ($arrElements[$j]) {
$strAddress .= " ".$arrElements[$j];
$j++;
}
$strSql = "INSERT INTO ip_data (ipstart, ipend, region, address) VALUES (".$intIpStart.", ".$intIpEnd.", '".trim($arrElements[2])."', '".trim($strAddress)."');\r\n";
fwrite($resFile, $strSql);
$intLen += strlen($strSql);
if ($intLen > 20000000) { // 当正在写入的sql文件超过20M时结束当前文件而开始写入新的sql文件
fclose($resFile);
$resFile = fopen("ip".(++$i).".sql", "w");
$intLen = 0;
}
}
echo 'success';
exit();
5,将生成的4个.SQL文件导入到mysql数据库
结果
、、
如果你是个懒人请关注我,附件ip.zip下载