回覆列表
  • 1 # hello大資料

    PW自身就有根據IP判斷所屬地區的功能,只要經常更新IP庫就沒什麼問題.至於根據歸屬地跳轉到相應頁面就需要你自己去寫了。網上幫你找了一個,看是否合適。

    。<?php

    //返回當前IP的城市字串

    function convertip($ip) {

    //IP資料檔案路徑

    $dat_path = "QQWry.Dat";

    //檢查IP地址

    if(!preg_match("/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/", $ip)) {

    return "IP Address Error";

    }

    //開啟IP資料檔案

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

    return "IP date file not exists or access denied";

    }

    //分解IP進行運算,得出整形數

    $ip = explode(".", $ip);

    $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];

    //獲取IP資料索引開始和結束位置

    $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;

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

    while($ip1num>$ipNum || $ip2num<$ipNum) {

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

    //偏移指標到索引位置讀取4個位元組

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

    $ipData1 = fread($fd, 4);

    if(strlen($ipData1) < 4) {

    fclose($fd);

    return "System Error";

    }

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

    $ip1num = implode("", unpack("L", $ipData1));

    if($ip1num < 0) $ip1num += pow(2, 32);

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

    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(s

  • 中秋節和大豐收的關聯?
  • 人類歷史上最偉大的起義有哪些?