MySQL在删除前插入

时间:2012-06-09 09:42:52

标签: php mysql

我正在开发一个简单的网络聊天服务器。我有两张桌子:
chatMsgs:

  • RowId的
  • 用户名
  • 时间
  • 动作
  • 目标
  • 消息

onlineUsers:

  • 用户名
  • 动作
  • LastActive

如何从onlineUast中删除任何行,其中online.LastActive< %t%-120,对于从onlineUsers中删除的任何项目,我想在chatMsgs中添加一个新行

Username=onlineUsers.username,
LastAction='logout',
Time=%t%,
Message='Timed out after 2min'

%t%只是一个占位符,将替换为php的time()返回值。如果可能的话,我想通过调用mysqli_query处理程序来执行此操作,尽管查询字符串可以包含mysql服务器的多个指令

以下作品afaik(尚未经过彻底测试),但我想知道是否有更好的方法:

<?php
    // $db is an mysqli database link.

    $t = time()
    $e = $t - 120,
    $q = "SELECT Username FROM onlineUsers WHERE LastActive<={$e};",
    $r = $db->query($q);

    if (!$r)
        die('db error');

    elseif ($r->num_rows > 0) {
        $q = '';

        $r = $r->fetch_all(MYSQLI_NUM);
        for ($n in $r)
            $q .= "INSERT INTO chatMsg(Username,Time,Action,Message) VALUES('{$n}',{$t},'Logout','Timed out after 2min');";

        $q .= "DELETE FROM onlineUsers WHERE LastActive<={$e};";

        $r = $db->query($q);
        if (!$r) 
            die('db error');
    }
?>

2 个答案:

答案 0 :(得分:1)

如果你想在一个SQL语句中完成所有操作,那么以下内容应该足够了(使用上面的$ t和$ e变量):

INSERT INTO chatMsg(Username, Time, Action, Message)
SELECT Username, {$t}, 'logout', 'Timed out after 2 mins'
FROM onlineUsers
WHERE LastActive <= {$e};

DELETE FROM onlineUsers WHERE LastActive <= {$e};

请注意,竞争条件可能发生 - 如果用户在INSERT和DELETE语句之间执行某些活动,它们仍将从onlineUsers表中删除。你可以绕过这个加载所有“要删除”的条目,首先调用删除,然后添加注销消息,但这与你原来的要求相反。

答案 1 :(得分:0)

SQL查询:

INSERT INTO chatMsgs
VALUES ($username, $time, "logout", $target, $message);

DELETE FROM onlineUsers
WHERE Username = $username;