1

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

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

4

6 回答 6

1

对于您的问题的根本原因,ip2long 给出了一个签名的int,如 PHP 手册所述:

笔记:

因为 PHP 的整数类型是有符号的,而且很多 IP 地址在 32 位架构上会产生负整数,所以需要使用 sprintf() 或 printf() 的 "%u" 格式化器来获取无符号 IP 地址的字符串表示.

并且您将其存储为unsigned int,这就是您看到只有零的原因。对于处理 IPv6 的标准且干净的解决方案,其他人已经给出了解决方案。

于 2012-06-26T15:35:30.823 回答
0

使用 varchar(15) as 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;
}
于 2012-06-26T15:35:28.037 回答
0

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

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

于 2012-06-26T15:31:54.747 回答
0

您将 long 存储为字符串,而不是 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= 号码到地址

于 2012-06-26T15:32:02.423 回答
0

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

无论如何,长时间存储ip没有任何好处。如果您为此字段使用更直接且更易于处理的字符串,则性能不会有显着损失。当您使用它时,请为 IPv6 留出足够的空间;-)

于 2012-06-26T15:32:10.940 回答
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."')";
于 2012-06-26T15:33:01.143 回答