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

时间:2010-02-24 23:13:10

标签: 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());

这取得了用户的观点 - scCost。

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

6 个答案:

答案 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 
}