如何通过php获取clint IPv4地址

如何通过php获取clint IPv4地址,php,mysql,Php,Mysql,我整天都在尝试各种方法来获取同一服务器中每个客户机的真实id。所以我试着用ip作为id 我与php合作,希望在Mysql中获得注册用户ip,也用于基于ip的投票系统 但我不知道如何为每个客户端获取IPv4地址。因为 起初,我试图得到我自己的ip测试 在我的一台笔记本电脑上(宽带连接细节处),我发现: 以及同一网络中的另一台笔记本电脑,但连接不同: Clint IPv4 address: 172.xx.yy.444 Server IPv4 address: 172.xx.yy.2 Whatis

我整天都在尝试各种方法来获取同一服务器中每个客户机的真实id。所以我试着用ip作为id

我与php合作,希望在Mysql中获得注册用户ip,也用于基于ip的投票系统

但我不知道如何为每个客户端获取IPv4地址。因为 起初,我试图得到我自己的ip测试

在我的一台笔记本电脑上(宽带连接细节处),我发现:

以及同一网络中的另一台笔记本电脑,但连接不同:

Clint IPv4 address:  172.xx.yy.444
Server IPv4 address: 172.xx.yy.2

Whatismyipaddress.com show:  124.x.xxx.xx
My cPanel also show as same: 124.x.xxx.xx
所以我发现每台电脑的IPv4是不同的

现在,当我尝试获取IPv4地址时,我的每个代码都显示与whatismyip.com相同的internet ip

在这里,stackoverflow和google search中的所有方法都给出了与whatismyip.com相同的结果

对于这个问题,我也找不到任何好的或简单的答案

方法1:

function get_client_ip()
{
  $ipaddress = '';
  if (getenv('HTTP_CLIENT_IP'))
      $ipaddress = getenv('HTTP_CLIENT_IP');
  else if(getenv('HTTP_X_FORWARDED_FOR'))
      $ipaddress = getenv('HTTP_X_FORWARDED_FOR');
  else if(getenv('HTTP_X_FORWARDED'))
      $ipaddress = getenv('HTTP_X_FORWARDED');
  else if(getenv('HTTP_FORWARDED_FOR'))
      $ipaddress = getenv('HTTP_FORWARDED_FOR');
  else if(getenv('HTTP_FORWARDED'))
      $ipaddress = getenv('HTTP_FORWARDED');
  else if(getenv('REMOTE_ADDR'))
      $ipaddress = getenv('REMOTE_ADDR');
  else
      $ipaddress = 'UNKNOWN';

  return $ipaddress;
 }
 $ip = get_client_ip();
 echo $ip;
方法2:

function get_ip_address() {
$ip_keys = array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR');
foreach ($ip_keys as $key) {
    if (array_key_exists($key, $_SERVER) === true) {
        foreach (explode(',', $_SERVER[$key]) as $ip) {
            // trim for safety measures
            $ip = trim($ip);
            // attempt to validate IP
            if (validate_ip($ip)) {
                return $ip;
            }
        }
    }
}

return isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : false;
}

function validate_ip($ip)
{
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false) {
    return false;
}
return true;
}

$ip = get_ip_address();
echo $ip;

你想了解纳特的情况。显然,您在本地网络中(
172….
地址是一个保留的地址空间,在internet中不可路由)。该本地网络通过NAT连接到internet。对于本地网络之外的服务器,所有请求确实来自相同的IP地址,即NAT路由器的外部地址。这些都是基本的网络拓扑知识,你应该开始阅读这些知识。抱歉用错了词。编辑。谢谢你。我正在读。顺便说一句:这也是为什么基于IP的会话管理很少是一个好的起点。根据定义,它只能在非常特定的情况下工作,如内部网络。即使在那里,你也可能会经历有趣的惊喜。例如,几个人可能使用单个系统同时发送请求。您不能简单地依赖于“用户”和ip地址之间1:1关系的假设。谢谢您,先生。那么有没有其他方法来获取客户地址或信息,我可以公开使用?如果你说不;我的投票系统不在同一个网络中工作。!!!我想你不明白我解释了什么。再说一次:无论您如何确定地址,IP地址都不适合该任务。它并不是独一无二的。
function get_ip_address() {
$ip_keys = array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR');
foreach ($ip_keys as $key) {
    if (array_key_exists($key, $_SERVER) === true) {
        foreach (explode(',', $_SERVER[$key]) as $ip) {
            // trim for safety measures
            $ip = trim($ip);
            // attempt to validate IP
            if (validate_ip($ip)) {
                return $ip;
            }
        }
    }
}

return isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : false;
}

function validate_ip($ip)
{
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false) {
    return false;
}
return true;
}

$ip = get_ip_address();
echo $ip;