2012-06-26 30 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的标准和干净的解决方案,其他人已经提供了解决方案。