0

私は単純なウェブチャットサーバーに取り組んでいます。私は2つのテーブルを持っています:
chatMsgs:

  • RowId
  • ユーザー名
  • 時間
  • アクション
  • 目標
  • メッセージ

onlineUsers:

  • ユーザー名
  • アクション
  • 最後にログインした時

online.LastActive <%t%-120のonlineUsersから行を削除するにはどうすればよいですか。また、onlineUsersから削除されたアイテムについては、chatMsgsに新しい行を追加したいと思います。

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

%t%は単なるプレースホルダーであり、phpのtime()戻り値に置き換えられます。可能であれば、mysqli_queryハンドラーを1回呼び出すだけでこれを実行したいと思いますが、クエリ文字列には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');
    }
?>
4

2 に答える 2

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 テーブルから削除されます。「削除する」エントリをすべてロードし、最初に削除を呼び出してからログアウト メッセージを追加することで回避できますが、これは元の要件に反します。

于 2012-06-09T18:45:16.750 に答える
0

SQL クエリ:

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

DELETE FROM onlineUsers
WHERE Username = $username;
于 2012-06-09T09:47:56.847 に答える