PHP获取IP地址

这个比较简单了,利用PHP自带函数就可以了,PHP中文手册看一下,都有现成的例子,就不过多说明了,直接上代码,A段:

<?
//PHP获取当前用户IP地址方法
$xp_UserIp = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];
$xp_UserIp = ($xp_UserIp) ? $xp_UserIp : $_SERVER["REMOTE_ADDR"];
?>

PHP通过IP地址判断用户所在城市

上文已经获得了用户IP地址,接下来,我们就是根据这个IP地址获得用户所在城市了。开始之前,我们需要下载一个现成的数据库QQ IP数据库。

附:最新腾讯QQ IP数据库 2011.04.10 纯真版下载

使用方法:解压后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,判断用户所在城市的更多相关文章

  1. 根据IP定位用户所在城市信息

    http://www.9958.pw/post/city_ip 1.调用新浪IP地址库 新浪提供了开放的IP地址库数据供开发者调用,调用地址: http://int.dpool.sina.com.cn ...

  2. php 获取客户端IP地址经纬度所在城市

    1. [代码]获取客户端IP地址经纬度所在城市 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 <?php   $getIp=$_SERVER["REMOTE_ADDR ...

  3. Java使用纯真IP库获取IP对应省份和城市

    原文:http://blog.csdn.net/chwshuang/article/details/78027873?locationNum=10&fps=1 Java使用纯真IP库获取IP对 ...

  4. python中通过客户端IP拿到所在城市和当地天气信息—附带项目案例

    熟悉老一代QQ的小伙伴可能都知道,很早以前的QQ,鼠标滑到头像的位置,你的位置和IP会在详情页显示,那么这个是如何做到的呢?下面我们就来玩一玩这个东西 首先,需求分析: 1.拿到客户端IP 2.通过I ...

  5. PHP判断用户所在国家并跳转对应的目录

    <?php // 淘宝API查询国家代码 $url = "http://ip.taobao.com/service/getIpInfo.php?ip=".get_client ...

  6. JavaScript在智能手机上的应用-使用手机GPS定位用户所在城市

    ---------------------------- <script type="text/javascript" language="javascript&q ...

  7. 根据IP查询所在城市接口(查询用户所在城市)

    转自:https://blog.csdn.net/liona_koukou/article/details/75646313 最近项目有用到定位用户客户端打开页面时所在的城市的需求,找到如下接口,做个 ...

  8. 根据外网ip地址定位用户所在城市

    package com.henu.controller; import java.io.BufferedReader; import java.io.DataOutputStream; import ...

  9. 获取客户端IP地址经纬度所在城市

    <?php $getIp=$_SERVER["REMOTE_ADDR"]; echo 'IP:',$getIp; echo '<br/>'; $content = ...

随机推荐

  1. FreeMarker hello

    一.什么是 FreeMarker FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker 与 Web 容器无关,即在 Web 运行时,它并不知道  ...

  2. 操作符及SQL函数

    本节要点: 掌握 SQL 操作符 l  算术操作符 l  比较操作符 l  逻辑操作符 l  集合操作符 l  连接操作符 l  操作符的优先级 掌握并熟练应用SQL 函数 l  日期函数 l  字符 ...

  3. 基本socket api

    socket函数,为了执行网络I/O,一个进程必须做的第一件事就是调用socket函数,并且指定通信协议类型. #include<sys/socket.h> int socket (int ...

  4. oracle 有个xe版本

    oracle 有个xe版本 学习了:http://blog.csdn.net/angiexia/article/details/8615771

  5. python爬虫系列:Scrapy安装与使用

    这篇博文主要写Scrapy框架的安装与使用 Scrapy框架安装 命令行进入C:\Anaconda2\Scripts目录,运行:conda install Scrapy 创建Scrapy项目 1)进入 ...

  6. UI_UISlider控件

    #pragma mark - 创建控件 UISlider - (void)createSlider { // 也是继承与 UIControl UISlider *slider = [[UISlider ...

  7. UVA 294 - Divisors 因子个数

    Mathematicians love all sorts of odd properties of numbers. For instance, they consider 945 to be an ...

  8. System.DirectoryServices Namespace

    https://docs.microsoft.com/en-us/dotnet/api/system.directoryservices?view=netframework-4.7 The Syste ...

  9. phpmyadmin客户端多服务器配置

    修改libraries/config.default.php 545行,添加 $cfg['Servers']['2'] = $cfg['Servers'][$i];$cfg['Servers']['2 ...

  10. USACO 1.4 Mother's Milk

    Mother's Milk Farmer John has three milking buckets of capacity A, B, and C liters. Each of the numb ...