【问题标题】:How to only fetch only the new row from MySql automatically?如何仅自动从 MySql 中获取新行?
【发布时间】:2026-02-23 13:45:01
【问题描述】:

我正在为我的用户提供消息服务。我使用 AJAX 发送消息而不刷新消息。我想自动从数据库中获取新行(如果当前用户或对方用户输入任何消息),而不刷新旧消息。

<div id="readmsg">
#The messages is to be read  here....
</div>

<textarea placeholder="Write your message.." id="msg"></textarea>
<input type="submit" value="Send" id="sendmsg">


<?php $user1 = 1; $user2 = 2; ?>
<script type="text/javascript">
  $(document).ready(function(){
    $("#sendmsg").on("click",function(e){
      e.preventDefault();
      var usera = <?php echo $user1.";";?>
      var userb = <?php echo $user2.";";?>
      var msg = $("#msg").val();
      $.ajax({
        url : "sendmessageprocess.php",
        type : "POST",
        data : {message:msg, user1:usera, user2:userb},
        success : function(data){
          document.getElementById("msg").value="";
          $("#msg").val("");
        }
      });
    })
  });
</script>

【问题讨论】:

  • 您目前如何检查代码中的新消息?
  • (NB 实时聊天应用程序在使用 websockets 或 AJAX 和服务器发送事件的组合实现时会更加高效。仅 AJAX 的解决方案可以工作,但效率低下因为客户端必须定期轮询服务器以获取新消息,而不知道是否有任何新消息实际上可用。我的意思是,您应该考虑是否要以不同的方式实现此功能。)

标签: php jquery mysql ajax chat


【解决方案1】:

正如我在 cmets 中看到的那样,朋友只会使您的问题复杂化,并且远离您的主要问题

作为过去的聊天室创建者,我会认真地为您提供使用其他技术而不是 ajax 的技术

但如果必须使用ajax,解决问题的最佳方法是:

在查询中获取新消息后,将最后一行 id 放入会话或 cookie 中的某个索引中,例如:

$_SESSION['last_msg_id'] = $row['id'];

在另一个请求中获取他们的 id 大于你的 last_msg_id 的消息

$query = 'SELECT * FROM `messages` WHERE `id` > "' . $_SESSION['last_msg_id'] . '"';

并且,对于没有会话索引的新客户,例如获取最后 10 条消息,并通过指定的方式创建会话索引。示例:

if(isset($_SESSION['last_msg_id'])){
    $query = 'SELECT * FROM `messages` WHERE `id` > "' . $_SESSION['last_msg_id'] . '"';
}else{
    $query = 'SELECT * FROM `messages` ORDER BY `id` ASC LIMIT 10';
}
// your query process
$rows = {your rows};
foreach($rows as $row){
    $_SESSION['last_msg_id'] = $row['id'];
}

// or

$rows = {your rows};
$last_row = end($row);
$_SESSION['last_msg_id'] = $last_row['id']

【讨论】: