我们先来看下个人常用的代码
PHP
<?php
include_once('./qqwry.php');
$QQWry=newQQWry;
functionget_real_ip(){
$ip=false;
if(!empty($_SERVER["HTTP_CLIENT_IP"])){
$ip=$_SERVER["HTTP_CLIENT_IP"];
}
if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ips=explode(",",$_SERVER['HTTP_X_FORWARDED_FOR']);
if($ip){array_unshift($ips,$ip);$ip=FALSE;}
for($i=0;$i<count($ips);$i++){
if(!eregi("^(10|172\.16|192\.168)\.",$ips[$i])){
$ip=$ips[$i];
break;
}
}
}
return$ip;
}
functionis_ip($str){
$ip=explode(".",$str);
if(count($ip)<4||count($ip)>4)return0;
foreach($ipas$ip_addr){
if(!is_numeric($ip_addr))return0;
if($ip_addr<0||$ip_addr>255)return0;
}
return1;
}
$ip=$_SERVER['REMOTE_ADDR'];
$ifErr=$QQWry->QQWry($ip);
$city=$QQWry->Country.$QQWry->Local;
//echo$city;*/
if(strpos($city,'玄武区')!==false){
$city="玄武区";
}
elseif(strpos($city,'仙林')!==false){
$city="仙林";
}
elseif(strpos($city,'秦淮区')!==false){
$city="秦淮区";
}
elseif(strpos($city,'江宁')!==false){
$city="江宁";
}
elseif(strpos($city,'鼓楼')!==false){
$city="鼓楼";
}
else{
$city="栖霞";
}
if(isset($_GET['chengshi'])){//Ê×Ïȼì²âÊÇ·ñ»ñµÃÁËGET´«µÝµÄÊý¾Ý
setcookie("cookie_city",$_GET['chengshi'],time()+3600*24);
$city=$_GET['chengshi'];
}
elseif(isset($_COOKIE["cookie_city"])){//¼ì²âÊÇ·ñ´æÔÚêdzÆCookie
$city=$_COOKIE["cookie_city"];//ÏÔʾCookie±£´æµÄÊý¾Ý
}
else{
setcookie("cookie_city",$city,time()+3600*24);//´¿³õʼ»¯´Ë±äÁ¿
$_COOKIE["cookie_city"]=$city;
}
?>
HTML
<!DOCTYPEhtml>
<htmllang="zh-cn">
<head>
<metacharset="utf-8"/>
<LINKhref="css/css.css"type=text/cssrel=stylesheet>
<SCRIPTsrc="js/jquery-1.4.2.min.js"type=text/javascript></SCRIPT>
<title>城市切换</title>
</head>
<BODY>
<DIVclass=selCityid=allCitystyle="DISPLAY:none">
<DIVclass=area>
<TABLE>
<TBODY>
<TR>
<TD><Aclass=curhref="show.html">玄武区</A></TD>
<TD><Ahref="show1.html">仙林</A></TD>
<TD><Ahref="show2.html">秦淮区</A></TD>
<TD><Ahref="show3.html">鼓楼</A></TD>
<TD><Ahref="show4.html">江宁</A></TD>
<TD><Ahref="show5.html">栖霞区</A></TD>
</TR>
</TBODY></TABLE>
<DIVclass=none><Aid=foldinhref="javascript:;">全部</A></DIV></DIV></DIV>
<DIVclass=header>
<DIVclass=area>
<DIVclass=r>
<DIVclass="topCtiyclear">
<UL>
<LIclass=i1><Ahref="index.php">全部小区</A></LI>
<LIclass=i1>
<?php
echo$city;
?>
</LI>
<LIclass=i2id=changeCity>切换城市</LI>
</UL>
</DIV>
</DIV>
</DIV>
</DIV>
<SCRIPTtype=text/javascript>
jQuery(function(){
$("#changeCity").click(function(a){
$("#allCity").slideDown(300);
a.stopPropagation();
$(this).blur();
});
$("#allCity").click(function(a){
a.stopPropagation()
});
$(document).click(function(a){
a.button!=2&&$("#allCity").slideUp(300)
});
$("#foldin").click(function(){
$("#allCity").slideUp(300)
});
});
</SCRIPT>
</body>
</html>
另外附上网友的实现方法:
使用方法:解压后QQWry.Dat就是我们想要IP地址数据库,我们新建一个ipcity文件夹,将数据库放在下面。QQIP数据库使用非常方便,数据也很齐全,你可以及时关注官方更新以保持数据最新,强力推荐一下:)
接下来,我们在上面的ipcity目录下新建一个ipaddress.php文件,直接复制以下代码进去即可,重要的地方也作了相应注释。B段:
<?
/*
函数名称:ipCity
参数说明:$userip——用户IP地址
函数功能:PHP通过IP地址判断用户所在城市
author:lee
contact:xpsem2010@gmail.com
*/
functionipCity($userip){
//IP数据库路径,这里用的是QQIP数据库20110405纯真版
$dat_path='QQWry.dat';
//判断IP地址是否有效
if(!ereg("^([0-9]{1,3}.){3}[0-9]{1,3}$",$userip)){
return'IPAddressInvalid';
}
//打开IP数据库
if(!$fd=@fopen($dat_path,'rb')){
return'IPdatafilenotexistsoraccessdenied';
}
//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'FileError';
}
//提取出来的数据转换成长整形,如果数据是负数则加上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'FileError';
}
$DataSeek=implode('',unpack('L',$DataSeek.chr(0)));
fseek($fd,$DataSeek);
$useripData2=fread($fd,4);
if(strlen($useripData2)<4){
fclose($fd);
return'FileError';
}
$userip2num=implode('',unpack('L',$useripData2));
if($userip2num<0)$userip2num+=pow(2,32);
//找不到IP地址对应城市
if($userip2num<$useripNum){
if($Middle==$BeginNum){
fclose($fd);
return'NoData';
}
$BeginNum=$Middle;
}
}
$useripFlag=fread($fd,1);
if($useripFlag==chr(1)){
$useripSeek=fread($fd,3);
if(strlen($useripSeek)<3){
fclose($fd);
return'SystemError';
}
$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'SystemError';
}
$useripFlag=fread($fd,1);
if($useripFlag==chr(2)){
$AddrSeek2=fread($fd,3);
if(strlen($AddrSeek2)<3){
fclose($fd);
return'SystemError';
}
$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'SystemError';
}
$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='NoData';
}
return$useripaddr;
}
?>
PHP根据IP地址实现城市切换或跳转
到这里,其实问题已经很简单了,用简单的js就通通搞定。C段如下:
//根据IP地址跳转指定页面js取得城市
varcity='<?echoipCity($xp_UserIp);?>';
//根据IP地址所有城市跳转到指定页面
if(city.indexOf("上海市")>=0){
window.location.href="http://shanghai.demo.com/";
}
将开头的A段代码和上面的C段代码分别放在B段代码的头和尾,然后我们在需要跳转的页面加入以下代码:
<scriptsrc="/ipcity/ipaddress.php"type="text/javascript"language="javascript"></script>
刷新页面,是不是达到预想的效果了呢?
以上就是PHP获取IP地址、PHP根据IP地址判断城市以及PHP根据IP地址实现城市切换或跳转的详细介绍了,事实上,像PHP中通过IP地址自动切换城市就是这个方法的典型应用。举一反三,我们通过这种方法,也可以实现屏蔽指定IP地址或城市的用户访问,自己研究一下吧,也挺简单的:)