首先,我完全清楚网络套接字和彗星是比AJAX更好的方法,但我试图让我的代码尽可能简单,所以我现在正在使用AJAX。
上下文
目前,用于获取特定对话(使用“cid”)的消息的PHP代码嵌入在用户查看消息的页面中。因此,每次刷新页面时都会加载消息。因此,我决定创建一个基于AJAX的系统,该系统以设定的间隔(即5秒)为我提取消息。
问题
由于AJAX请求而执行的SQL代码显然只需要返回当前未在屏幕上显示的消息,否则整个会话将每隔5秒回显到屏幕上。因此,需要有一种方法让AJAX确定消息是否已经在屏幕上,我认为这需要使用数据库字段完成,但我不知道如何。
当前数据库架构
(我会发布一张图片,但声誉太低了。)
Message_id(主键),cid(消息所属的对话),message,sent_user,receive_user,sent_time。
我在没有jQuery的情况下使用AJAX。
答案 0 :(得分:0)
在表格中添加delivered
字段。加载页面(刷新)后,添加一段代码以更新所有记录并将其标记为已交付。这是真的,因为当用户第一次进入聊天时,你提到他/她接收所有消息。
UPDATE messages SET delivered = 1 WHERE cid = ?
现在,在ajax调用期间,您将选择delivery = 0
的每条消息SELECT * FROM messages WHERE delivered = 0 AND cid = ?
UPDATE messages SET delivered = 1 WHERE delivered = 0 AND cid = ?
然后返回AJAX调用的选定记录并将其附加到聊天中。如果SELECT
返回为空,则表示没有新消息要附加到对话中,您也不需要执行UPDATE
语句。
答案 1 :(得分:0)
如果message_id是自动增量,那么该消息是否可用于测试消息是否已显示。只需跟踪客户端收到的最高message_id。 (假设您每隔x秒发送一次所有消息,而不是一次发送一条消息。)
它可以是一个会话变量,或者你可以通过Ajax以某种方式将最高的id返回给客户端,并保留一个包含最高message_id的js变量,并将其发送回ajax中的request参数中的服务器,并在SQL查找中使用它
... where message_id > highest_mid_received and ...
我之前实际上是这样做的,我认为我是通过跟踪客户端上的最高ID来实现的。如果你通过Ajax返回json,这将使得通过消息和id发送变得简单。我认为当我这样做时,我只是使用带分隔符的字符串,并在Javascript中使用split
,即使它现在由于json而过时也是如此。
如果您担心用户意外关闭标签并希望他们在页面打开新标签页时自动再次收到所有邮件,那么在客户端上保留变量会更有意义。如果这不是一个问题,或者您肯定希望他们在关闭标签并在同一页面上启动新标签后不再接收所有消息,那么在会话中保持跟踪会更有意义。