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 ..
您可以通过向查询添加额外条件并使用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,即使这通常不是推荐的方法,当然也不会一次扩展到成千上万的更新.