用PHP ip2long功能转换时的IP地址获取存储为0(IP addresses get stor

2019-10-16 22:15发布

在MySQL中newsletter_ip字段被设置成unsigned int(10)。 我也试着INET_ATON对数据进行格式化,但我总是结果看起来像这样 。

这里是我的处理代码的一部分:

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

任何帮助将不胜感激,谢谢!

Answer 1:

对于你的问题的根本原因,ip2long给出了一个符号整数作为PHP手册指出:

注意:

由于PHP的整数类型是有符号的,很多IP地址会导致在32位架构负整数,你需要使用“%U”的sprintf()或printf()函数的格式来获得无符号的IP地址的字符串表示。

而你将其存储为一个unsigned int,这就是为什么你看到ONY零的原因。 对于标准和清洁液处理IPv6的其他人已经给出了解决方案。



Answer 2:

Since an IP address has several dots in it, or it may be a IPv6 address, I would suggest you set the newsletter_ip field as a VARCHAR

Right now your IP addresses may be showing up as 0 because they are not actually integers.



Answer 3:

是否打印出存储给你正确的值之前的IP? 如果没有,检查是否存在代理从请求删除该信息,或者将其重命名。

不管怎么说,存在只要存储IP没有收获。 不应该有在性能上有显着的损失,如果你使用一个字符串此字段这是更简单的,更容易处理。 虽然你在它,留下足够的空间IPv6的;-)



Answer 4:

如何让MySQL的翻译使用IP INET_ATON在服务器端?

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


Answer 5:

使用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;
}


Answer 6:

您存储长达一个字符串,而不是作为一项长期的。

你也推迟作出在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 =号码到地址



文章来源: IP addresses get stored as 0 when converting with PHP ip2long function