如果数据库有更改,脚本将再次执行

时间:2014-02-21 16:34:18

标签: javascript php mysql ajax json

任何人都可以帮助我如何做到这一点,如果数据库只有一些更改,我的脚本只能自动执行....在我当前的脚本中,它根据var timer {{1}一直执行如果我在没有刷新页面的情况下更改数据库中的值,或者再次单击该按钮执行脚本,则自动更新setInterval的输出。

我想做的是,只有在数据库中的表中有一些值更改时才会再次执行...有人知道怎么做吗?

脚本代码:

textboxes

search.php代码:

<script>
$(document).ready(function(){
var timer ;
$('#send_search_form').click(function(event){
        event.preventDefault();
        $(".search_form_input").val('');
        $(".empty_batchcode").html("Doesn't exist!");
        clearInterval(timer);
        updateTextboxes();

});
var $funiq_id         = $('#funiq_id'),
    $t_region         = $('#t_region'),
    $t_town           = $('#t_town'),
    $t_uniq_id        = $('#t_uniq_id'),
    $t_position       = $('#t_position'),
    $t_salary_grade   = $('#t_salary_grade'),
    $t_salary         = $('#t_salary');

function updateTextboxes(){
        $.ajax({
        url:"search.php",
        type:"GET",
        data: { term : $('#query').val() },
        dataType:"JSON",
        success: function(result) {

        var ii = 1;

        for (var i = 0; i < result.length; i++) { 
                    $funiq_id.html(result[i].value).show(); // reference
                    $t_region.val(result[i].region).show(); // reference
                    $t_town.val(result[i].town).show(); // reference
                    $t_uniq_id.val(result[i].uniq_id).show(); // reference
                    $t_position.val(result[i].position).show(); // reference
                    $t_salary_grade.val(result[i].salary_grade).show(); // reference
                    $t_salary.val(result[i].salary).show(); // reference
                    $('#id'+ii+'').val(result[i].atid).show();
                    $('#aic'+ii+'').val(result[i].atic).show();
                    $('#name'+ii+'').val(result[i].atname).show();
                    $('#other_qual'+ii+'').val(result[i].other_sum).show();
                    $('#interview'+ii+'').val(result[i].interview_sum).show();
            ii++;
            }


        if(timer == 1){

            timer = setTimeout(updateTextboxes,1000); 
        }

        }


    });

   timer = setInterval(updateTextboxes,50000);
}
});      
 </script>

1 个答案:

答案 0 :(得分:0)

很难,但你可以做到。 (这就是想法和计算机的问题:答案总是肯定的,它只需要一段时间才能实现......)

Ajax长轮询

假设您可以让ajax检索结果并将其显示给用户。现在,如果你再次执行ajax请求,你应该得到更新的结果。你甚至可以在循环中做到这一点!但这对于流量和用户系统来说效率不高。相反,为什么不让服务器尽可能地延迟其答案,同时它会定期检查(例如每两秒一次)数据库是否给出不同的结果?

这称为长轮询。搜索结果很复杂,所以让我们从更简单的角度来看一下。让我们说ajax调用想要咳出最新/最新的数据库条目,所以它请求一个执行这个SQL查询的PHP文件:

SELECT * FROM table ORDER BY `id` DESC LIMIT 1

PHP文件只返回id。并允许附加调试timestamp以区分各个请求。如果一切顺利,您只会在timestamp时看到id更改。

现在PHP做了(伪代码)

// Settings
$oldid = $_GET['oldid'];
$delay = 2; // in seconds
$timeout = 20; // in seconds, must be below server and browser timeout.

// Check until different, or timeout.
$timer = 0;
while (1) {
  // TODO: Execute query and populate $id

  // If different, return as JSON.
  if ($id!=$oldid) {
    die('{"ajax": {"poll": "OK","id": '.$id.',"timestamp": '.time().'}');
  }

  // If taking to long, stop.
  if ($timer>$timeout) { die('{"ajax": {"poll": "timeout"}}'); }
  $timer += $delay;

  // The artificial delay.
  sleep($delay);
}

现在,如果你使用somefile.php?oldid=3来调用它,并且最新的数据库条目也是3,那么你会在20秒内恢复timeout。除非在那段时间内id改为其他值。

现在,执行AJAX的客户端不应该在第一个AJAX请求完成之前启动下一个AJAX请求。所以不要使用setinterval(),而是使用settimeout()。如果回复是timeout,您可能不想更新页面内容。

就是这样! 搜索结果也是如此,但您应该考虑制作散列,CRC,时间戳或其他低CPU方法,以查看结果是否与新查询结果不同。

的WebSockets

当web-socket在所有市长浏览器中得到标准化并实现时,这可能是更好的选择。它的使用基本上就像长时间轮询一样,具有更高的超时,因此没有多少收益。