<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. php語言

    PHP根據IP地址獲取所在城市具體實現

    時間:2025-03-23 10:41:35 php語言 我要投稿
    • 相關推薦

    PHP根據IP地址獲取所在城市具體實現

      了PHP根據IP地址獲取所在城市具體實現,有需要的朋友可以參考一下,就讓小編來告訴大家吧!

      文件目錄:

      ipLocation

      -----qqwry

      ----------QQWry.Dat

      -----ipCity.class.php

      ipCity.class.php文件代碼:

      復制代碼 代碼如下:

      <?php

      class ipCity {

      /**

      * 根據ip地址獲取對應所在城市

      * @param type $userip 用戶IP地址

      * @return string

      */

      public function getCity( $userip, $dat_path = '' ) {

      //IP數據庫路徑,這里用的是QQ IP數據庫 20110405 純真版

      empty( $dat_path ) && $dat_path = FCPATH . 'plugin/ipLocation/qqwry/QQWry.Dat';

      //判斷IP地址是否有效

      if ( preg_match( "/^([0-9]{1,3}.){3}[0-9]{1,3}$/", $userip ) == 0 ) {

      return 'IP Address Invalid';

      }

      //打開IP數據庫

      if ( !$fd = @fopen( $dat_path, 'rb' ) ) {

      return 'IP data file not exists or access denied';

      }

      //explode函數分解IP地址,運算得出整數形結果

      $userip = explode( '.', $userip );

      $useripNum = $userip[0] * 16777216 + $userip[1] * 65536 + $userip[2] * 256 + $userip[3];

      //獲取IP地址索引開始和結束位置

      $DataBegin = fread( $fd, 4 );

      $DataEnd = fread( $fd, 4 );

      $useripbegin = implode( '', unpack( 'L', $DataBegin ) );

      if ( $useripbegin < 0 )

      $useripbegin += pow( 2, 32 );

      $useripend = implode( '', unpack( 'L', $DataEnd ) );

      if ( $useripend < 0 )

      $useripend += pow( 2, 32 );

      $useripAllNum = ($useripend - $useripbegin) / 7 + 1;

      $BeginNum = 0;

      $EndNum = $useripAllNum;

      //使用二分查找法從索引記錄中搜索匹配的IP地址記錄

      while ( $userip1num > $useripNum || $userip2num < $useripNum ) {

      $Middle = intval( ($EndNum + $BeginNum) / 2 );

      //偏移指針到索引位置讀取4個字節

      fseek( $fd, $useripbegin + 7 * $Middle );

      $useripData1 = fread( $fd, 4 );

      if ( strlen( $useripData1 ) < 4 ) {

      fclose( $fd );

      return 'File Error';

      }

      //提取出來的數據轉換成長整形,如果數據是負數則加上2的32次冪

      $userip1num = implode( '', unpack( 'L', $useripData1 ) );

      if ( $userip1num < 0 )

      $userip1num += pow( 2, 32 );

      //提取的長整型數大于我們IP地址則修改結束位置進行下一次循環

      if ( $userip1num > $useripNum ) {

      $EndNum = $Middle;

      continue;

      }

      //取完上一個索引后取下一個索引

      $DataSeek = fread( $fd, 3 );

      if ( strlen( $DataSeek ) < 3 ) {

      fclose( $fd );

      return 'File Error';

      }

      $DataSeek = implode( '', unpack( 'L', $DataSeek . chr( 0 ) ) );

      fseek( $fd, $DataSeek );

      $useripData2 = fread( $fd, 4 );

      if ( strlen( $useripData2 ) < 4 ) {

      fclose( $fd );

      return 'File Error';

      }

      $userip2num = implode( '', unpack( 'L', $useripData2 ) );

      if ( $userip2num < 0 )

      $userip2num += pow( 2, 32 );

      //找不到IP地址對應城市

      if ( $userip2num < $useripNum ) {

      if ( $Middle == $BeginNum ) {

      fclose( $fd );

      return 'No Data';

      }

      $BeginNum = $Middle;

      }

      }

      $useripFlag = fread( $fd, 1 );

      if ( $useripFlag == chr( 1 ) ) {

      $useripSeek = fread( $fd, 3 );

      if ( strlen( $useripSeek ) < 3 ) {

      fclose( $fd );

      return 'System Error';

      }

      $useripSeek = implode( '', unpack( 'L', $useripSeek . chr( 0 ) ) );

      fseek( $fd, $useripSeek );

      $useripFlag = fread( $fd, 1 );

      }

      if ( $useripFlag == chr( 2 ) ) {

      $AddrSeek = fread( $fd, 3 );

      if ( strlen( $AddrSeek ) < 3 ) {

      fclose( $fd );

      return 'System Error';

      }

      $useripFlag = fread( $fd, 1 );

      if ( $useripFlag == 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 ) )

      $useripAddr2 .= $char;

      $AddrSeek = implode( '', unpack( 'L', $AddrSeek . chr( 0 ) ) );

      fseek( $fd, $AddrSeek );

      while ( ($char = fread( $fd, 1 )) != chr( 0 ) )

      $useripAddr1 .= $char;

      } else {

      fseek( $fd, -1, SEEK_CUR );

      while ( ($char = fread( $fd, 1 )) != chr( 0 ) )

      $useripAddr1 .= $char;

      $useripFlag = fread( $fd, 1 );

      if ( $useripFlag == 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 ) ) {

      $useripAddr2 .= $char;

      }

      }

      fclose( $fd );

      //返回IP地址對應的城市結果

      if ( preg_match( '/http/i', $useripAddr2 ) ) {

      $useripAddr2 = '';

      }

      $useripaddr = "$useripAddr1 $useripAddr2";

      $useripaddr = preg_replace( '/CZ88.Net/is', '', $useripaddr );

      $useripaddr = preg_replace( '/^s*/is', '', $useripaddr );

      $useripaddr = preg_replace( '/s*$/is', '', $useripaddr );

      if ( preg_match( '/http/i', $useripaddr ) || $useripaddr == '' ) {

      $useripaddr = 'No Data';

      } elseif ( !$this->is_utf8( $useripaddr ) ) {

      $useripaddr = iconv( 'GBK', 'UTF-8', $useripaddr );

      }

      return $useripaddr;

      }

      /**

      * 判斷是否我utf-8編碼的字符串

      * @param type $string

      * @return boolean

      */

      private function is_utf8( $string ) {

      if ( preg_match( "/^([" . chr( 228 ) . "-" . chr( 233 ) . "]{1}[" . chr( 128 ) . "-" . chr( 191 ) . "]{1}[" . chr( 128 ) . "-" . chr( 191 ) . "]{1}){1}/", $string ) == true || preg_match( "/([" . chr( 228 ) . "-" . chr( 233 ) . "]{1}[" . chr( 128 ) . "-" . chr( 191 ) . "]{1}[" . chr( 128 ) . "-" . chr( 191 ) . "]{1}){1}$/", $string ) == true || preg_match( "/([" . chr( 228 ) . "-" . chr( 233 ) . "]{1}[" . chr( 128 ) . "-" . chr( 191 ) . "]{1}[" . chr( 128 ) . "-" . chr( 191 ) . "]{1}){2,}/", $string ) == true ) {

      return true;

      } else {

      return false;

      }

      }

      }

    【PHP根據IP地址獲取所在城市具體實現】相關文章:

    php根據IP地址獲取當前地理位置接口05-18

    php獲取IP物理地址的方法05-15

    php怎樣根據ip地址查地區06-26

    php通過Chianz.com獲取IP地址與地區的方法08-12

    實現PHP實現限制IP訪問02-23

    php如何獲得ip地址05-29

    電腦如何自動獲取ip地址06-02

    PHP獲取真實的客戶IP的方法01-27

    php獲取當前url地址的方法05-03

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人