是这样的,数据库中存储的是
---------------------------------------------------------------------
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范围的应该怎么做

解决方案 »

  1.   

    $str1=explode(".",$ip_start);
    $str2=explode(".",$ip_end);
    把字符串从“.”分开成数组
    比如串是"192.168.23.75"
    那么
      $str1[2]=23
      $str1[3]=75
    从这方面考虑一下~
      

  2.   

    function convert_ip($ip) {
    $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;
    }
      

  3.   

    上面给的是文本存储ip数据的方式,不是很确切。
    楼主要的和 edlongren(edlongren)说的差不多。也就是用.分割先,然后分别构造成192.168.xx.00的形式,比较判断。
    --------------
    如果要搜索192.168.23.75是哪一个 ip范围的应该怎么做
    --------------
    另外,好像可以直接比较吧?192.168.23.75不是大于192.168.22.255么?我记得比较是从最前面开始比较每一位的呀。
      

  4.   

    ip=192.168.23.75=>192168023075
    218102023015     218102023061       addr
    ip_a                             ip_b                 ip_data
    if(ip>=ip_a&&ip<=ip_b)
    {
         printf("%s",ip_data);
    }
      

  5.   

    你的存储方式有问题,所以才造成定位困难当ip以字符串方式存放时,字段宽度在8-15位间。而这样的是字符串不能直接比较的
    所以不能在查询指令中完成判断
    如果用php编程完成,则:你或许要反复查询或许要读取全部数据。这对于庞大的ip地址表来说肯定是划不来的php提供了专门的函数ip2long、long2ip,用于在ip串和长整型数间转换
    当ip转换成数字后最多为一个10位数字
    可以用int类型保存(4个字节)通常ip地址表中的ip用8位16进制数
    192.168.23.75 ==》C0A8174B
    虽然比int类型多用4个字节,但他比较直观,也便于做串操作基于上述理由,建议你先调整ip的存储方式,再行讨论
      

  6.   

    把它存为64位整数。再进行比较。
    php里把它以十二个字符对齐
    再比较。用二分法查找很快的。
      

  7.   

    当把表改造成
    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";
    即可
      

  8.   

    唠叨's idea is very good.
      

  9.   

    唠叨,如果用ip2long()则所有的私有地址如192.168.0.1,10.0.0.1等等,经过转换后都变成了-1
      

  10.   

    <?php
    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"));
    ?>
    所以我并没建议你使用数字类型保存