我有这个:
$scCost = $row["gpsc"];
mysql_query("
UPDATE member_profile
SET points = points-$scCost
WHERE user_id = '".mysql_real_escape_string($userid)."'
") or die(mysql_error());
这取得了用户的观点 - scCost。
如何检查用户是否可以负担得起?所以,如果用户有30并且$ scCost是40 ..
答案 0 :(得分: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
}
这比执行SELECT
后跟UPDATE
更好,这会引入竞争条件。
警告: mysql_affected_rows()
返回已更改的行数。这一点很重要。如果您将0成本传递到此查询中,则最终得到:
UPDATE member_profiles SET points = points - 0 ...
mysql_affected_rows()
总是在该实例中返回0,因为没有更改的行。因此,如果0成本是一个有效的案例,您需要对此进行过滤,而不是根本不运行查询。
如果您要更新一行,这也很有效,但如果您想一次修改多行,则会更加困难。然后你会遇到如下问题:
你可能最好一次做一个UPDATE
,尽管这通常不是推荐的方法,当然也不能一次扩展到数千个更新。
答案 1 :(得分:1)
在进行更新之前,您必须获取此数据并检查PHP
方。
在PHP
中,您应该在减号操作后检查此值是否不小于0
。
答案 2 :(得分:0)
您需要检查points
是否等于或大于cost
。
答案 3 :(得分:0)
SELECT points>=:cost AS canafford
FROM member_profile
WHERE user_id=:userid
答案 4 :(得分:0)
添加第二个where子句“AND points&gt; = $ scCost” 并检查修改了多少行。一排=他们可以负担得起。零行,他们不能。
$scCost = $row["gpsc"];
mysql_query("
UPDATE member_profile
SET points = points-$scCost
WHERE user_id = '".mysql_real_escape_string($userid)."'
AND points >= $scCost
") or die(mysql_error());
雅各
答案 5 :(得分:0)
您可以通过执行SQL查询来检查用户原始积分数
$id = mysql_real_escape_string($userid);
$sql = "SELECT points FROM member_profile WHERE userid = $id";
$results = mysql_query($sql);
$row = mysql_fetch_array($results);
if($row['points'] > $scCost) {
// Update Row
} else {
// Throw error
}