织梦(DedeCMS)系统将IP地址转换为纯真IP数据库的地区的实现函数

“将织梦系统的IP地址转换为纯真IP数据库的函数”,通过这个函数,可以实现类似于本站评论处的那样的显示IP地址所在地区。
一、实现方法
1)函数编写
本来是以前的版本,我是通过JS方式来调用的,但这种方式在有些页面可能会不兼容。后来就升级了函数方式,但一直没更新。好了,我们来看看具体的函数编写方法:
在/include/extend.func.php 文件中的?>的上面加入以下函数代码:

 

function convertip( $ip){
      $dat_path = DEDEDATA . '/ip/QQWry.dat';
      if(! ereg("^([0-9]{1,3}.){3}[0-9]{1,3}$",  $ip)){
          return 'IP格式错误';
         }
      if(! $fd = @ fopen( $dat_path, 'rb')){
          return '无法打开IP数据库';
         }
      $ip =  explode('.',  $ip);
      $ipNum =  $ip[0] * 16777216 +  $ip[1] * 65536 +  $ip[2] * 256 +  $ip[3];
      $DataBegin =  fread( $fd, 4);
      $DataEnd =  fread( $fd, 4);
      $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 = 0;
      $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)));
          fseek( $fd$DataSeek);
          $ipData2 =  fread( $fd, 4);
          if( strlen( $ipData2) < 4){
              fclose( $fd);
              return 'System Error';
             }
          $ip2num =  implode('',  unpack('L',  $ipData2));
          if( $ip2num < 0)  $ip2num +=  pow(2, 32);
          if( $ip2num <  $ipNum){
              if( $Middle ==  $BeginNum){
                  fclose( $fd);
                  return 'Unknown';
                 }
              $BeginNum =  $Middle;
             }
         }
      $ipFlag =  fread( $fd, 1);
      if( $ipFlag ==  chr(1)){
          $ipSeek =  fread( $fd, 3);
          if( strlen( $ipSeek) < 3){
              fclose( $fd);
              return 'System Error';
             }
          $ipSeek =  implode('',  unpack('L',  $ipSeek .  chr(0)));
          fseek( $fd$ipSeek);
          $ipFlag =  fread( $fd, 1);
         }
      if( $ipFlag ==  chr(2)){
          $AddrSeek =  fread( $fd, 3);
          if( strlen( $AddrSeek) < 3){
              fclose( $fd);
              return 'System Error';
             }
          $ipFlag =  fread( $fd, 1);
          if( $ipFlag ==  chr(2)){
              $AddrSeek2 =  fread( $fd, 3);
              if( strlen( $AddrSeek2) < 3){
                  fclose( $fd);
                  return 'System Error';
                 }
              $AddrSeek2 =  implode('',  unpack('L',  $AddrSeek2 .  chr(0)));
              fseek( $fd$AddrSeek2);
             } else{
              fseek( $fd, -1, SEEK_CUR);
             }
          while(( $char =  fread( $fd, 1)) !=  chr(0))
          $ipAddr2 .=  $char;
          $AddrSeek =  implode('',  unpack('L',  $AddrSeek .  chr(0)));
          fseek( $fd$AddrSeek);
          while(( $char =  fread( $fd, 1)) !=  chr(0))
          $ipAddr1 .=  $char;
         } else{
          fseek( $fd, -1, SEEK_CUR);
          while(( $char =  fread( $fd, 1)) !=  chr(0))
          $ipAddr1 .=  $char;
          $ipFlag =  fread( $fd, 1);
          if( $ipFlag ==  chr(2)){
              $AddrSeek2 =  fread( $fd, 3);
              if( strlen( $AddrSeek2) < 3){
                  fclose( $fd);
                  return 'System Error';
                 }
              $AddrSeek2 =  implode('',  unpack('L',  $AddrSeek2 .  chr(0)));
              fseek( $fd$AddrSeek2);
             } else{
              fseek( $fd, -1, SEEK_CUR);
             }
          while(( $char =  fread( $fd, 1)) !=  chr(0)){
              $ipAddr2 .=  $char;
             }
         }
      fclose( $fd);
      //  最后做相应的替换操作后返回结果
     if( preg_match('/http/i',  $ipAddr2)){
          $ipAddr2 = '';
         }
      $ipaddr = " $ipAddr1  $ipAddr2";
      $ipaddr =  preg_replace('/CZ88.Net/is', '',  $ipaddr);
      $ipaddr =  preg_replace('/^s*/is', '',  $ipaddr);
      $ipaddr =  preg_replace('/s*$/is', '',  $ipaddr);
      if( preg_match('/http/i',  $ipaddr) ||  $ipaddr == ''){
          $ipaddr = 'Unknown';
         }
      return  $ipaddr;
     }

 

 

  

复制代码      保存后关闭即可。
2)调用方法
直接通过 {dede:field.ip  function="convertip(@me)"/}来调用即可。
在PHP文件中,也可以直接使用:

     $ipadress = convertip( $ip);

 

 

来获得IP地址的地区数据,注意$ip为实际IP地址的变量。
 

 

 

你可能感兴趣的:(dedecms)