我有这个:

    $scCost = $row["gpsc"];
    mysql_query("
        UPDATE member_profile
        SET points = points-$scCost
        WHERE user_id = '".mysql_real_escape_string($userid)."'
    ") or die(mysql_error());

这需要做用户的点-成本。
如何检查用户是否负担得起所以,如果用户有30美元,而$scCost是40美元。。

最佳答案

您可以通过向查询添加一个额外的条件并使用mysql_affected_rows(),以原子方式执行此操作:

$scCost = $row["gpsc"];
$user_id = mysql_real_escape_string($user_id);
$sql = <<<END
UPDATE member_profile
SET points = points - $scCost
WHERE user_id = $user_id
AND points >= $scCost
END;
mysql_query($sql);
if (mysql_affected_rows() > 0) {
  // they can afford it
}

这比在一个SELECT后接一个UPDATE来引入竞争条件要好得多。
注意:mysql_affected_rows()返回已更改的行数。这一点很重要。如果将0成本传递给此查询,则最终将得到:
UPDATE member_profiles SET points = points - 0 ...

mysql_affected_rows()在该实例中始终返回0,因为没有更改的行。因此,如果0 cost是一个有效的案例,则需要对此进行过滤,而不必运行查询。
同样,如果您更新一行,这也可以很好地工作,但是如果您想一次修改多行,这会变得有点困难。然后你会问这样的问题:
如果有些“行”负担得起,而另一些则负担不起呢?
你想让他们都失败吗?
你如何报告哪些人买不起?
你是怎么做到原子的?
你最好一次做一个UPDATE,尽管这通常不是推荐的方法,当然也不会一次扩展到数千个更新。

10-06 08:51