【问题标题】:updating a large number in MySQL larger than 100 trillion with PHP is unreliable用 PHP 更新 MySQL 中大于 100 万亿的大量数字是不可靠的
【发布时间】:2012-12-07 18:10:39
【问题描述】:

当我像这样在 PHP 中向 MySQL 发送值时:

$mysqli->query("update bank set cash = $cash");

它适用于较小的数字,但任何 100 万亿或更大的数字都会产生意想不到的结果。有时它会以 100 为增量更新数字,有时则根本不更新。

一旦数量超过几十亿,准备好的语句也会有不同但不可靠的结果:

$stmt->prepare("update bank set cash = ?");
$stmt->bind_param('i',$new_cash_amt);
$stmt->execute();

【问题讨论】:

  • $mysqli->query('update player_stats set cash = cash + '.$amount.' where username = "cheater2"');
  • 您在 db 中给出的 int 或数据类型的大小是多少?
  • 看来我对我的问题提出了质疑。我正在使用 mt_rand 获取一个变量,然后将其发送到 add_cash() ,然后它仅以 10 或 100 的间歇增量更新。我想知道这是否是类型问题。奇怪的是,当我使用其他变量运行 add_cash 时,我没有遇到这个问题。我正在更新我的问题。

标签: php mysql bigint


【解决方案1】:
  1. 使用双引号。
  2. 使用or die(mysql_error()); 来查看您的错误。
  3. 停止使用 mysql* 函数,即将被弃用。

修复:

$amount = 17;
$mysqli->query("
        update player_stats 
        set cash = cash + $amount 
        where username = 'cheater2'
") or die(mysql_error());

【讨论】:

  • 这使它工作,但我不知道为什么。在准备好的语句中也有同样的问题。
  • 好吧,该死的。当我直接运行查询时它可以工作,当我通过游戏的 add_cash 函数运行它时会中断。这越来越陌生了。它仅在大于 100 万亿的值上突破。使用 add_cash 函数更新问题。
【解决方案2】:

您使用的是单引号,它不会解析 php 变量。它正在寻找 cash=cash+$amount 作为字符串,而不是保存数据的变量。

【讨论】:

    【解决方案3】:

    我在这里回答我自己的问题。

    事实证明,当你传递这样的值时:

    $huge_number = 100000000000012345;
    echo "The huge_number is: $huge_number";
    

    它将打印以下内容:

    巨大的数字是:1.0000000000001E+17

    在此转换中丢失了精确值。这就是为什么值有时会以 100 的倍数递增,而在其他时候根本不会。

    与准备好的语句一样,任何大于 32 位整数的值(因为我将“i”作为绑定参数中的类型)都将被截断和意外更改。我应该将新值作为“d”传递,如下所示:

    $stmt->bind_param('d',$new_cash_amt); //This works correctly
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 2021-11-14
      • 2021-07-17
      • 2022-11-24
      • 1970-01-01
      • 2015-01-25
      • 2020-09-08
      相关资源
      最近更新 更多