保存Facebook会话ID时,MySQL会存储不同的号码

时间:2014-04-27 18:41:56

标签: php mysql mysqli insert prepared-statement

当我的查询有效但尝试保存provider_id时,我在数据库中得到一个不同的数字。

字段的类型为INT。除非我尝试将字段类型更改为VARCHAR

,否则它不起作用(不同的数字)
    /* prepare query */
    $query = 'INSERT INTO `users`(`first_name`, 
                                `last_name`, 
                                `gender`, 
                                `username`, 
                                `profile_picture`, 
                                `provider`, 
                                `provider_id`, 
                                `provider_username`,
                                `provider_profile`, 
                                `last_login`, 
                                `created_date`, 
                                `ip_address`) 
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NOW(), NOW(), INET_ATON(?))'; 

/* Prepare an insert statement */
$stmt = $mysqli->prepare($query);

if($stmt){
 $stmt->bind_param("ssssssisss", $user['first_name'], 
                                 $user['last_name'], 
                                 $user['gender'], 
                                 $user['username'], 
                                 $user['link'], 
                                 $user['provider'],
                                 $user['id'], 
                                 $user['username'], 
                                 $user['link'],                                     
                                 $_SERVER['REMOTE_ADDR']);

如果我错了,请纠正我,尽管最好保存为INT

我得到了奇怪的负数:

-502711531

1 个答案:

答案 0 :(得分:3)

核心问题是隐式转换期间存在损失范围。

i用作mysqli绑定提示时,它有效地(int)value。在32位系统中,会话ID超过PHP整数的最大大小和溢出(int)"100007810775829" -> -502711531

当使用s时,mysqli不会执行此转换,而是将值直接传递给MySQL(作为字符串)。在这种情况下,MySQL以静默方式存储字段的maximum value it can,对于INT列为2147483647

因此,将s BIGINT字段一起使用" work"这是因为:

  1. mysqli不会尝试将值强制转换为整数
  2. MySQL BIGINT可以存储[-2 63 ,2 63 -1]
  3. 但是,我建议使用CHAR类型。这是因为会话ID应该被视为不透明标识符不是作为数字 - 没有数学运算适用于它。此外,简单地使用CHAR可以避免将来进行静默隐式转换,例如在处理可能错误地将BIGINT转换为整数或浮动PHP值的驱动程序时(因此(如此问题)导致范围或精度的损失)。