dedecmsS將IP位址轉換為純真IP資料庫的實現函數

大家知道織夢DedeCMS的後台可以查詢發布文章和評論的IP位址,dedecms默認的IP位址庫卻不是現在最流行純真IP資料庫,那麼如何將織夢cms的IP位址轉換為純真IP資料庫的函數呢?    可以通過以下方法修改實現

實現方法

第一步:函數編寫

在/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;  }

//*結束

保存後即可

第二步:IP庫存放

請到純真IP官方網站下載IP庫後,將IP位址文件重命名為QQWry.dat並複製到程序根目錄的 /data/ip/ 文件夾(若沒有ip文件夾,請自行創建)

第三步:調用方法

因為本功能已經被封裝了,所以其調用方法非常零活多變。    比如可以用 {dede:field.ip function="convertip(@me)"/} 的底層模板來調用,也可以直接在相關的 PHP功能文件里進行轉換,比如:$ipadress = convertip($ip);等等。

功能說明

本功能可運行在DedeCMS_V5.3 及以上所有版本且不分編碼。

本文內容整理自網絡, 文中所有觀點看法不代表淘大白的立場