PHP中根据IP地址判断城市实现城市切换或跳转代码


Posted in PHP onSeptember 04, 2012

获取IP地址

<?php
function GetIP() {
    if ($_SERVER["HTTP_X_FORWARDED_FOR"])
        $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    else if ($_SERVER["HTTP_CLIENT_IP"])
        $ip = $_SERVER["HTTP_CLIENT_IP"];
    else if ($_SERVER["REMOTE_ADDR"])
        $ip = $_SERVER["REMOTE_ADDR"];
    else if (getenv("HTTP_X_FORWARDED_FOR"))
        $ip = getenv("HTTP_X_FORWARDED_FOR");
    else if (getenv("HTTP_CLIENT_IP"))
        $ip = getenv("HTTP_CLIENT_IP");
    else if (getenv("REMOTE_ADDR"))
        $ip = getenv("REMOTE_ADDR");
    else
        $ip = "Unknown";
    return $ip;
}
echo GetIP();
?>

方法二
function getip ()
{
                if (getenv('http_client_ip')) {
                        $ip = getenv('http_client_ip');
                } else if (getenv('http_x_forwarded_for')) {
                        $ip = getenv('http_x_forwarded_for');
                } else if (getenv('remote_addr')) {
                        $ip = getenv('remote_addr');
                } else {
                        $ip = $_server['remote_addr'];
                }
                return $ip;

PHP通过IP地址判断用户所在城市
上文已经获得了用户IP地址,接下来,我们就是根据这个IP地址获得用户所在城市了。开始之前,我们需要下载一个现成的数据库QQ IP数据库。
最新IP地址数据库:https://3water.com/softs/10529.html
使用方法:解压后QQWry.Dat就是我们想要IP地址数据库,我们新建一个ipcity文件夹,将数据库放在下面。QQ IP数据库使用非常方便,数据也很齐全,你可以及时关注官方更新以保持数据最新,强力推荐一下:)
接下来,我们在上面的ipcity目录下新建一个ipaddress.php文件,直接复制以下代码进去即可,重要的地方也作了相应注释。B段:
<?
/*
函数名称:ipCity
参数说明:$userip——用户IP地址
函数功能:PHP通过IP地址判断用户所在城市
author:lee
contact:xpsem2010@gmail.com
*/
function ipCity($userip) {
    //IP数据库路径,这里用的是QQ IP数据库 20110405 纯真版
    $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地址实现城市切换或跳转
到这里,其实问题已经很简单了,用简单的js就通通搞定。C段如下:
//根据IP地址跳转指定页面js取得城市
var city='<?echo ipCity($xp_UserIp);?>';

//根据IP地址所有城市跳转到指定页面
if(city.indexOf("上海市")>=0){
        window.location.href="http://shanghai.demo.com/";
}

将开头的A段代码和上面的C段代码分别放在B段代码的头和尾,然后我们在需要跳转的页面加入以下代码:
<script src="/ipcity/ipaddress.php" type="text/javascript" language="javascript"></script>
 

刷新页面,是不是达到预想的效果了呢?
上面的代码只是简单的判断了ip那里就跳到那,如果出现如,我想把湖南所有IP都跳到长沙去,那像衡阳,刘阳,耒阳 这些就要作多次父线处理了,要想知道请看下集。
PHP 相关文章推荐
PHP的FTP学习(一)
Oct 09 PHP
一段防盗连的PHP代码
Dec 06 PHP
Linux下 php5 MySQL5 Apache2 phpMyAdmin ZendOptimizer安装与配置[图文]
Nov 18 PHP
基于PHP遍历数组的方法汇总分析
Jun 08 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
Jun 25 PHP
PHP中round()函数对浮点数进行四舍五入的方法
Nov 19 PHP
PHP随机生成信用卡卡号的方法
Mar 23 PHP
详解PHP的Yii框架中扩展的安装与使用
Apr 01 PHP
thinkPHP批量删除的实现方法分析
Nov 09 PHP
Yii框架中使用PHPExcel的方法分析
Jul 25 PHP
PHP常用字符串函数用法实例总结
Jun 04 PHP
discuz论坛更换域名,详细文件修改步骤
Dec 09 PHP
PHP中“简单工厂模式”实例代码讲解
Sep 04 #PHP
通过php快速统计某个数据库中每张表的数据量
Sep 04 #PHP
比较discuz和ecshop的截取字符串函数php版
Sep 03 #PHP
Windows下部署Apache+PHP+MySQL运行环境实战
Aug 31 #PHP
关于UEditor编辑器远程图片上传失败的解决办法
Aug 31 #PHP
php数组一对一替换实现代码
Aug 31 #PHP
PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)
Aug 31 #PHP
You might like
jQuery EasyUI API 中文文档 - DateBox日期框
2011/10/15 PHP
PHP中include与require使用方法区别详解
2013/10/19 PHP
php实现mysql数据库分表分段备份
2015/06/18 PHP
浅谈PHP安全防护之Web攻击
2017/01/03 PHP
thinkPHP利用ajax异步上传图片并显示、删除的示例
2018/09/26 PHP
javascript jQuery插件练习
2008/12/24 Javascript
JavaScript闭包实例讲解
2014/04/22 Javascript
JS+CSS实现带关闭按钮DIV弹出窗口的方法
2015/02/27 Javascript
jfreechart插件将数据展示成饼状图、柱状图和折线图
2015/04/13 Javascript
php结合imgareaselect实现图片裁剪
2015/07/05 Javascript
jquery.serialize() 函数语法及简单实例
2016/07/08 Javascript
AngularJS中transclude用法详解
2016/11/03 Javascript
JavaScript实现的select点菜功能示例
2017/01/16 Javascript
jQuery初级教程之网站品牌列表效果
2017/08/02 jQuery
jQuery Datatable 多个查询条件自定义提交事件(推荐)
2017/08/24 jQuery
JavaScript实现的超简单计算器功能示例
2017/12/23 Javascript
微信小程序wx.getImageInfo()如何获取图片信息
2018/01/26 Javascript
vue配置多页面的实现方法
2018/05/22 Javascript
基于jQuery使用Ajax动态执行模糊查询功能
2018/07/05 jQuery
vue安装和使用scss及sass与scss的区别详解
2018/10/15 Javascript
微信小程序事件 bindtap bindinput代码实例
2019/08/26 Javascript
Vuex的API文档说明详解
2020/02/05 Javascript
vue中实现动态生成二维码的方法
2020/02/21 Javascript
跟老齐学Python之编写类之四再论继承
2014/10/11 Python
Python进行数据科学工作的简单入门教程
2015/04/01 Python
PyChar学习教程之自定义文件与代码模板详解
2017/07/17 Python
在pycharm下设置自己的个性模版方法
2019/07/15 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
python 实现音频叠加的示例
2020/10/29 Python
用OpenCV进行年龄和性别检测的实现示例
2021/01/29 Python
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
MIRTA官网:手工包,100%意大利制造
2020/02/11 全球购物
KOHLER科勒美国官网:国际著名卫浴橱柜领先品牌
2020/06/27 全球购物
医院后勤自我鉴定
2013/10/13 职场文书
我的大学生活职业生涯规划
2014/01/02 职场文书
安全技术说明书
2014/05/09 职场文书