Преодолеть проблему времени с MySQL и данными таблиц? - PullRequest
0 голосов
/ 09 декабря 2011

Я создаю игру, и у пользователей есть деньги, например, в руке или в виртуальном банке!

При переводе денег из руки и наоборот, в настоящее время я использую,

if ($_POST['deposit'] > 0 && $_POST['deposit'] <= $user['shrapnel']) {
    $q = $dbc -> prepare("UPDATE items SET shrapnel = ?, bank = ? WHERE id = ?");
    $q -> execute(array($user['shrapnel'] - $_POST['deposit'], $user['bank'] + $_POST['deposit'], $user['id']));
}

Пользователи также могут настраивать сделки, и люди могут украсть деньги друг у друга, если пользователь украл достаточно денег, чтобы де-проверить утверждение if в тот момент, когда php подтвердил утверждение if для текущего счета, но невыполнив запрос, он будет запущен, но деньги людей превратятся в отрицательные числа и всевозможную путаницу? !!

Как мне справиться с этим ??

1 Ответ

0 голосов
/ 09 декабря 2011

Вам нужно выполнить все тестирование и все прочее в SQL.

Сначала получите данные пользователей:

$deposit = $_POST['deposit'];
$user = $user['id']
.....
$q = $dbc->prepare('CALL DoMoneyStuff(?,?)'); //call to stored proc
$q->execute(array($deposit, $user));
$r = $dbc->prepare('SELECT h.shrapnel, b.amount FROM hand h
                    INNER JOIN Bank b ON (h.user_id = b.user_id)
                    WHERE h.user_id = ?');
$q->execute(array($user));

Используйте следующую хранимую процедуру, чтобы заработать деньги.Поскольку хранимая процедура выполняется на MySQL, а все действия внутри хранимой процедуры выполняются внутри неявной транзакции, денежный перевод либо завершается успешно, либо завершается неудачей (теперь это атомарная транзакция).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...