Javascript 基于ajax的聊天数据库体系结构

Javascript 基于ajax的聊天数据库体系结构,javascript,php,ajax,Javascript,Php,Ajax,首先,我完全知道WebSockets和comet是比AJAX更好的方法,但我正试图使我的代码尽可能简单,所以我现在使用AJAX 上下文 目前,用于获取特定会话消息的PHP代码(使用“cid”)嵌入在用户查看消息的页面中。因此,仅在每次刷新页面时加载消息。因此,我决定创建一个基于AJAX的系统,以设定的间隔(即5秒)为我获取消息 问题 作为AJAX请求的结果执行的SQL代码显然只需要返回当前未显示在屏幕上的消息,否则整个对话将每隔5秒在屏幕上回响一次。因此,AJAX需要有一种方法来确定消息是否已经

首先,我完全知道WebSockets和comet是比AJAX更好的方法,但我正试图使我的代码尽可能简单,所以我现在使用AJAX

上下文

目前,用于获取特定会话消息的PHP代码(使用“cid”)嵌入在用户查看消息的页面中。因此,仅在每次刷新页面时加载消息。因此,我决定创建一个基于AJAX的系统,以设定的间隔(即5秒)为我获取消息

问题

作为AJAX请求的结果执行的SQL代码显然只需要返回当前未显示在屏幕上的消息,否则整个对话将每隔5秒在屏幕上回响一次。因此,AJAX需要有一种方法来确定消息是否已经出现在屏幕上,我认为这需要使用数据库字段来完成,但我不知道如何完成

当前数据库体系结构

(我会发布一张图片,但我的声誉太低了。)

消息id(主键)、cid(消息也属于哪个会话)、消息、发送用户、接收用户、发送时间


我使用的是没有jQuery的AJAX。

在表中添加一个
字段。加载(刷新)页面时,添加一段代码更新所有记录并将其标记为已送达。这是真的,因为当用户第一次进入聊天室时,您提到他/她会收到所有消息

UPDATE messages SET delivered = 1 WHERE cid = ?
现在,在ajax调用期间,您将选择每个传递为0的消息

SELECT * FROM messages WHERE delivered = 0 AND cid = ?
UPDATE messages SET delivered = 1 WHERE delivered = 0 AND cid = ?

然后返回AJAX调用的选定记录并将其附加到聊天中。如果
SELECT
返回空,这意味着没有新消息要附加到对话中,并且您不需要执行
UPDATE
语句。

如果消息id为autoincrement,则应可用于测试消息是否显示。只需跟踪客户端收到的最高消息id即可。(假设您每x秒发送一次所有消息,而不是一次发送一条消息。)

它可以是一个会话变量,也可以通过Ajax将最高id返回给客户端,并保留一个js变量,该变量保存收到的最高消息id,然后在Ajax中的请求参数中将其发送回服务器,并在SQL查找中使用

... where message_id > highest_mid_received and ...
我以前确实这样做过,我想我是通过跟踪客户机上的最高id来做到的。如果您通过Ajax返回json,那么通过消息和id发送将变得简单。我想我做这件事的时候只是使用了带分隔符的字符串,并且在Javascript中使用了
split
,尽管由于json的缘故,它现在已经过时了


如果您担心用户意外关闭选项卡,并希望他们在打开页面的新选项卡时再次自动获取所有消息,那么在客户端保留变量更有意义。如果这不是一个问题,或者您确实希望他们在关闭选项卡并启动同一页面的新消息后不再接收所有消息,那么在会话中保持跟踪更有意义。

如果消息id为autoincrement,则应可用于测试消息是否显示。只需跟踪客户端收到的最高消息id即可。(假设您每x秒发送一次所有消息,而不是一次发送一条消息)为什么不使用jQuery?这将如何实现?您是否可以设置一个会话变量来存储收到的最高消息id?我已将该注释作为一个更详细的回答。不,只需在每个请求中发送最新的消息id,并使响应包含比该消息更新的消息,以及在过去10秒内编辑的消息。然后,通过添加新消息和按id修改现有消息来更新ui。起初我考虑了这种方法,但是如果两个用户同时查看对话,其中一个用户将以delivered=0的方式查看消息,那么delivered将设置为1,而另一个用户将无法查看消息。除非我遗漏了什么:)这比它需要的数据库更密集。