【发布时间】:2011-08-07 05:20:35
【问题描述】:
我使用来自 (http://www.iplocationtools.com) 的 javascript API 向我提供来自访问者 IP 的位置数据。出于某种原因,他们的 API 不会给我访问者的实际 IP,只是其他信息,这就是为什么我必须使用 PHP 和 CodeIgniter 来给我 IP。
所以我使用 CodeIgniter/PHP 获取访问者的 IP,并使用 PHP 的 ip2long([ip 代码点火器给我])将其与上面的位置数据一起添加到数据库中
当我的数据库表看起来像这样时,我很困惑:http://pulse.media.mit.edu/images/1.png
哪里错了?我很想相信 CodeIgniter 是错误的,因为它多次给我相同的 IP。年龄和性别是自我报告的,我怀疑所有这些信息都是由一个人编造的。
归根结底,我们真正需要的只是用户 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() { if ($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;
}
【问题讨论】:
-
你能告诉我们你使用 CodeIgniter/PHP 获取 IP 地址的代码吗?
-
您所有 IP 的数量是 32 位有符号整数 (en.wikipedia.org/wiki/2147483647#2147483647_in_computing) 的最大值,所以我的想法是 codeigniter 为每个人的 IP 提供类似 255.255.255.255 的值,或者您在从 codeigniter 获取它并将其存储在数据库中之间的某个地方重新处理它。您是否尝试回显从 codeigniter 获得的 IP 地址以查看它是否有效?
-
我添加了上面的代码段。
-
你能确认
$this->input->ip_address()返回一个有效的IP地址吗? -
有一个函数 valid_ip() 但如果返回 false,我仍然需要用户 IP 来跟踪他们在世界上的位置。那不可能吗?我之前使用的 javascript API 似乎可以将大多数用户解析到某个位置。如果我连IP都拿不到,他们会编造吗?如果他们只让我拥有访问者的 IP 会更容易,但他们没有。
标签: php javascript mysql codeigniter geolocation