2012-06-26 3 views
1

MySQL의 newsletter_ip 필드가 UNSIGNED INT (10)로 설정되었습니다. 또한 데이터 형식을 지정하기 위해 INET_ATON을 시도했지만 결과는 항상 this처럼 보입니다. , 어떤 도움이 많이 주시면 감사하겠습니다PHP ip2long 함수로 변환 할 때 IP 주소가 0으로 저장됩니다.

if (!empty($_SERVER['HTTP_CLIENT_IP'])){ 
    $ip=$_SERVER['HTTP_CLIENT_IP']; 
}elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){ 
    $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; 
}else{ 
    $ip=$_SERVER['REMOTE_ADDR']; 
} 

: 나는 또한 아무 소용는 ip2long 포맷하기 전에이 조각을 시도했습니다

//Retrieve data from user and create variables 

$ip_orig = $_SERVER['REMOTE_ADDR']; 

$ip = ip2long($ip_orig); 

//Place into database 

$sql = "INSERT INTO newsletter(newsletter_email, newsletter_ip, newsletter_date, newsletter_time) VALUES('".$email."', '".$ip."', '".$date."', '".$time."')"; 

: 여기

내 처리 코드의 일부입니다 감사! IP 주소가 여러 점을 가지고, 또는이 IPv6 주소가 될 수 있기 때문에

+2

IP 주소에 문자열 대신 varchar (15)를 사용해보십시오. – andrewsi

+0

[X-Forwarded-For를 신뢰할 수 없습니다.] (http://stackoverflow.com/a/3003233/238978)! –

+0

나는 당신이 범위를 벗어난 값을 보내고 있다고 생각한다. BIGINT 또는 VARCHAR을 사용하여 문자열로 저장하십시오. 또한 IPv6 주소를 고려할 것입니다. – Kermit

답변

0

, 나는 지금 당신의 IP 주소는 0으로 게재 될 수 있습니다 당신은 VARCHAR

로 newsletter_ip 필드를 설정 제안들이 있기 때문에 실제로 정수가 아닙니다.

0

long을 long이 아닌 string으로 저장합니다. ,

$sql = "INSERT INTO newsletter(newsletter_email, newsletter_ip, newsletter_date, newsletter_time) VALUES ('".$email."', INET_ATON('".$ip."'), '".$date."', '".$time."')"; 

IP 주소를 retreive하려면 수행합니다 :

당신은 또한 MySQL의 자체 변환을 만드는 것이 더 낫다

SELECT INET_NTOA(newsletter_ip) as newsletter_ip FROM newsletter; 

INET_ATON = 주소

INET_NTOA 번호를하는 = 수 주소 :

+0

이것은 매우 도움이됩니다, 감사합니다! – Qing

0

IP를 저장하기 전에 올바른 값을 주시겠습니까? 그렇지 않은 경우 요청에서이 정보를 제거하거나 이름을 바꾸는 프록시가 있는지 확인하십시오.

어쨌든, ip를 길게 저장할 때 이득이 없습니다. 훨씬 간단하고 조작하기 쉬운이 필드에 문자열을 사용하면 성능이 크게 저하되지 않습니다. 그리고 당신이 그것에있는 동안, IPv6를위한 충분한 공간을 남겨 두십시오 :-)

+0

프록시는'$ _SERVER [ 'REMOTE_ADDR']'을 (를) 제거 할 수 없습니다. 그것은 서버 측입니다. 아파치는 모두 알고있다. –

+0

동일한 컴퓨터의 웹 서버 앞에있는 로컬 프록시 인 경우 항상 127.0.0.1로 설정됩니다. – Roben

+0

같은 컴퓨터에서 실행되는이 프록시에 대해 알고 있지만 어쨌든 127.0.0.1은 여전히 ​​IP 주소입니다. –

0

MySQL이 서버 측에서 INET_ATON을 사용하여 IP를 변환하도록하는 방법은 어떻습니까? 문제의 근본 원인에 대한

function ip() 
{ 
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) 
    { 
     $ip = $_SERVER['HTTP_CLIENT_IP']; 
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) 
    { 
     $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; 
    } 
    else 
    { 
     $ip = $_SERVER['REMOTE_ADDR']; 
    } 
    return $ip; 
} 
0

사용 VARCHAR (15) 분으로 ... VARCHAR (45), 여기 내 IP 기능입니다 PHP를 수동 상태로 서명 INT를 제공합니다

참고 :

PHP의 정수형은 부호가 존재하기에, 많은 IP 주소가 negat을 초래할 것이기 때문에 32 비트 아키텍처에서 정수를 사용하려면 sprintf() 또는 printf()의 "% u"포맷터를 사용하여 서명되지 않은 IP 주소의 문자열 표현을 가져와야합니다.

그리고 부호없는 정수으로 저장하면 ony 0이 표시됩니다. IPv6을 다루는 표준적이고 깨끗한 솔루션을 위해서 다른 사람들은 이미 해결책을 제시해 놓았습니다.

1

, ip2long : 새로운 IPv6 주소를 지원하는

//Retrieve data from user and create variables 

$ip_orig = $_SERVER['REMOTE_ADDR']; 

//Place into database 

$sql = "INSERT INTO newsletter(newsletter_email, newsletter_ip, newsletter_date, newsletter_time) VALUES('".$email."', INET_ATON('".$ip."'), '".$date."', '".$time."')"; 
관련 문제