Maison  >  Article  >  développement back-end  >  Comment obtenir l'adresse IP de l'utilisateur en PHP

Comment obtenir l'adresse IP de l'utilisateur en PHP

墨辰丷
墨辰丷original
2018-06-07 16:47:323069parcourir

Cet article vous explique principalement comment obtenir l'adresse IP de l'utilisateur en PHP, PHP détermine la ville où se trouve l'utilisateur en fonction de l'IP et PHP implémente le changement de ville ou le saut en fonction de l'IP.

Regardons d'abord les codes couramment utilisés par les particuliers

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>

De plus, la méthode d'implémentation des internautes est joint :

Comment utiliser : Après décompression, QQWry.Dat est la base de données d'adresses IP que nous voulons. Nous créons un nouveau dossier ipcity et plaçons la base de données ci-dessous. La base de données QQ IP est très pratique à utiliser et les données sont très complètes. Vous pouvez suivre les mises à jour officielles dans le temps pour maintenir les données à jour :)

Ensuite, nous en créons une nouvelle. ipaddress.php dans le répertoire ipcity ci-dessus, copiez-y simplement le code suivant, et les endroits importants sont également commentés en conséquence. Section 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 implémente le changement de ville ou le saut en fonction de l'adresse IP

Jusqu'ici, le problème est en fait très simple, et il peut être résolu avec de simples js. La section C est la suivante :

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

Mettre le code de la section A au début et le code de la section C ci-dessus respectivement au début et à la fin du code de la section B, puis on ajoute le code suivant au page qui doit être sautée :

780c2ce334ef204d6678887340170e2f2cacc6d41bbb37262a98f745aa00fbf0

Actualiser la page, est-ce comme prévu ?

Résumé : Ce qui précède est l'intégralité du contenu de cet article, j'espère qu'il sera utile à l'étude de chacun.

Recommandations associées :

Explication détaillée de la méthode d'analyse et de génération de XML basée sur DOMDocument en PHP

Implémentation PHP basée sur la méthode d'exploitation XML de XMLWriter

Méthode PHP d'ajout, de suppression, de modification et de vérification de la classe d'outils basée sur la bibliothèque d'extension mysqli orientée objet

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn