是这样的,数据库中存储的是
---------------------------------------------------------------------
ip_start(最小范围ip) ip_end(最大范围ip) 部门
----------------------------------------------------------
192.168.1.1 192.168.1.15 新乐村
------------------------------------------------------------
192.168.1.16 192.168.1.89 伯各村
__--------------------------------------------------------
192.168.23.45 192.168.25.89 钎云村
----------------------------------------------------------
如果要搜索192.168.23.75是哪一个 ip范围的应该怎么做
---------------------------------------------------------------------
ip_start(最小范围ip) ip_end(最大范围ip) 部门
----------------------------------------------------------
192.168.1.1 192.168.1.15 新乐村
------------------------------------------------------------
192.168.1.16 192.168.1.89 伯各村
__--------------------------------------------------------
192.168.23.45 192.168.25.89 钎云村
----------------------------------------------------------
如果要搜索192.168.23.75是哪一个 ip范围的应该怎么做
解决方案 »
- apache中配置的301跳转,为什么还是被百度收录了
- PHP怎样读取并把EXCEL文件的批注导入到mysql里面
- 解决大数量http请求问题,有过经验的人请进
- 困惑,使用异常处理的try语句和用if...then...else有什么本质的区别?
- SQL 搜索问题
- 求助:PHP成绩查询后进行排名问题
- 在IIS服务下为何使用PHP的HTTP认证不能通过?
- foreach 数组嵌套循环,出现记录重复,急~~~~~
- 请高手帮忙,关于array()数组问题
- 请问在PHP里面能不能用<input type=button ...onClick="check()">呢?
- 为什么ie浏览某些网页会被执行注册表?
- 谁有网上调查系统代码,发一个给我,谢谢!!
$str2=explode(".",$ip_end);
把字符串从“.”分开成数组
比如串是"192.168.23.75"
那么
$str1[2]=23
$str1[3]=75
从这方面考虑一下~
$ip_detail=explode(".",$ip);
if (file_exists("datafile/$ip_detail[0].txt")) $ipfile=file("datafile/$ip_detail[0].txt");
else $ipfile=file("datafile/0.txt");
$countip=count($ipfile);
$ip=FormatIP($ip);
for($i=0;$i<=$countip;$i++){
$ipinfo=explode("|",$ipfile[$i]);
if ( strcmp($ip,$ipinfo[0])>=0 && strcmp($ip,$ipinfo[1])<=0 ) {
$co=$ipinfo[2]; $ci=$ipinfo[3];
}
}
$ipscan=$co.$ci;
$ipscan=str_replace("rn","",$ipscan);
if ($ipscan=="") $ipscan="未知";
return $ipscan;
}
function FormatIP($ip)
{
$ret= ereg("^([0-9]+).([0-9]+).([0-9]+).([0-9]+)$", $ip, $IPSection);
if ($ret == false)
return -1;// Invild IP
for ($i=1; $i<=4; $i++)
if ($IPSection[$i] > 255)
return -1;
else
$ip2.= sprintf("%03.0f", $IPSection[$i]). (($i<4) ? '.' : '');
return $ip2;
}
楼主要的和 edlongren(edlongren)说的差不多。也就是用.分割先,然后分别构造成192.168.xx.00的形式,比较判断。
--------------
如果要搜索192.168.23.75是哪一个 ip范围的应该怎么做
--------------
另外,好像可以直接比较吧?192.168.23.75不是大于192.168.22.255么?我记得比较是从最前面开始比较每一位的呀。
218102023015 218102023061 addr
ip_a ip_b ip_data
if(ip>=ip_a&&ip<=ip_b)
{
printf("%s",ip_data);
}
所以不能在查询指令中完成判断
如果用php编程完成,则:你或许要反复查询或许要读取全部数据。这对于庞大的ip地址表来说肯定是划不来的php提供了专门的函数ip2long、long2ip,用于在ip串和长整型数间转换
当ip转换成数字后最多为一个10位数字
可以用int类型保存(4个字节)通常ip地址表中的ip用8位16进制数
192.168.23.75 ==》C0A8174B
虽然比int类型多用4个字节,但他比较直观,也便于做串操作基于上述理由,建议你先调整ip的存储方式,再行讨论
php里把它以十二个字符对齐
再比较。用二分法查找很快的。
ip_start(最小范围ip) ip_end(最大范围ip) 部门
C0A80101 C0A8010F 新乐村
C0A80110 C0A80159 伯各村
C0A8172D C0A81959 钎云村后
$ip = ip2long("192.168.23.75");
$query = "select * from tbl_name '$ip' BETWEEN ip_start and ip_end";
即可
echo ip2long("10.0.0.1");
echo "<br>";echo ip2long("192.168.0.1");
echo "<br>";printf("%u<br>",ip2long("10.0.0.1"));
printf("%u<br>",ip2long("192.168.0.1"));
?>
所以我并没建议你使用数字类型保存