我使用来自 (http://www.iplocations.com) 的 javascript API 为我提供来自访问者 IP 的位置数据。出于某种原因,他们的 API 不会给我访问者的实际 IP,只会给我其他信息,这就是为什么我必须使用 PHP 和 CodeIgniter 来给我 IP。
所以我使用 CodeIgniter/PHP 获取访问者的 IP,并使用 PHP 的 ip2long([the ip code igniter gives me]) 将其与上面的位置数据一起添加到数据库
当我的数据库表看起来像这样时,我很困惑:http://pulse.media.mit.edu/images/1.png
哪个错了?我很想相信 CodeIgniter 是错误的,因为它多次给我相同的 IP。年龄和性别是 self 报告的,我怀疑有人在编造所有这些信息。
归根结底,我们真正需要的只是用户的 IP 和位置,最好来自同一来源,这样我们就不会出现错误。
有人对如何做到这一点有更好的想法吗?
编辑:这是我用来从 CodeIgniter 获取 IP 地址的代码
$data['ip_address'] = ip2long($this->input->ip_address());
$this->pulse_model->voter_info($data);
然后 voter_info 函数只是将它插入到数据库中,在那里它被存储为一个 INT(11)。
这里是 ip_address 函数:
函数 ip_address() { 如果 ($this->ip_address !== FALSE) { 返回 $this->ip_address;
if (config_item('proxy_ips') != '' && $this->server('HTTP_X_FORWARDED_FOR') && $this->server('REMOTE_ADDR'))
{
$proxies = preg_split('/[\s,]/', config_item('proxy_ips'), -1, PREG_SPLIT_NO_EMPTY);
$proxies = is_array($proxies) ? $proxies : array($proxies);
$this->ip_address = in_array($_SERVER['REMOTE_ADDR'], $proxies) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
}
elseif ($this->server('REMOTE_ADDR') AND $this->server('HTTP_CLIENT_IP'))
{
$this->ip_address = $_SERVER['HTTP_CLIENT_IP'];
}
elseif ($this->server('REMOTE_ADDR'))
{
$this->ip_address = $_SERVER['REMOTE_ADDR'];
}
elseif ($this->server('HTTP_CLIENT_IP'))
{
$this->ip_address = $_SERVER['HTTP_CLIENT_IP'];
}
elseif ($this->server('HTTP_X_FORWARDED_FOR'))
{
$this->ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
if ($this->ip_address === FALSE)
{
$this->ip_address = '0.0.0.0';
return $this->ip_address;
}
if (strpos($this->ip_address, ',') !== FALSE)
{
$x = explode(',', $this->ip_address);
$this->ip_address = trim(end($x));
}
if ( ! $this->valid_ip($this->ip_address))
{
$this->ip_address = '0.0.0.0';
}
return $this->ip_address;
}
最佳答案
$_SERVER['REMOTE_ADDR']
是返回查看页面的人的 IP 地址的 PHP 代码。
关于php - 使用 PHP 的 IP 地址不可靠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6970901/