我有一个包含用户信息的数据表和一个名为“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);
}
答案 0 :(得分:3)
我认为您可以通过加入dl_Transfers
上的插入内容中的上一个记录ID来点击单个查询中的更新:
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 = ?;
正如其他人在评论中所述,你绝对应该在这里使用交易。
答案 1 :(得分:0)
您可以考虑使用MySQL触发器来处理此问题。基本上,您可以设置它,以便在dl_Transfers上有插入时,它会更新dl_Users中的相应行。