克服mysql和表数据的时间问题?

时间:2011-12-08 20:09:09

标签: mysql pdo

我正在建立一个游戏,用户手中或虚拟银行都有钱可以说!

从手中转钱,反之亦然,我目前正在使用,

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']));
}

用户还可以设置交易,如果用户窃取足够的资金以在php已验证当前帐户的if语句但未完成的确切时间取消验证if语句,则用户可以相互窃取资金查询,然后查询将运行但导致人们的钱进入负数和各种不同的混乱?!!

我怎样才能克服这个?

1 个答案:

答案 0 :(得分:0)

您需要在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));

使用以下存储过程来赚钱 因为存储的proc在MySQL上运行并且存储过程中的所有操作都在隐式事务中运行,所以汇款要么完全成功要么完全失败(现在它是原子事务)。

DELIMITER $$

CREATE PROCEDURE DoMoneyStuff(Pdeposit DECIMAL(10,2)
                             ,Puser INTEGER)
BEGIN
  DECLARE Pshrapnel DECIMAL(10,2)

  SELECT Shrapnel INTO PShapnel FROM hand WHERE user_id = Puser LIMIT 1;
  IF Pshapnel >= Pdeposit THEN
    UPDATE hand SET Shrapnel = Shrapnel - Pdeposit WHERE user_id  Puser;
    UPDATE bank SET amount = amount + Pdeposit WHERE user_id = Puser;
  END IF;
END $$

DELIMITER ;