当前位置:编程学习 > php >>

php,根据IP切换城市代码问题

现在的代码:<?php
include('config.php');
$g_ip=$_SERVER['REMOTE_ADDR'];
preg_match('/^(\d{1,3}\.\d{1,3})/',$g_ip,$IP);
$r=mysql_query("SELECT `webroot` FROM `IP_Address` WHERE `IP1` LIKE '$IP[0]%' OR `IP2` LIKE '$IP[0]%' LIMIT 1",$conn=conn('web'));
if(mysql_num_rows($r)){
 $r=mysql_fetch_row($r);
 $root=$r[0];
 mysql_close($conn);
 header('Location:http://'.$root.'.gqsj.cc');
 }
else
header('Location:index.html');  
?>
数据库表IP_Address(ip1,ip2,webroot)说明:IP1=192.168.1.1,IP2=192.168.1.255,webroot=1代表某个分站..
现在的问题是,这个代码不精确,第三组的IP,有些时候多个城市相同,大家帮我写一个精确的,四组IP全对比背,满足条件则进入相应网站...
答案:124.205.181.2 显示是北京 电信通 显示 
222.35.115.218 显示是北京 顺义区 铁通

为什么我这里可以?

你有没有搭建好环境,文件有没有放对位置?
============
把QQWry.dat放在这个文件的data目录中

<?php
$ipdatafile = 'data/QQWry.dat';

$ip = '121.33.8.90';//广州的IP

//$ip = '219.234.251.60';//北京的IP
//$ip = '211.160.165.66';//上海的IP

//生产环境用这个代码
//$ip=$_SERVER['REMOTE_ADDR'];

$ret = convertip_full($ip,$ipdatafile);

echo $ret;

if(preg_match("|上海|",$ret))
{
echo "上海\n<br>";
echo "";
}
elseif(preg_match("|北京|",$ret))
{
echo "北京\n<br>";
echo "";
}
else
{
echo "其它地方\n<br>";
echo "";
}

function convertip_full($ip, $ipdatafile) {

if(!$fd = fopen($ipdatafile,'rb')) {
return '- Invalid IP data file';
}

$ip = explode('.', $ip);
$ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];

if(!($DataBegin = fread($fd, 4)) || !($DataEnd = fread($fd, 4)) ) return;
@$ipbegin = implode('', unpack('L', $DataBegin));
if($ipbegin < 0) $ipbegin += pow(2, 32);
@$ipend = implode('', unpack('L', $DataEnd));
if($ipend < 0) $ipend += pow(2, 32);
$ipAllNum = ($ipend - $ipbegin) / 7 + 1;

$BeginNum = $ip2num = $ip1num = 0;
$ipAddr1 = $ipAddr2 = '';
$EndNum = $ipAllNum;

while($ip1num > $ipNum || $ip2num < $ipNum) {
$Middle= intval(($EndNum + $BeginNum) / 2);

fseek($fd, $ipbegin + 7 * $Middle);
$ipData1 = fread($fd, 4);
if(strlen($ipData1) < 4) {
fclose($fd);
return '- System Error';
}
$ip1num = implode('', unpack('L', $ipData1));
if($ip1num < 0) $ip1num += pow(2, 32);

if($ip1num > $ipNum) {
$EndNum = $Middle;
continue;
}

$DataSeek = fread($fd, 3);
if(strlen($DataSeek) < 3) {
fclose($fd);
return '- System Error';
}
$DataSeek = implode('', unpack('L', $DataSeek.chr(0))

上一个:说明函数中变量作用域的范围 php
下一个:如何去掉PHP字符串中的中文字符

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,