数据库member:
id      ip
1      110.251.123.139
2      120.7.251.196
3      183.67.34.189
4
……因为需要,数据库中必须记录了完整的IP但现在要取表中IP段前二位与现有黑名单IP的前二段(如118.15或183.67)比对是否相同请高手帮写出代码,谢谢!

解决方案 »

  1.   

    直接取出ip 再 explode就可以得到数组啦 比较一下就好了
      

  2.   

    不会啊,取出IP还要截取前二段再比对,请高手帮直接写出代码吧,谢谢了。试了这样写,测试不行$q25="select * from member where";//数据库中有若干条数据
    $r25=$obj_db->simplequery($q25);
    $tx_list25="";
    while ($a25=$obj_db->fetchrow($r25,DB_FETCHMODE_ASSOC))
    {
    $a25ip=explode(".",$a25[ip]);
    $arr25ip="$a25ip[0].$a25ip[1]";//取IP前二位
    $tx_list25.="$arr25ip,";
    }
    $tx_list25=substr($tx_list25,0,-1);
    $bhei = array("$tx_list25");//数据库中的IP前二段
    $new_array = array(127.0,192.168);//比对数据库中IP的前二段是否与这二个IP段相同
    $sj=0;
    foreach($new_array as $item)
    {
        if(in_array($item,$bhei))
        {
    $sj=1;
    break;
    }}echo "$sj";//$sj=1,有相同的IP段,$sj=0,没有相同的IP段
    =======================请高手帮忙修正错误,或者用更简洁的代码达到效果,谢谢!
      

  3.   

    select * from member where ip like '118.15%';
      

  4.   

    都不看手册的吗?
    mysql 手册中有
    SUBSTRING_INDEX(str,delim,count) 
    返回字符串 str 中在第 count 个出现的分隔符 delim 之前的子串。如果 count 是一个正数,返回从最后的(从左边开始计数)分隔符到左边所有字符。如果 count 是负数,返回从最后的(从右边开始计数)分隔符到右边所有字符: 
    mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);
            -> 'www.mysql'
    mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);
            -> 'mysql.com'这个函数是多字节安全的。 
      

  5.   

    这是不严密的,LZ 需要比较 ip 的前两段
    至少要写作 
    select * from member where ip like '118.15.%';
      

  6.   

    正解,再判断mysql_num_rows()是否大于0,大于0说明有相同的ip段,否则没有。
      

  7.   

    于是有
    select * from member where SUBSTRING_INDEX(ip, '.', 2) in ('118.15', '183.67');
      

  8.   

    select * from member where ip like '118.15.%';
    -----------------------------------------------
    这个就不错了,如果ip字段建有索引,这条语句除非118.15.*的条目太多,基本会做索引扫描
      

  9.   

    注意 like 不会利用索引
      

  10.   

    LIKE条件不以通配符开头的话是可以使用索引的。
      

  11.   

    like '%...%'不行
    like '..%' 可以