-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());あなたのバグを見るために使用します。
  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 に答える