解决mysql和表数据的时间问题?

解决mysql和表数据的时间问题?,mysql,pdo,Mysql,Pdo,我正在制作一个游戏,用户手里或者虚拟银行里都有钱 当我从他们手中转移资金时,我正在使用 if ($_POST['deposit'] > 0 && $_POST['deposit'] <= $user['shrapnel']) { $q = $dbc -> prepare("UPDATE items SET shrapnel = ?, bank = ? WHERE id = ?"); $q -> execute(array($user['sh

我正在制作一个游戏,用户手里或者虚拟银行里都有钱

当我从他们手中转移资金时,我正在使用

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($\u POST['depost']>0&&$\u POST['depost']准备(“更新项目集碎片=?,银行=?其中id=?”);
$q->execute(数组($user['shrapanel']-$\u POST['depost'],$user['bank']+$\u POST['depost'],$user['id']);
}
用户还可以建立交易,人们可以互相偷钱,如果用户在php验证当前帐户的if语句但未完成查询的准确时间偷了足够的钱来取消验证if语句,那么查询将运行,但会导致人们的钱变成负数和各种差异混乱


如何克服这个问题???

您需要用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上运行,并且存储过程中的所有操作都在隐式事务中运行,所以资金转移要么完全成功,要么完全失败(现在是一个原子事务)

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 ;