Обновление большого количества в MySQL больше 100 трлн с PHP ненадежно
Когда я отправляю значение в MySQL в PHP следующим образом:
$mysqli->query("update bank set cash = $cash");
Он работает хорошо для меньших чисел, но все, что 100 триллионов или больше, дает неожиданные результаты. Иногда он обновляет число с шагом 100, а иногда нет вообще.
Готовое утверждение также дает другие, но ненадежные результаты, когда число становится больше пары миллиардов:
$stmt->prepare("update bank set cash = ?");
$stmt->bind_param('i',$new_cash_amt);
$stmt->execute();
3 ответа
- Используйте двойные кавычки.
- использование
or die(mysql_error());
чтобы увидеть вашу ошибку. - Прекратить использование функции mysql*, скоро будет устаревшим.
Fix:
$amount = 17;
$mysqli->query("
update player_stats
set cash = cash + $amount
where username = 'cheater2'
") or die(mysql_error());
Вы используете одинарные кавычки, которые не анализируют переменную php. Это ищет cash=cash+$amount
в виде строки, а не переменной, содержащей данные.
Я отвечаю на свой вопрос здесь.
Оказывается, когда вы передаете значения, как это:
$huge_number = 100000000000012345;
echo "The huge_number is: $huge_number";
Будет напечатано следующее:
Огромный номер: 1.0000000000001E+17
Точное значение теряется в этом преобразовании. Вот почему значение увеличивается в несколько раз, иногда, а не в других случаях.
Как и в случае с подготовленным оператором, любые значения, превышающие 32-битное целое число (поскольку в качестве параметра в связанном параметре я поместил "i"), будут неожиданно обрезаны и изменены. Я должен был передать новое значение как 'd', вот так:
$stmt->bind_param('d',$new_cash_amt); //This works correctly