php實(shí)現(xiàn)多城市切換特效
更新時(shí)間:2015年08月09日 15:55:44 投稿:hebedich
本文給大家主要分享的是在PHP中如何獲取用戶(hù)IP地址、PHP根據(jù)IP判斷用戶(hù)所在城市以及PHP根據(jù)IP實(shí)現(xiàn)城市切換或跳轉(zhuǎn)的問(wèn)題。
我們先來(lái)看下個(gè)人常用的代碼
PHP
<?php
include_once('./qqwry.php');
$QQWry=new QQWry;
function get_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;
}
function is_ip($str) {
$ip = explode(".", $str);
if (count($ip)<4 || count($ip)>4) return 0;
foreach($ip as $ip_addr) {
if ( !is_numeric($ip_addr) ) return 0;
if ( $ip_addr<0 || $ip_addr>255 ) return 0;
}
return 1;
}
$ip=$_SERVER['REMOTE_ADDR'];
$ifErr=$QQWry->QQWry($ip);
$city = $QQWry->Country.$QQWry->Local;
//echo $city;*/
if (strpos($city,'玄武區(qū)')!==false){
$city = "玄武區(qū)";
}
else if(strpos($city,'仙林')!==false){
$city = "仙林";
}
else if(strpos($city,'秦淮區(qū)')!==false){
$city = "秦淮區(qū)";
}
else if(strpos($city,'江寧')!==false){
$city = "江寧";
}
else if(strpos($city,'鼓樓')!==false){
$city = "鼓樓";
}
else{
$city = "棲霞";
}
if (isset($_GET['chengshi'])) { //Ê×Ïȼì²âÊÇ·ñ»ñµÃÁË GET ´«µÝµÄÊý¾Ý
setcookie("cookie_city",$_GET['chengshi'],time()+3600*24);
$city = $_GET['chengshi'];
}
else if (isset($_COOKIE["cookie_city"])) { //¼ì²âÊÇ·ñ´æÔÚêdzÆCookie
$city = $_COOKIE["cookie_city"]; //ÏÔʾCookie±£´æµÄÊý¾Ý
}
else {
setcookie("cookie_city",$city,time()+3600*24); //´¿³õʼ»¯´Ë±äÁ¿
$_COOKIE["cookie_city"] = $city;
}
?>
HTML
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8"/>
<LINK href="css/css.css" type=text/css rel=stylesheet>
<SCRIPT src="js/jquery-1.4.2.min.js" type=text/javascript></SCRIPT>
<title>城市切換</title>
</head>
<BODY>
<DIV class=selCity id=allCity style="DISPLAY: none">
<DIV class=area>
<TABLE>
<TBODY>
<TR>
<TD><A class=cur href="show.html">玄武區(qū)</A></TD>
<TD><A href="show1.html">仙林</A></TD>
<TD><A href="show2.html">秦淮區(qū)</A></TD>
<TD><A href="show3.html">鼓樓</A></TD>
<TD><A href="show4.html">江寧</A></TD>
<TD><A href="show5.html">棲霞區(qū)</A></TD>
</TR>
</TBODY></TABLE>
<DIV class=none><A id=foldin href="javascript:;">全部</A></DIV></DIV></DIV>
<DIV class=header>
<DIV class=area>
<DIV class=r>
<DIV class="topCtiy clear">
<UL>
<LI class=i1><A href="index.php">全部小區(qū)</A></LI>
<LI class=i1>
<?php
echo $city;
?>
</LI>
<LI class=i2 id=changeCity>切換城市</LI>
</UL>
</DIV>
</DIV>
</DIV>
</DIV>
<SCRIPT type=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>
另外附上網(wǎng)友的實(shí)現(xiàn)方法:
使用方法:解壓后QQWry.Dat就是我們想要IP地址數(shù)據(jù)庫(kù),我們新建一個(gè)ipcity文件夾,將數(shù)據(jù)庫(kù)放在下面。QQ IP數(shù)據(jù)庫(kù)使用非常方便,數(shù)據(jù)也很齊全,你可以及時(shí)關(guān)注官方更新以保持?jǐn)?shù)據(jù)最新,強(qiáng)力推薦一下:)
接下來(lái),我們?cè)谏厦娴膇pcity目錄下新建一個(gè)ipaddress.php文件,直接復(fù)制以下代碼進(jìn)去即可,重要的地方也作了相應(yīng)注釋。B段:
<?
/*
函數(shù)名稱(chēng):ipCity
參數(shù)說(shuō)明:$userip——用戶(hù)IP地址
函數(shù)功能:PHP通過(guò)IP地址判斷用戶(hù)所在城市
author:lee
contact:xpsem2010@gmail.com
*/
function ipCity($userip) {
//IP數(shù)據(jù)庫(kù)路徑,這里用的是QQ IP數(shù)據(jù)庫(kù) 20110405 純真版
$dat_path = 'QQWry.dat';
//判斷IP地址是否有效
if(!ereg("^([0-9]{1,3}.){3}[0-9]{1,3}$", $userip)){
return 'IP Address Invalid';
}
//打開(kāi)IP數(shù)據(jù)庫(kù)
if(!$fd = @fopen($dat_path, 'rb')){
return 'IP data file not exists or access denied';
}
//explode函數(shù)分解IP地址,運(yùn)算得出整數(shù)形結(jié)果
$userip = explode('.', $userip);
$useripNum = $userip[0] * 16777216 + $userip[1] * 65536 + $userip[2] * 256 + $userip[3];
//獲取IP地址索引開(kāi)始和結(jié)束位置
$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個(gè)字節(jié)
fseek($fd, $useripbegin + 7 * $Middle);
$useripData1 = fread($fd, 4);
if(strlen($useripData1) < 4) {
fclose($fd);
return 'File Error';
}
//提取出來(lái)的數(shù)據(jù)轉(zhuǎn)換成長(zhǎng)整形,如果數(shù)據(jù)是負(fù)數(shù)則加上2的32次冪
$userip1num = implode('', unpack('L', $useripData1));
if($userip1num < 0) $userip1num += pow(2, 32);
//提取的長(zhǎng)整型數(shù)大于我們IP地址則修改結(jié)束位置進(jìn)行下一次循環(huán)
if($userip1num > $useripNum) {
$EndNum = $Middle;
continue;
}
//取完上一個(gè)索引后取下一個(gè)索引
$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地址對(duì)應(yīng)城市
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地址對(duì)應(yīng)的城市結(jié)果
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根據(jù)IP地址實(shí)現(xiàn)城市切換或跳轉(zhuǎn)
到這里,其實(shí)問(wèn)題已經(jīng)很簡(jiǎn)單了,用簡(jiǎn)單的js就通通搞定。C段如下:
//根據(jù)IP地址跳轉(zhuǎn)指定頁(yè)面js取得城市
var city='<?echo ipCity($xp_UserIp);?>';
//根據(jù)IP地址所有城市跳轉(zhuǎn)到指定頁(yè)面
if(city.indexOf("上海市")>=0){
window.location.;
}
將開(kāi)頭的A段代碼和上面的C段代碼分別放在B段代碼的頭和尾,然后我們?cè)谛枰D(zhuǎn)的頁(yè)面加入以下代碼:
<script src="/ipcity/ipaddress.php" type="text/javascript" language="javascript"></script>
刷新頁(yè)面,是不是達(dá)到預(yù)想的效果了呢?
以上就是PHP獲取IP地址、PHP根據(jù)IP地址判斷城市以及PHP根據(jù)IP地址實(shí)現(xiàn)城市切換或跳轉(zhuǎn)的詳細(xì)介紹了,事實(shí)上,像PHP中通過(guò)IP地址自動(dòng)切換城市就是這個(gè)方法的典型應(yīng)用。舉一反三,我們通過(guò)這種方法,也可以實(shí)現(xiàn)屏蔽指定IP地址或城市的用戶(hù)訪問(wèn),自己研究一下吧,也挺簡(jiǎn)單的:)
相關(guān)文章
php實(shí)現(xiàn)將wav文件轉(zhuǎn)換成圖像文件并在頁(yè)面中顯示的方法
這篇文章主要介紹了php實(shí)現(xiàn)將wav文件轉(zhuǎn)換成圖像文件并在頁(yè)面中顯示的方法,涉及php中unpack、fopen、fread等方法及圖形操作的相關(guān)技巧,需要的朋友可以參考下2015-04-04
dedecms采集中可以過(guò)濾多行代碼的正則表達(dá)式
dedecms采集中可以過(guò)濾多行代碼的正則表達(dá)式...2007-03-03
Swoole 5將移除自動(dòng)添加Event::wait()特性詳解
這篇文章主要給大家介紹了關(guān)于Swoole 5將移除自動(dòng)添加Event::wait()特性的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Swoole5具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
PHP使用redis實(shí)現(xiàn)分布式鎖的示例詳解
分布式鎖是控制分布式系統(tǒng)之間同步訪問(wèn)共享資源的一種方式。實(shí)現(xiàn)分布式鎖的原理很簡(jiǎn)單,本文就將利用redis實(shí)現(xiàn)分布式鎖,感興趣的可以了解一下2022-11-11
通過(guò)具體程序來(lái)理解PHP里面的抽象類(lèi)
面向?qū)ο蟪绦蛲ㄟ^(guò)類(lèi)的分層結(jié)構(gòu)構(gòu)建起來(lái). 在單重繼承語(yǔ)言如PHP中, 類(lèi)的繼承是樹(shù)狀的. 一個(gè)根類(lèi)有一個(gè)或更多的子類(lèi),再?gòu)拿總€(gè)子類(lèi)繼承出一個(gè)或更多下一級(jí)子類(lèi).2010-01-01
PHP正則表達(dá)式函數(shù)preg_replace用法實(shí)例分析
這篇文章主要介紹了PHP正則表達(dá)式函數(shù)preg_replace用法,結(jié)合實(shí)例形式分析了PHP正則表達(dá)式函數(shù)preg_replace基本功能、參數(shù)描述與相關(guān)使用技巧,需要的朋友可以參考下2020-06-06

