【问题标题】:PHP having an issue inserting a ip2long into my databasePHP 在将 ip2long 插入我的数据库时遇到问题
【发布时间】:2012-09-09 17:22:52
【问题描述】:

所以我将我的网站上传到我刚购买的网络服务器上,一切都在我的计算机上运行良好。但是现在我在我的数据库中插入数据时遇到了问题,我将问题追查到创建插入的每一行中插入的行的用户的 IP 地址。

我有一个返回 ip2long 值的 php 函数,它看起来像这样:

function ip2()
    {
        return ip2long($_SERVER['REMOTE_ADDR']);
    }

然后将其插入到我的数据库中,sql 代码如下所示:

$sql = "INSERT INTO `Users` 
                    (
                        `Username`,
                        `Password`,
                        `Email`,
                        `ip_created`
                    )
                    VALUES 
                    (
                        '".$db->sql_escape(htmlspecialchars($this->username, ENT_QUOTES))."',
                        '".$db->sql_escape($this->secure_pass)."',
                        '".$db->sql_escape($this->clean_email)."',
                        '".ip2()."'
                    )";

$db->sql_query($sql))

ip_created 字段是长度为 10 的 int

所有的数据库交互都在一个 php 类中处理,也许这可能是个问题。

我真的不知道问题出在哪里,这真的开始困扰我。在我的本地主机版本上一切正常。

【问题讨论】:

  • ip2long() 在 32 位系统上可能返回负数。如果您的数据库字段是INT UNSIGNED,这将无法正确玩游戏。我个人更喜欢pack('N')的IP地址,并存储为VARBINARY(4),YMMV

标签: php mysql sql ip


【解决方案1】:

id2long man page comments contain:

请注意,当您运行 64 位系统时,ip2long 将导致 64 位 不适合 MySQL INT 的整数,您可以使用 BIGINT 或 INT 未签名,因为在 64 位系统上 ip2long 永远不会返回负数 整数。另见https://bugs.php.net/bug.php?id=54338

这可能是原因吗?

【讨论】:

  • 这似乎是一个奇怪的问题。即使 64 位系统会将 ip2long() 的返回值存储在 64 位整数中,但当它转换为字符串(用于查询)时,这不会被反映。只要 MySQL 数据类型足够大以存储数据,PHP 使用的整数类型应该 无关紧要。
  • 我使用printf("%u", ip2long($_SERVER['REMOTE_ADDR'])); 解决了这个问题,以始终获得正值,并且还使用bigint 而不是int。但是仍然有一些东西不起作用,例如在插入带有随机数的行时。我是否需要将所有 int 字段更改为 bigint 才能正常工作?
猜你喜欢
  • 2013-07-19
  • 1970-01-01
  • 2017-11-19
  • 2014-08-04
  • 1970-01-01
  • 2014-07-16
  • 1970-01-01
  • 2021-05-23
  • 2021-03-22
相关资源
最近更新 更多