仅使用 jQuery (Ajax) 和 PHP 从 MySQL 获取最新消息? (在线聊天APP)

Posted

技术标签:

【中文标题】仅使用 jQuery (Ajax) 和 PHP 从 MySQL 获取最新消息? (在线聊天APP)【英文标题】:Get the latest messages only from MySQL using jQuery (Ajax) and PHP ? (Live Chat APP) 【发布时间】:2017-11-12 16:42:32 【问题描述】:

我试图弄清楚如何从 mysql 中获取尚未获取的最新(最新)消息。

我想要什么: 如果用户 A 发送消息,我希望用户 B 获取该消息,但只获取一次。我不想获取所有内容,因为从长远来看这会很糟糕。

我目前的解决方案有点工作,但问题是它有时会获取相同的消息两次,另一个问题是 如果客户在哪里得到延迟峰值,他会错过这些消息,因为当前的解决方案基于时间框架

我目前得到的:

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" 
         ></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);

【问题讨论】:

您可以添加一个带有布尔标志的额外列,并UPDATE'ing 该列。关于您的“有时两次获取相同的消息”,您可以使用 DISTINCT / GROUP BY。 你能给我举个例子吗? MySQL 不是我的强项 【参考方案1】:

假设您在消息表上有一个自动递增的主键,为什么不将主键与消息一起发送给客户端?然后当客户端请求更新消息时,它可以将最近收到的消息的主键发回,服务器可以查询该用户的所有消息,主键大于返回的主键。

【讨论】:

好主意!这应该可以,但是如何在不使用 cookie 或会话的情况下将最后一个 ID 从 jQuery 传递给 PHP? O_o 等等,由于客户端没有重新加载页面,我可以将其存储在 VAR 中,对吧? @Persson 客户端发起新消息请求,对吧?然后在 GET 请求中包含最新的消息 ID。当客户端请求新消息时,使用 $.ajax 数据选项将 last_message_id 作为 GET 参数传递。然后使用 $_GET 关联数组在 PHP 中读取它。

以上是关于仅使用 jQuery (Ajax) 和 PHP 从 MySQL 获取最新消息? (在线聊天APP)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jquery、AJAX 和 PHP 从 MySQL 数据库中检索数据

使用 Ajax 和 JQuery 从 PHP 文件中获取数据

从 PHP (jQuery/AJAX) 插入 MySQL

如何使用ajax和jquery从php Web服务返回简单文本[重复]

将 AJAX/jQuery 添加到简单的 PHP 表单

在 jQuery UI datepicker 中仅选择特定日期(日期列表来自 AJAX)