使用PHP ip2long函数进行转换时,IP地址存储为0

时间:2012-06-26 15:27:38

标签: php mysql ip ip-address

MySQL中的newsletter_ip字段设置为UNSIGNED INT(10)。我也尝试过INET_ATON来格式化数据,但我的结果总是看起来像this

以下是我的处理代码的一部分:

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

非常感谢任何帮助,谢谢!

6 个答案:

答案 0 :(得分:1)

找出问题的根本原因,ip2long提供了一个签名 int,如PHP手册所示:

注意:

因为PHP的整数类型是有符号的,并且许多IP地址将在32位体系结构上产生负整数,所以需要使用sprintf()或printf()的“%u”格式化程序来获取字符串表示形式。未签名的IP地址。

然后将其存储为 unsigned int ,这就是为什么你看到ony零的原因。对于处理IPv6的标准和清洁解决方案,其他人已经提供了解决方案。

答案 1 :(得分:0)

由于IP地址中有多个点,或者它可能是IPv6地址,我建议您将newsletter_ip字段设置为VARCHAR

现在你的IP地址可能显示为0,因为它们实际上不是整数。

答案 2 :(得分:0)

您将long存储为字符串,而不是长字符。

你最好还是在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 =要解决的号码

答案 3 :(得分:0)

在存储之前打印出ip会给出正确的值吗?如果没有,请检查是否存在从请求中删除此信息或重命名的代理。

无论如何,存储ip的时间并没有增加。如果你在这个领域使用一个更简单直接且更容易处理的字符串,那么性能不会有明显的损失。当你在这里时,为IPv6留出足够的空间; - )

答案 4 :(得分: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."')";

答案 5 :(得分:0)

使用varchar(15)作为min ... 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;
}