2011-08-07 84 views
0

我使用來自(http://www.iplocationtools.com)的JavaScript API向我提供來自訪問者IP的位置數據。出於某種原因,他們的API不會給我訪問者的實際IP,只是其他信息,這就是爲什麼我必須使用PHP和CodeIgniter來爲我提供IP。使用PHP的IP地址不可靠

於是我就用笨/ PHP獲取訪問者的IP,並從上面通過使用PHP的ip2long其與位置數據一起添加到數據庫中([知識產權法典點火器給了我])

我當我的數據庫表看起來像這樣:http://pulse.media.mit.edu/images/1.png

哪個錯誤?我很想相信CodeIgniter是錯誤的,因爲它給了我很多次相同的IP。年齡和性別是自我報告的,我懷疑有一個人正在彌補所有這些信息。

在一天結束時,我們真正需要的是用戶IP和位置,最好來自同一個源,因此我們不會混合錯誤。

任何人對如何做到這一點有更好的主意?

編輯:這是我使用從笨

$data['ip_address'] = ip2long($this->input->ip_address()); 
$this->pulse_model->voter_info($data); 

然後voter_info功能只是將其插入到那裏它存儲爲INT(11)數據庫中獲取IP地址的代碼。

這裏是功能IP地址:(!$這個 - > IP_ADDRESS = = FALSE)

功能IP_ADDRESS(){ 如果 { 回報 $這個 - > 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; 
} 
+1

您能告訴我們您使用的CodeIgniter/PHP獲取IP地址的代碼嗎? – janiv

+0

你所有IP的數量都是32位有符號整數的最大值(http://en.wikipedia.org/wiki/2147483647#2147483647_in_computing),所以我的想法是codeigniter給你的東西像255.255.255.255爲每個人的IP,或者你在將它從codeigniter中存儲到數據庫之間的某處處理不當。你是否嘗試迴應你從codeigniter獲得的IP地址以查看它是否有效? – wolv2012

+0

我添加了上面的代碼段。 –

回答

1

根據您的代碼,它看起來像$this->input->ip_address()有可能返回'0.0.0.0',如果IP無效或無法確定。但是,您的意見還表明,即使上述方法返回「0.0.0.0」,您也需要記錄該IP地址。

首先,我建議檢查$this->input->ip_address()$this->valid_ip()是否按預期工作。 $this->valid_ip()是否應該被認爲有效的IP返回false?

其次,如果$this->input->ip_address()返回'0.0.0.0',我會更新您的代碼以始終回退到$_SERVER['REMOTE_ADDR']

$ip_address = $this->input->ip_address(); 
if($ip_address == '0.0.0.0') { 
    $ip_address = $_SERVER['REMOTE_ADDR']; 
} 
$data['ip_address'] = ip2long($ip_address); 
$this->pulse_model->voter_info($data); 

或者,如果你願意,你可以不使用$this->input->ip_address()做的@rockerest建議,只需使用$_SERVER['REMOTE_ADDR']到與經。

$data['ip_address'] = ip2long($_SERVER['REMOTE_ADDR']); 
$this->pulse_model->voter_info($data); 
6

$_SERVER['REMOTE_ADDR']是PHP代碼返回瀏覽頁面的用戶的IP地址。

2

如果IPv4地址無效,舊版本的ip2long()將返回-1。您可能希望使用inet_pton,並擴展用於將其保持爲128位的字段。