Php MySQL在保存Facebook会话ID时存储不同的号码
当我的查询正常,但试图保存Php MySQL在保存Facebook会话ID时存储不同的号码,php,mysql,mysqli,insert,prepared-statement,Php,Mysql,Mysqli,Insert,Prepared Statement,当我的查询正常,但试图保存提供者id时,我在数据库中得到了一个不同的编号 字段的类型为INT。除非我尝试将字段类型更改为VARCHAR /* prepare query */ $query = 'INSERT INTO `users`(`first_name`, `last_name`, `gender`,
提供者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
核心问题是在隐式转换过程中会丢失范围 当
i
用作mysqli绑定提示时,它有效地执行(int)值
。在32位系统中,会话ID超过PHP整数的最大大小并溢出:(int)“1000078107775829”->-502711531
当使用s
时,mysqli不进行此转换,而是将值直接传递给MySQL(作为字符串)。在本例中,MySQL以静默方式存储字段的值,即INT列的2147483647
因此,将s
与BIGINT字段一起使用将“起作用”,因为:
但是,我建议改用CHAR类型。这是因为会话ID应该被视为一个不透明的标识符,而不是一个数字-没有数学运算应用于它。此外,简单地使用CHAR可能会避免将来的静默隐式转换,例如在处理驱动程序时,可能会错误地将BIGINT转换为整数或浮点PHP值,从而(如本问题)导致范围或精度损失。核心问题是隐式转换过程中范围损失 当
i
用作mysqli绑定提示时,它有效地执行(int)值
。在32位系统中,会话ID超过PHP整数的最大大小并溢出:(int)“1000078107775829”->-502711531
当使用s
时,mysqli不进行此转换,而是将值直接传递给MySQL(作为字符串)。在本例中,MySQL以静默方式存储字段的值,即INT列的2147483647
因此,将s
与BIGINT字段一起使用将“起作用”,因为:
但是,我建议改用CHAR类型。这是因为会话ID应该被视为一个不透明的标识符,而不是一个数字-没有数学运算应用于它。此外,简单地使用CHAR可能会避免将来的静默隐式转换,例如在处理驱动程序时,可能会错误地将BIGINT转换为整数或浮点PHP值,从而(如本问题)导致范围或精度损失。核心问题是隐式转换过程中范围损失 当
i
用作mysqli绑定提示时,它有效地执行(int)值
。在32位系统中,会话ID超过PHP整数的最大大小并溢出:(int)“1000078107775829”->-502711531
当使用s
时,mysqli不进行此转换,而是将值直接传递给MySQL(作为字符串)。在本例中,MySQL以静默方式存储字段的值,即INT列的2147483647
因此,将s
与BIGINT字段一起使用将“起作用”,因为:
但是,我建议改用CHAR类型。这是因为会话ID应该被视为一个不透明的标识符,而不是一个数字-没有数学运算应用于它。此外,简单地使用CHAR可能会避免将来的静默隐式转换,例如在处理驱动程序时,可能会错误地将BIGINT转换为整数或浮点PHP值,从而(如本问题)导致范围或精度损失。核心问题是隐式转换过程中范围损失 当
i
用作mysqli绑定提示时,它有效地执行(int)值
。在32位系统中,会话ID超过PHP整数的最大大小并溢出:(int)“1000078107775829”->-502711531
当使用s
时,mysqli不进行此转换,而是将值直接传递给MySQL(作为字符串)。在本例中,MySQL以静默方式存储字段的值,即INT列的2147483647
因此,将s
与BIGINT字段一起使用将“起作用”,因为:
但是,我建议改用CHAR类型。这是因为会话ID应该被视为一个不透明的标识符,而不是一个数字-没有数学运算应用于它。此外,简单地使用CHAR可以避免将来的无声隐式转换,例如在处理驱动程序时,可能会错误地将BIGINT转换为整数或浮点PHP值,从而(如本问题)导致范围或精度损失。尝试使用
intval($user['id')
,而不仅仅是$user['id']
然后告诉我结果您试图插入的实际ID值是多少?这是来自facebook用户会话的ID@user2864740@jenny那么,价值是什么呢?将其包含在帖子中。@jenny(2147483647)是MySQL INT字段的最大大小。当使用i
时,转换发生在PHP中(实际上是(int)ID
并溢出),而s
发生在MySQL中,它只是“封顶”,但没有溢出。如果您使用s
切换到MySQL中的BIGINT,那么它应该可以工作。但是,为了避免类似的(意想不到的)转换问题,请考虑使用char字段。尝试使用<代码>