基于 ajax 的聊天的数据库架构
database architecture for ajax based chat
首先,我完全意识到 web-sockets 和 comet 是比 AJAX 更好的方法,但我试图让我的代码尽可能简单,所以我使用 AJAX现在。
上下文
目前,用于获取特定对话消息的 PHP 代码(使用 'cid')嵌入在用户查看消息的页面中。因此,消息只会在每次刷新页面时加载。因此,我决定创建一个基于 AJAX 的系统,它以设定的时间间隔(即 5 秒)为我获取消息。
问题
作为 AJAX 请求的结果执行的 SQL 代码显然只需要 return 当前未显示在屏幕上的消息,否则完整的对话将每 5 秒就会在屏幕上回显一次。因此,AJAX 需要一种方法来确定消息是否已经在屏幕上,我认为这需要使用数据库字段来完成,但我不知道如何实现。
当前数据库架构
(我会 post 一张图片,但我的声誉太低了。)
Message_id(主键),cid(消息也属于哪个对话),message,sent_user,receive_user,sent_time。
我正在使用 AJAX 而没有 jQuery。
将 delivered
字段添加到您的 table。当您的页面加载(刷新)时,添加一段代码来更新所有记录并将它们标记为已交付。这是真的,因为当用户第一次进入聊天时,您提到 he/she 接收所有消息。
UPDATE messages SET delivered = 1 WHERE cid = ?
现在,在 ajax 通话期间,您将 select 每条已发送的消息 = 0
SELECT * FROM messages WHERE delivered = 0 AND cid = ?
UPDATE messages SET delivered = 1 WHERE delivered = 0 AND cid = ?
然后 return AJAX 调用的 selected 记录并将它们附加到您的聊天中。如果 SELECT
return 为空,则表示没有新消息要附加到对话中,您不需要执行 UPDATE
语句。
如果 message_id 是自动递增的,那应该可以用于测试消息是否显示。只需跟踪客户收到的最高 message_id。 (这是假设您每 x 秒发送一次所有消息,而不是一次只发送一条消息。)
它可能是一个会话变量,或者你可以通过某种方式 return 通过 Ajax 到客户端的最高 ID 并保留一个 js 变量来保存接收到的最高 message_id ,并且在 ajax 中的请求参数中将其发送回服务器,并在 SQL 查找
中使用它
... where message_id > highest_mid_received and ...
我以前确实这样做过,我想我是通过跟踪客户端上的最高 ID 来做到的。如果您从 returning json 到 Ajax,这将使发送消息和 ID 变得简单。我认为我在执行此操作时只是使用了带分隔符的字符串,并在 Javascript 中使用了 split
,这也有效,尽管由于 json.[=12 现在它已经过时了=]
如果您担心用户意外关闭选项卡并希望他们在打开页面的新选项卡时自动再次获取所有消息,则在客户端保留变量更有意义。如果这不是问题,或者您肯定希望他们在关闭选项卡并在同一页面上启动新的选项卡后不再收到所有消息,那么在会话中保持跟踪更有意义。
首先,我完全意识到 web-sockets 和 comet 是比 AJAX 更好的方法,但我试图让我的代码尽可能简单,所以我使用 AJAX现在。
上下文
目前,用于获取特定对话消息的 PHP 代码(使用 'cid')嵌入在用户查看消息的页面中。因此,消息只会在每次刷新页面时加载。因此,我决定创建一个基于 AJAX 的系统,它以设定的时间间隔(即 5 秒)为我获取消息。
问题
作为 AJAX 请求的结果执行的 SQL 代码显然只需要 return 当前未显示在屏幕上的消息,否则完整的对话将每 5 秒就会在屏幕上回显一次。因此,AJAX 需要一种方法来确定消息是否已经在屏幕上,我认为这需要使用数据库字段来完成,但我不知道如何实现。
当前数据库架构
(我会 post 一张图片,但我的声誉太低了。)
Message_id(主键),cid(消息也属于哪个对话),message,sent_user,receive_user,sent_time。
我正在使用 AJAX 而没有 jQuery。
将 delivered
字段添加到您的 table。当您的页面加载(刷新)时,添加一段代码来更新所有记录并将它们标记为已交付。这是真的,因为当用户第一次进入聊天时,您提到 he/she 接收所有消息。
UPDATE messages SET delivered = 1 WHERE cid = ?
现在,在 ajax 通话期间,您将 select 每条已发送的消息 = 0
SELECT * FROM messages WHERE delivered = 0 AND cid = ?
UPDATE messages SET delivered = 1 WHERE delivered = 0 AND cid = ?
然后 return AJAX 调用的 selected 记录并将它们附加到您的聊天中。如果 SELECT
return 为空,则表示没有新消息要附加到对话中,您不需要执行 UPDATE
语句。
如果 message_id 是自动递增的,那应该可以用于测试消息是否显示。只需跟踪客户收到的最高 message_id。 (这是假设您每 x 秒发送一次所有消息,而不是一次只发送一条消息。)
它可能是一个会话变量,或者你可以通过某种方式 return 通过 Ajax 到客户端的最高 ID 并保留一个 js 变量来保存接收到的最高 message_id ,并且在 ajax 中的请求参数中将其发送回服务器,并在 SQL 查找
中使用它... where message_id > highest_mid_received and ...
我以前确实这样做过,我想我是通过跟踪客户端上的最高 ID 来做到的。如果您从 returning json 到 Ajax,这将使发送消息和 ID 变得简单。我认为我在执行此操作时只是使用了带分隔符的字符串,并在 Javascript 中使用了 split
,这也有效,尽管由于 json.[=12 现在它已经过时了=]
如果您担心用户意外关闭选项卡并希望他们在打开页面的新选项卡时自动再次获取所有消息,则在客户端保留变量更有意义。如果这不是问题,或者您肯定希望他们在关闭选项卡并在同一页面上启动新的选项卡后不再收到所有消息,那么在会话中保持跟踪更有意义。