是这样的,数据库中存储的是
---------------------------------------------------------------------
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范围的应该怎么做
解决方案 »
- 求助:POST提交,当Content-Type: text/plain时,无法通过$_POST获取数据
- 如何将数据库的字段取到(综合查询平台)
- 上传大文件--如何提示正在上传中,请稍候...
- 我想问下我的正则是哪里错了?
- 问个一直想不透的问题,关于CSDN
- 请教大型网站均衡负载
- 谁有世界国家以及每个国家的省(洲)的列表?(最好是英文版)
- 麻烦给我看一下这条mysql的sql语句有什么错?
- 请教:如何读去一张网页中所有的图片连接,然后把图片保存到一个文件夹中??
- IIS上利用PHP支持PATH_INFO,安装后没有反应嘛!
- 为什么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"));
?>
所以我并没建议你使用数字类型保存