首頁 > 後端開發 > php教程 > PHP中如何取得用戶IP位址

PHP中如何取得用戶IP位址

墨辰丷
發布: 2023-03-30 14:42:02
原創
3137 人瀏覽過

本文主要分享給大家的是PHP如何取得用戶IP位址、PHP根據IP判斷用戶所在城市以及PHP依據IP實現城市切換或跳轉的問題。

我們先來看下個人常用的程式碼

PHP

<?php
include_once(&#39;./qqwry.php&#39;);
$QQWry=new QQWry; 
 
function get_real_ip(){
$ip=false;
if(!empty($_SERVER["HTTP_CLIENT_IP"])){
$ip = $_SERVER["HTTP_CLIENT_IP"];
}
if (!empty($_SERVER[&#39;HTTP_X_FORWARDED_FOR&#39;])) {
$ips = explode (", ", $_SERVER[&#39;HTTP_X_FORWARDED_FOR&#39;]);
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[&#39;REMOTE_ADDR&#39;]; 
$ifErr=$QQWry->QQWry($ip); 
$city = $QQWry->Country.$QQWry->Local;
 
//echo $city;*/
 
 
if (strpos($city,&#39;玄武区&#39;)!==false){
  $city = "玄武区";
}
else if(strpos($city,&#39;仙林&#39;)!==false){
  $city = "仙林";
}
else if(strpos($city,&#39;秦淮区&#39;)!==false){
  $city = "秦淮区";
}
else if(strpos($city,&#39;江宁&#39;)!==false){
  $city = "江宁";
}
else if(strpos($city,&#39;鼓楼&#39;)!==false){
  $city = "鼓楼";
}
else{
  $city = "栖霞";
}
if (isset($_GET[&#39;chengshi&#39;])) { //Ê×Ïȼì²âÊÇ·ñ»ñµÃÁË GET ´«µÝµÄÊý¾Ý  
setcookie("cookie_city",$_GET[&#39;chengshi&#39;],time()+3600*24);
$city = $_GET[&#39;chengshi&#39;]; 
} 
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>
<p class=selCity id=allCity style="DISPLAY: none">
<p class=area>
<TABLE>
 <TBODY>
 <TR>
  <TD><A class=cur href="show.html">玄武区</A></TD>
  <TD><A href="show1.html">仙林</A></TD>
  <TD><A href="show2.html">秦淮区</A></TD>
  <TD><A href="show3.html">鼓楼</A></TD>
  <TD><A href="show4.html">江宁</A></TD>
  <TD><A href="show5.html">栖霞区</A></TD>
 </TR>
 </TBODY></TABLE>
<p class=none><A id=foldin href="javascript:;">全部</A></p></p></p>
<p class=header>
  <p class=area>
    <p class=r>
      <p class="topCtiy clear">
        <UL>
         
        <LI class=i1><A href="index.php">全部小区</A></LI>
         
         <LI class=i1>
         <?php 
         echo $city; 
         ?>
         </LI>
         <LI class=i2 id=changeCity>切换城市</LI>
        </UL>
      </p>
    </p>
  </p>
</p>
<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>
登入後複製

另外附上網友的實作方法:

使用方法:解壓縮後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 = &#39;QQWry.dat&#39;;
  //判断IP地址是否有效
  if(!ereg("^([0-9]{1,3}.){3}[0-9]{1,3}$", $userip)){
    return &#39;IP Address Invalid&#39;;
  }
  //打开IP数据库
  if(!$fd = @fopen($dat_path, &#39;rb&#39;)){
    return &#39;IP data file not exists or access denied&#39;;
  }
  //explode函数分解IP地址,运算得出整数形结果
  $userip = explode(&#39;.&#39;, $userip);
  $useripNum = $userip[0] * 16777216 + $userip[1] * 65536 + $userip[2] * 256 + $userip[3];
  //获取IP地址索引开始和结束位置
  $DataBegin = fread($fd, 4);
  $DataEnd = fread($fd, 4);
  $useripbegin = implode(&#39;&#39;, unpack(&#39;L&#39;, $DataBegin));
  if($useripbegin < 0) $useripbegin += pow(2, 32);
  $useripend = implode(&#39;&#39;, unpack(&#39;L&#39;, $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 &#39;File Error&#39;;
    }
    //提取出来的数据转换成长整形,如果数据是负数则加上2的32次幂
    $userip1num = implode(&#39;&#39;, unpack(&#39;L&#39;, $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 &#39;File Error&#39;;
    }
    $DataSeek = implode(&#39;&#39;, unpack(&#39;L&#39;, $DataSeek.chr(0)));
    fseek($fd, $DataSeek);
    $useripData2 = fread($fd, 4);
    if(strlen($useripData2) < 4) {
      fclose($fd);
      return &#39;File Error&#39;;
    }
    $userip2num = implode(&#39;&#39;, unpack(&#39;L&#39;, $useripData2));
    if($userip2num < 0) $userip2num += pow(2, 32);
    //找不到IP地址对应城市
    if($userip2num < $useripNum) {
      if($Middle == $BeginNum) {
        fclose($fd);
        return &#39;No Data&#39;;
      }
      $BeginNum = $Middle;
    }
  }
  $useripFlag = fread($fd, 1);
  if($useripFlag == chr(1)) {
    $useripSeek = fread($fd, 3);
    if(strlen($useripSeek) < 3) {
      fclose($fd);
      return &#39;System Error&#39;;
    }
    $useripSeek = implode(&#39;&#39;, unpack(&#39;L&#39;, $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 &#39;System Error&#39;;
    }
    $useripFlag = fread($fd, 1);
    if($useripFlag == chr(2)) {
      $AddrSeek2 = fread($fd, 3);
      if(strlen($AddrSeek2) < 3) {
        fclose($fd);
        return &#39;System Error&#39;;
      }
      $AddrSeek2 = implode(&#39;&#39;, unpack(&#39;L&#39;, $AddrSeek2.chr(0)));
      fseek($fd, $AddrSeek2);
    } else {
      fseek($fd, -1, SEEK_CUR);
    }
    while(($char = fread($fd, 1)) != chr(0))
      $useripAddr2 .= $char;
    $AddrSeek = implode(&#39;&#39;, unpack(&#39;L&#39;, $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 &#39;System Error&#39;;
      }
      $AddrSeek2 = implode(&#39;&#39;, unpack(&#39;L&#39;, $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(&#39;/http/i&#39;, $useripAddr2)) {
    $useripAddr2 = &#39;&#39;;
  }
  $useripaddr = "$useripAddr1 $useripAddr2";
  $useripaddr = preg_replace(&#39;/CZ88.Net/is&#39;, &#39;&#39;, $useripaddr);
  $useripaddr = preg_replace(&#39;/^s*/is&#39;, &#39;&#39;, $useripaddr);
  $useripaddr = preg_replace(&#39;/s*$/is&#39;, &#39;&#39;, $useripaddr);
  if(preg_match(&#39;/http/i&#39;, $useripaddr) || $useripaddr == &#39;&#39;) {
    $useripaddr = &#39;No Data&#39;;
  }
  return $useripaddr;
}
?>
登入後複製

PHP根據IP位址實現城市切換或跳轉

到這裡,其實問題已經很簡單了,用簡單的js就通通搞定。 C段如下:

//根据IP地址跳转指定页面js取得城市
var city=&#39;<?echo ipCity($xp_UserIp);?>&#39;;
//根据IP地址所有城市跳转到指定页面
if(city.indexOf("上海市")>=0){
    window.location.href="http://shanghai.demo.com/";
}
登入後複製

將開頭的A段程式碼和上面的C段程式碼分別放在B段程式碼的頭和尾,然後我們在需要跳躍的頁面加入以下程式碼:

刷新頁面,是不是達到預想的效果了呢?

總結:以上就是這篇文章的全部內容,希望能對大家的學習有所幫助。

相關推薦:

PHP實作基於DOMDocument解析與產生xml的方法詳解

PHP實作基於XMLWriter操作xml的方法

PHP基於物件導向mysqli擴充函式庫增刪改查操作工具類別的方法

以上是PHP中如何取得用戶IP位址的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板