我正在建立一个游戏,用户手中或虚拟银行都有钱可以说!
从手中转钱,反之亦然,我目前正在使用,
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语句,则用户可以相互窃取资金查询,然后查询将运行但导致人们的钱进入负数和各种不同的混乱?!!
我怎样才能克服这个?
答案 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 ;