我的代码:
$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曲棍球棒在这里发生了什么?
答案 0 :(得分:1)
我假设您在数据库中使用了INT
作为数据类型。为了简化这个故事,只需将ip
列的数据类型更改为BIGINT
,问题就会得到解决。
INT range (-2147483648, 2147483647)
BIGINT range (-9223372036854775808, 9223372036854775807)
2953470927位于签名INT
的范围内。
答案 1 :(得分:1)
不幸的是,根据您的系统(32位与64位),PHP会返回不同的值。
在32位系统上它使用有符号整数,而在64位机器上它使用无符号整数,因此您需要相应地存储数据。
根据您返回的内容,您似乎使用的是64位计算机,因此请将mysql列更改为无符号整数,或者使用有符号或无符号的bigint