0

ユーザー情報と「ビット」という列を含むデータテーブルがあります。転送機能があり、ログインしているユーザーから指定したユーザーに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 に答える