2012-06-26 28 views
1

MySQL中的newsletter_ip字段被設置爲UNSIGNED INT(10)。我也嘗試使用INET_ATON來格式化數據,但我的結果總是看起來像this當使用PHP ip2long函數進行轉換時,IP地址被存儲爲0

這裏是我的處理代碼的一部分:

//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."')"; 

我也試過這個片段之前ip2long格式,無濟於事:

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']; 
} 

任何幫助將不勝感激,謝謝!

+2

嘗試使用varchar(15)替代IP地址的字符串。 – andrewsi

+0

您[無法信任X-Forwarded-For](http://stackoverflow.com/a/3003233/238978)! –

+0

我相信你可能會發送超出範圍的值。使用BIGINT或VARCHAR以字符串形式存儲。我也會考慮IPv6地址。 – Kermit

回答

0

由於IP地址,它有幾個點,或者它可能是一個IPv6地址,我建議你設置newsletter_ip場爲VARCHAR

現在您的IP地址可能被顯示爲0,因爲他們實際上並不是整數。

0

您正在存儲的只是一個字符串,而不是一長串。

你也最好讓轉換在MySQL本身:

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

中檢索的IP地址,這樣做:

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

如果它是位於同一臺計算機上的Web服務器前面的本地代理,則它將始終設置爲127.0.0.1。 – Roben

+0

你會知道這個代理在同一臺機器上運行,但無論如何,127.0.0.1仍然是一個IP地址。 –

0

如何讓MySQL的轉換在服務器端使用INET_ATON的IP?

//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."')"; 
0

使用VARCHAR(15)分鐘...... VARCHAR(45),以支持新的IPv6地址,同時這裏是我的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; 
} 
1

你的問題的根本原因,ip2long給人以簽署 INT作爲PHP手冊指出:

注:

由於PHP的整數類型是有符號的,很多IP地址會導致negat在32位架構IVE整數,你需要使用「%U」的sprintf()或printf()函數的格式來獲得無符號的IP地址的字符串表示。

而你將它存儲爲unsigned int,這就是你看到ony零的原因。對於處理IPv6的標準和乾淨的解決方案,其他人已經提供瞭解決方案。