Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL在保存Facebook会话ID时存储不同的号码_Php_Mysql_Mysqli_Insert_Prepared Statement - Fatal编程技术网

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字段一起使用将“起作用”,因为:

  • mysqli不尝试将值强制为整数
  • MySQL BIGINT可以存储[-263263-1]

  • 但是,我建议改用CHAR类型。这是因为会话ID应该被视为一个不透明的标识符,而不是一个数字-没有数学运算应用于它。此外,简单地使用CHAR可能会避免将来的静默隐式转换,例如在处理驱动程序时,可能会错误地将BIGINT转换为整数或浮点PHP值,从而(如本问题)导致范围或精度损失。

    核心问题是隐式转换过程中范围损失

    i
    用作mysqli绑定提示时,它有效地执行
    (int)值
    。在32位系统中,会话ID超过PHP整数的最大大小并溢出:
    (int)“1000078107775829”->-502711531

    当使用
    s
    时,mysqli不进行此转换,而是将值直接传递给MySQL(作为字符串)。在本例中,MySQL以静默方式存储字段的值,即INT列的
    2147483647

    因此,将
    s
    与BIGINT字段一起使用将“起作用”,因为:

  • mysqli不尝试将值强制为整数
  • MySQL BIGINT可以存储[-263263-1]

  • 但是,我建议改用CHAR类型。这是因为会话ID应该被视为一个不透明的标识符,而不是一个数字-没有数学运算应用于它。此外,简单地使用CHAR可能会避免将来的静默隐式转换,例如在处理驱动程序时,可能会错误地将BIGINT转换为整数或浮点PHP值,从而(如本问题)导致范围或精度损失。

    核心问题是隐式转换过程中范围损失

    i
    用作mysqli绑定提示时,它有效地执行
    (int)值
    。在32位系统中,会话ID超过PHP整数的最大大小并溢出:
    (int)“1000078107775829”->-502711531

    当使用
    s
    时,mysqli不进行此转换,而是将值直接传递给MySQL(作为字符串)。在本例中,MySQL以静默方式存储字段的值,即INT列的
    2147483647

    因此,将
    s
    与BIGINT字段一起使用将“起作用”,因为:

  • mysqli不尝试将值强制为整数
  • MySQL BIGINT可以存储[-263263-1]

  • 但是,我建议改用CHAR类型。这是因为会话ID应该被视为一个不透明的标识符,而不是一个数字-没有数学运算应用于它。此外,简单地使用CHAR可能会避免将来的静默隐式转换,例如在处理驱动程序时,可能会错误地将BIGINT转换为整数或浮点PHP值,从而(如本问题)导致范围或精度损失。

    核心问题是隐式转换过程中范围损失

    i
    用作mysqli绑定提示时,它有效地执行
    (int)值
    。在32位系统中,会话ID超过PHP整数的最大大小并溢出:
    (int)“1000078107775829”->-502711531

    当使用
    s
    时,mysqli不进行此转换,而是将值直接传递给MySQL(作为字符串)。在本例中,MySQL以静默方式存储字段的值,即INT列的
    2147483647

    因此,将
    s
    与BIGINT字段一起使用将“起作用”,因为:

  • mysqli不尝试将值强制为整数
  • MySQL BIGINT可以存储[-263263-1]

  • 但是,我建议改用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字段。尝试使用<代码>