<pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

          <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

          <p id="bbfd9"></p>

          <p id="bbfd9"><cite id="bbfd9"></cite></p>

            <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

            <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
            <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
            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

                    <pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

                    <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

                    <p id="bbfd9"></p>

                    <p id="bbfd9"><cite id="bbfd9"></cite></p>

                      <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

                      <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
                      <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
                      飘沙影院