PHP根据IP地址判断城市实现城市切换或跳转代码先要获取ip地址相当简单,下面先介绍两种获取IP地址的代码,后面需要利用QQIP库来查找当前IP是属于那个IP段然后得出城市字段并返回。获取IP地址代码如下复制代码?phpfunctionGetIP(){if($_SERVER[HTTP_X_FORWARDED_FOR])$ip=$_SERVER[HTTP_X_FORWARDED_FOR];elseif($_SERVER[HTTP_CLIENT_IP])$ip=$_SERVER[HTTP_CLIENT_IP];elseif($_SERVER[REMOTE_ADDR])$ip=$_SERVER[REMOTE_ADDR];elseif(getenv(HTTP_X_FORWARDED_FOR))$ip=getenv(HTTP_X_FORWARDED_FOR);elseif(getenv(HTTP_CLIENT_IP))$ip=getenv(HTTP_CLIENT_IP);elseif(getenv(REMOTE_ADDR))$ip=getenv(REMOTE_ADDR);else$ip=Unknown;return$ip;}echoGetIP();?方法二代码如下复制代码functiongetip(){if(getenv('http_client_ip')){$ip=getenv('http_client_ip');}elseif(getenv('http_x_forwarded_for')){$ip=getenv('http_x_forwarded_for');}elseif(getenv('remote_addr')){$ip=getenv('remote_addr');}else{$ip=$_server['remote_addr'];}return$ip;更多详细内容请查看:通过IP地址判断用户所在城市上文已经获得了用户IP地址,接下来,我们就是根据这个IP地址获得用户所在城市了。开始之前,我们需要下载一个现成的数据库QQIP数据库。最新IP地址数据库:使用方法:解压后QQWry.Dat就是我们想要IP地址数据库,我们新建一个ipcity文件夹,将数据库放在下面。QQIP数据库使用非常方便,数据也很齐全,你可以及时关注官方更新以保持数据最新,强力推荐一下:)接下来,我们在上面的ipcity目录下新建一个ipaddress.php文件,直接复制以下代码进去即可,重要的地方也作了相应注释。B段:代码如下复制代码?/*函数名称:ipCity参数说明:$userip——用户IP地址函数功能:PHP通过IP地址判断用户所在城市author:leecontact: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($useripbegin0)$useripbegin+=pow(2,32);$useripend=implode('',unpack('L',$DataEnd));if($useripend0)$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($userip1num0)$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($userip2num0)$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,$Ad);}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=}将开头的A段代码和上面的C段代码分别放在B段代码的头和尾,然后我们在需要跳转的页面加入以下代码:代码如下复制代码scriptsrc=/ipcity/ipaddress.phptype=text/javascriptlanguage=javascript/script刷新页面,是不是达到预想的效果了呢?上面的代码只是简单的判断了ip那里就跳到那,如果出现如,我想把湖南所有IP都跳到长沙去,那像衡阳,刘阳,耒阳这些就要作多次父线处理了,要想知道请看下集。