2011-08-07 10 views
0

私は訪問者IPからの位置データを私に与えるために(http://www.iplocationtools.com)のjavascript APIを使用します。何らかの理由で、彼らのAPIは私に訪問者の実際のIPを与えることはありません。ちょうど他の情報なので、代わりにPHPとCodeIgniterを使用しなければなりません。IPアドレスは信頼できないPHPを使用

だから私は私は

([IPコードの点火が私を与える])、訪問者のIPを取得し、PHPのip2longを使って、上からの位置データとともにデータベースに追加するには、CodeIgniterの/ PHPを使用します私のデータベーステーブルが次のようになると混乱します: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)として保存されているデータベースに挿入しCodeIgniterの

からIPアドレスを取得するために使用しているコードがあります。

そしてここでは、関数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; 
} 
+1

CodeIgniter/PHPでIPアドレスを取得するために使用しているコードを表示できますか? – janiv

+0

あなたのすべてのIPの番号は、32ビット符号付き整数の最大値です(http://en.wikipedia.org/wiki/2147483647#2147483647_in_computing)。私の考えは、どちらかのcodeigniterが255.255.255.255のようなものを皆のために与えることですIPを使用しているか、codeigniterから取得してDBに格納する間のどこかで誤って処理しています。 codeigniterから取得したIPアドレスをエコーし​​て、有効かどうか確認しましたか? – wolv2012

+0

上記のコードセグメントを追加しました。 –

答えて

1

コードに基づいて、$this->input->ip_address()は、IPが有効でないか、または判別できなかった場合、「0.0.0.0」を返す可能性があります。しかし、あなたのコメントは、上記のメソッドが '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']を使用することができませんでした。

6

$_SERVER['REMOTE_ADDR']ページを見た人のIPアドレスを返すためにPHPコードです。

2

ip2long()の旧バージョンは、IPv4アドレスが無効な場合は-1を返します。代わりにinet_ptonを使用し、それを保持するために使用されるフィールドを128ビットに拡張することができます。

関連する問題