-1

当我像这样在 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();
4

3 回答 3

3
  1. 使用双引号。
  2. or die(mysql_error());来看你的bug。
  3. 停止使用 mysql* 函数,很快就会被弃用。

使固定:

$amount = 17;
$mysqli->query("
        update player_stats 
        set cash = cash + $amount 
        where username = 'cheater2'
") or die(mysql_error());
于 2012-12-20T09:06:55.213 回答
1

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

于 2012-12-20T09:08:47.737 回答
0

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

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

$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
于 2012-12-21T00:11:40.980 回答