自动检测DB表是否更改

时间:2014-11-16 05:48:33

标签: javascript php pdo

我有一个小应用程序,用户可以在HTML表格中拖放任务。

当用户放弃任务时,我调用了一个名为update_task的javascript函数:

function update_task(user_id, task_id, status_id, text, uiDraggable, el) {
  $.get('task_update.php?user_id='+user_id+'&task_id='+task_id+'&status_id='+status_id+'', function(data) {            
    try {
      jsonResult = JSON.parse(data);
    } catch (e) {
      alert(data);
      return;
    };

在task_update.php中我得到了我的价值观; user_idtask_id& status_id并执行PDO UPDATE查询,以更新我的数据库。如果查询正确执行,我

echo json_encode ( array (
            'success' => true 
) );

然后我将任务附加到正确的表格单元格

if(typeof jsonResult.success != 'undefined') {
  $(uiDraggable).detach().css({top: 0,left: 0}).appendTo(el);
}

这一切都很好。但是,我开始意识到,当两个或更多人同时进行更改时,这是一个问题。如果我正在使用2个浏览器进行测试,并且例如在两个浏览器上打开了网站:那么,如果我在browser1上移动任务,我将不得不在browser2上手动刷新页面以查看更改。

所以我的问题是;如果对DB表进行了更改,如何自动检测应用程序?如何在不刷新页面的情况下更新HTML表格。

我已经查看了一些更新页面的定时间隔,但这对我不起作用,因为我真的不想强制浏览器刷新。例如,用户也可以在灯箱iframe中创建新任务,因此如果他们的浏览器在尝试创建新任务时刷新,则会对他们造成极大的烦恼。

所以是的,对我来说最好的做法是什么?

3 个答案:

答案 0 :(得分:1)

我会使用ajax以合理的间隔检查服务器。什么是合理的取决于你的项目 - 它应该经常足够,它的一端改变不会弄乱另一个用户正在做的事情。

如果您担心资源密集,可以使用APC为活动的所有内容保存上次修改时间 - 这样,当您只是检查是否有任何更改时,您不必访问数据库。 / p>

当事情发生变化时,您也应该使用ajax,并使用javascript / jquery直接在页面中添加更改。

答案 1 :(得分:1)

使用Redis及其publish/subscribe功能在PHP应用程序和轻量级websocket服务器之间实现消息总线(Node.js是一个不错的选择)。

当您的PHP修改数据时,它还会在Redis中发出一些事件,表明某些数据已更改。

当websocket客户端连接到Node.js服务器时,它告诉服务器它想要监视哪些数据,然后,一旦收到Redis事件并且事件的数据与客户端的监视数据匹配,就通知客户端在websocket上,然后刷新页面。

查看this question,并详细解释所有这些问题,包括可以重复使用的示例代码。

答案 2 :(得分:0)

如果您确实需要检查数据库更改 - 请编写数据库触发器。

但如果除了你的代码之外没有人改变它 - 你可以在你的代码中实现一些观察。

  1. 制作观察(EventListener)模式,或者使用现有的模式。
  2. 发生任何有意义的事件时触发事件。
  3. 订阅此活动