0

我有一个包含用户信息的数据表和一个名为“Bits”的列。有一个传输功能,我想将 x 数量的位从登录用户传输到他们指定的用户。我有以下可用的函数,但我想知道是否有更好(更简单、更清洁、更快?)的方法来完成所有这些工作,并可能在最后返回第一个 SQL 语句的行。无论如何,我都不是高级 MySQL 用户,但我很确定我缺少一个可以使这变得更容易的功能。

function transferBits($toid, $amount)
{
    global $loggedInUser, $db;
    $fromid = $loggedInUser->user_id;
    $sql = "INSERT INTO `dl_Transfers` SET From_ID = '".$db->sql_escape($fromid)."',
        `To_ID`='".$db->sql_escape($toid)."',
        `Bits`='".$db->sql_escape($amount)."',
        `When`=Now()";
    $result = $db->sql_query($sql);
    $sql2 = "UPDATE `dl_Users` SET Bits = Bits - '".$db->sql_escape($amount)."' WHERE `User_ID` = '".$db->sql_escape($fromid)."'";
    $result2 = $db->sql_query($sql2);  
    $sql3 = "UPDATE `dl_Users` SET Bits = Bits + '".$db->sql_escape($amount)."' WHERE `User_ID` = '".$db->sql_escape($toid)."'";
    $result3 = $db->sql_query($sql3);
}
4

2 回答 2

3

我认为您可以通过在插入时加入上一个记录 id 来在单个查询中进行更新dl_Transfers

UPDATE `dl_Transfers` r 
JOIN `dl_Users` f ON ( r.From_ID = f.User_ID )
JOIN `dl_Users` t ON ( r.To_ID = t.User_ID )
SET f.Bits = f.Bits - r.Bits, t.Bits = t.Bits + r.Bits
WHERE r.Transfer_ID = ?;

同样正如其他人在评论中所说,您绝对应该在这里使用交易。

于 2012-06-21T20:57:15.373 回答
0

您可能会考虑使用 MySQL 触发器来处理此问题。基本上,您将对其进行设置,以便在 dl_Transfers 上有插入时,它会更新 dl_Users 中的相应行。

http://dev.mysql.com/doc/refman/5.0/en/triggers.html

于 2012-06-21T21:00:13.823 回答