Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

[修改] 帮忙看下这个ip跳转城市地区代码对吗

[复制链接]
路,一直都在 发表于 2012-5-1 23:03:54 | 显示全部楼层 |阅读模式
PHP通过IP地址判断用户所在城市

第一个js jquery.cookie.js

// JavaScript Document
jQuery.cookie = function(name, value, options) {
    if (typeof value != 'undefined') { // name and value given, set cookie
        options = options || {};
        if (value === null) {
            value = '';
            options.expires = -1;
        }
        var expires = '';
        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
            var date;
            if (typeof options.expires == 'number') {
                date = new Date();
                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
            } else {
                date = options.expires;
            }
            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
        }
        var path = options.path ? '; path=' + options.path : '';
        var domain = options.domain ? '; domain=' + options.domain : '';
        var secure = options.secure ? '; secure' : '';
        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
    } else { // only name given, get cookie
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
};




第二个ipaddress.php 文件
<?
/*
函数名称:ipCity
参数说明:$userip——用户IP地址
函数功能:PHP通过IP地址判断用户所在城市
*/
header("content-Type: text/html; charset=gbk");
function ipCity($userip) {
//IP数据库路径
$dat_path = 'qqwry.dat';

   //判断IP地址是否有效
    if(!ereg("^([0-9]{1,3}.){3}[0-9]{1,3}$", $userip)){
       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';
    }
    return $useripaddr;
}

//PHP获取当前用户IP地址方法
$xp_UserIp = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];
$xp_UserIp = ($xp_UserIp) ? $xp_UserIp : $_SERVER["REMOTE_ADDR"];
?>
var city="<?php echo ipCity($xp_UserIp)?>";
if(city.indexOf("广东省")>=0){
if($.cookie('guangdong')!='true'){
         window.location.;
      $.cookie('guangdong','true');
}
}
else if(city.indexOf("江苏省")>=0){
if($.cookie('jiangsu')!='true'){
        window.location.;
          $.cookie('jiangsu','true');
        }
}

else{
        window.location.;
}


在你网站首页加上
<script src="/templets/default/js/jquery.cookie.js"></script>
<script src="ipcity/ipaddress.php" type="text/javascript" language="javascript"></script>

朴素 发表于 2012-5-1 23:05:03 | 显示全部楼层
不好意思一看代码就头大。。。
回复

使用道具 举报

ndren 发表于 2012-5-1 23:29:11 | 显示全部楼层
有些复杂,看不大懂
回复

使用道具 举报

pj1219 发表于 2015-2-2 19:27:09 | 显示全部楼层
现在可以用吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-15 14:30 , Processed in 0.050568 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表