PHP如何检查你是否负担得起?

Kar*_*rem 2 php mysql function

我有这个:

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

这需要用户点 - scCost.

我如何检查用户是否负担得起?所以,如果用户有30并且$ scCost是40 ..

cle*_*tus 5

您可以通过向查询添加额外条件并使用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
}
Run Code Online (Sandbox Code Playgroud)

这比引入竞争条件的a SELECT后面要好得多UPDATE.

警告: mysql_affected_rows()返回已更改的行数.这一点很重要.如果您将0成本传递到此查询中,您最终得到:

UPDATE member_profiles SET points = points - 0 ...
Run Code Online (Sandbox Code Playgroud)

mysql_affected_rows()在该实例中将始终返回0,因为没有更改的行.因此,如果0成本是有效的情况,则需要对此进行过滤,而不是根本不运行查询.

如果您要更新一行,这也很有效,但如果您想一次修改多行,则会更加困难.然后你会遇到如下问题:

  • 如果一些"行"可以负担得起但其他人没有呢?
  • 你想让他们都失败吗?
  • 你如何报告哪些人买不起?
  • 你如何原子地做这一切?

你可能最好一次做一个UPDATE,即使这通常不是推荐的方法,当然也不会一次扩展到成千上万的更新.