当我尝试插入ip2long Integer时,错误的Integer被插入到表中

时间:2015-01-10 23:57:54

标签: php mysql ip

我的代码:

$ip = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'][0]); // Gives an IP address string. Example: "176.10.99.207"

$ipL = ip2long($ip); // An integer, which for this example would be 2953470927.

if( $stmt_insert_ip = $ip_link->prepare("INSERT INTO dataTable(ip,datetime) VALUES(?,?)") ){
  $stmt_insert_ip->bind_param('is',$ipL,date("Y-m-d H:i:s"));
}

但是当我检查我的MySQL表时,ip列下新插入的值是2147483647,即“127.255.255.255”。

然而,当我运行echo($ipL);时,我得到了2953470927.

H-E-Double曲棍球棒在这里发生了什么?

2 个答案:

答案 0 :(得分:1)

我假设您在数据库中使用了INT作为数据类型。为了简化这个故事,只需将ip列的数据类型更改为BIGINT,问题就会得到解决。

INT range (-2147483648, 2147483647)
BIGINT range (-9223372036854775808, 9223372036854775807)

2953470927位于签名INT的范围内。

参考:MySQL: Integer types

答案 1 :(得分:1)

不幸的是,根据您的系统(32位与64位),PHP会返回不同的值。

在32位系统上它使用有符号整数,而在64位机器上它使用无符号整数,因此您需要相应地存储数据。

根据您返回的内容,您似乎使用的是64位计算机,因此请将mysql列更改为无符号整数,或者使用有符号或无符号的bigint