我正在试图弄清楚如何从MySQL中获取尚未获取的最新(最新)消息。
我想要的是什么:
如果用户A发送消息,我希望用户B获取该消息,但只需要一次。
我不想获取所有内容,因为从长远来看这将是不好的。
我当前的解决方案有点有效,但问题是它有时会提取相同的消息两次而另一个问题是如果客户在哪里获得lagspike,他会错过这些消息,因为当前的解决方案基于时间范围。
我目前得到的内容:
jQuery(Ajax)
setInterval(function () {
console.log('Attempting to update');
$.ajax({
type: "GET",
url: "palenc.php?hb=<?php echo $hb; ?>",
dataType: "json",
success: function(data) {
if (data == 2) {
console.log('No messages to fetch');
} else {
var password = "<?php echo $key; ?>";
for (i = 0; i < data.length; ++i) {
var from = data[i][0];
var emsg = data[i][1];
var pmsg = decrypt(emsg, password);
var msg = pmsg.toString(PalieEncryption.enc.Utf8);
$("#chat").append('<div class="left spotmsg"><div class="chat-
avatar pull-left"><img src="https://example.net/img/them.png"
alt="avatar" width="48" height="48"></div><div class="message">
<div class="arrow-left"></div><p><strong>@'+from+'</strong></p>
<p
class="txt">'+msg+'</p></div></div>');
}
$('textarea').focus();
$(".chat_area").animate({ scrollTop: $(".chat_area")
[0].scrollHeight}, 1000);
}
}
});
}, 1350);
PHP
$stmt = $mysqli->prepare('SELECT chat_user, chat_msg FROM chat_msg
WHERE chat_id = ? AND chat_time > (NOW() - INTERVAL 2 SECOND) AND
chat_user != ?');
$stmt->bind_param('ss', $id,$_SESSION['sess_user']);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_all()) {
header('Content-Type: application/json');
ob_end_clean();
echo json_encode($row);
}
答案 0 :(得分:0)
假设您在消息表上有自动增量主键,为什么不将主键与消息一起发送给客户端?然后,当客户端请求更新的消息时,它可以发回最近收到的消息的主键,并且服务器可以查询该用户的所有消息,其主键大于返回的主键。