我正在开发一个简单的网络聊天服务器。我有两张桌子:
的 chatMsgs:
onlineUsers:
如何从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');
}
?>
答案 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;