2012-09-17 3 views
0

방금 ​​전에 구입 한 웹 서버에 내 웹 사이트를 업로드하면 컴퓨터에서 모든 것이 완벽하게 작동합니다. 하지만 지금은 데이터베이스에 데이터를 삽입 할 때 문제가 발생했습니다. 삽입 된 모든 행에 삽입되는 행을 만드는 사용자의 IP 주소로 문제를 추적했습니다.PHP가 내 데이터베이스에 ip2long을 삽입 할 때 문제가 발생했습니다.

나는 ip2long 값을 반환하는 PHP 함수를 가지고 있고 그것은 다음과 같습니다

다음
function ip2() 
    { 
     return ip2long($_SERVER['REMOTE_ADDR']); 
    } 

내 데이터베이스에 삽입하기 위해 SQL 코드는 다음과 같습니다

$sql = "INSERT INTO `Users` 
        (
         `Username`, 
         `Password`, 
         `Email`, 
         `ip_created` 
        ) 
        VALUES 
        (
         '".$db->sql_escape(htmlspecialchars($this->username, ENT_QUOTES))."', 
         '".$db->sql_escape($this->secure_pass)."', 
         '".$db->sql_escape($this->clean_email)."', 
         '".ip2()."' 
        )"; 

$db->sql_query($sql)) 

ip_created 필드는 길이가 int이고 길이가

입니다.

데이터베이스 상호 작용은 모두 PHP 클래스에서 처리됩니다. 문제가 될 수 있습니다.

나는 문제가 어디에서 유래했는지 알지 못하고 정말로 내 문제를 일으키기 시작했다. 모든 것이 내 localhost 버전에서 완벽하게 작동했습니다. 당신이 64 비트 시스템을 실행하는 경우

+2

'ip2long()'은 32 비트 시스템에서 음수를 반환 할 수 있습니다. 데이터베이스 필드가'INT UNSIGNED'이라면 게임이 올바르게 실행되지 않습니다. 나는 개인적으로 IP 주소를''(N ')'포장하여'VARBINARY (4)'로 저장하는 것을 선호한다. YMMV – DaveRandom

답변

2

id2long man page comments contain:

주의, ip2long는 MySQL의 INT에 맞지 않는 64 비트 정수를 발생합니다, 당신은 때문에 64 비트 시스템에서 BIGINT 또는 INT 이 UNSIGNED 사용할 수 있습니다 ip2long 는 음수 인 정수를 반환하지 않습니다. 또한 https://bugs.php.net/bug.php?id=54338

원인이 될 수 있습니까?

+0

이것은 이상한 문제처럼 보인다. 64 비트 시스템은 'ip2long()'의 반환 값을 64 비트 정수로 저장하지만 문자열에 캐스트 될 때 (쿼리에서 사용하기 위해) 반영되지 않습니다. MySQL 데이터 유형이 데이터를 저장할 수있을만큼 크면 PHP *에서 사용되는 정수 유형은 부적합해야합니다. – DaveRandom

+0

이 문제는''printf ("% u", ip2long ($ _ SERVER [ 'REMOTE_ADDR']));''를 사용하여 항상 양수 값을 얻었고''int'' 대신''bigint''를 사용하도록 수정했습니다. . 그러나 예를 들어 생성 된 난수로 행을 삽입 할 때 작동하지 않는 것들이 여전히 있습니다. ''int'' 필드를''bigint''로 변경해야 작동 할 수 있습니까? –

관련 문제