我有一个脚本,用户可以在游戏中互相发送资金。
问题是,用户输入“将-99999钱捐给用户名”,然后我的脚本从他们输入的用户那里获取99999并将其提供给他们。
所以这是我的剧本:
if(isset($_POST['usernameofmoney']))
{
$resson= mysql_real_escape_string($_POST['usernameofmoney']);
$resson2 = strip_tags($resson);
$bannedusername= mysql_real_escape_string($_POST['money']);
$bannedusername2 = strip_tags($bannedusername);
$sql = "SELECT * FROM `users` WHERE `username` = '" . $_SESSION['username'] . "'";
$result = mysql_query($sql) or die(mysql_error());
$values = mysql_fetch_array($result);
// We do this if they do no have enough coins
if ( $values['money'] < $bannedusername2 ) {
echo "You Don't Have Enough Money Sorry";
die;
}
if ( $values['money'] > $bannedusername2 ) {
// Take the coins from the 1 users
$gfgdgdfgds = mysql_query("UPDATE users SET money = money - ".$bannedusername2."
WHERE username = '".$_SESSION['username']."'") or die(mysql_error());
// Add the coins to the new user
$gfgdgdfgdsf = mysql_query("UPDATE users SET money = money + ".$bannedusername2."
WHERE username = '".$resson2."'") or die(mysql_error());
echo "The Money Have Been Sent.";
}
}
我知道我应该使用PDO,今晚我将切换到PDO。
以下是我检查用户是否有钱发送。
if ( $values['money'] < $bannedusername2 ) {
echo "You Don't Have Enough Money Sorry";
die;
}
$ values ['money']有钱,而$ bannedusername2是他们想要给他们输入的钱。所以如果钱少于他们输入的钱那么它会停止脚本但它们是输入-99999并让它们通过..
答案 0 :(得分:0)
这可能不是你问题的答案,但......
...如果我理解得很好,你的逻辑就是:
SELECT
请求UPDATE
查询进行货币兑换。当您单独测试应用程序时,这可能很有效。但是,请记住,在生产中,将有几个并发访问您的数据库。
因此,如果说用户A(150美元)同时给用户C和用户D 100美元,则可能出现以下情况:
Oups。
另一种可能的失败是第一次UPDATE
成功,但第二次失败(无论出于何种原因)。在这种情况下,一个用户将减少帐户。这笔钱已经消失了......
Oups。
为了防止这些陷阱,你必须至少确保:
BEGIN TRANSACTION
.... COMMIT
)此外,我会将您的第一个SELECT
请求重写为:{/ p>,而不是UPDATE
+ UPDATE
。
UPDATE users SET money = money - amount WHERE username = "User A"
AND money >= amount;
然后我会检查UPDATE
是否影响了0行1行。前者意思是“钱不够”。