javascript - 如果数据库有变化,脚本再次执行

标签 javascript php mysql ajax json

谁能帮我怎么做,如果数据库只有一些变化,我的脚本只会自动再次执行....在我当前的脚本中,它一直根据 var timer setInterval 以便在我更改数据库中的值而不刷新页面或再次单击按钮执行脚本时自动更新 textboxes 的输出。

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

脚本代码:

<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>

search.php代码:

<?php

if (isset($_GET['term'])) {

    $q = $_GET['term'];
    mysql_connect("localhost", "root", "");
    mysql_select_db("klayton");
    $query = mysql_query
("
SELECT DISTINCT 
ROUND((SELECT SUM(t2.inttotal)
 FROM app_interview2 AS t2 
 WHERE t2.atic = t.atic)/7,1)
 AS interview_sum,

ROUND((SELECT SUM(o2.ototal)
 FROM other_app2 AS o2 
 WHERE o2.oaic = t.atic)/7,1)
 AS other_sum,

atid,
atic,
atname,
region,
town,
uniq_id,
position,
salary_grade,
salary
FROM app_interview2 AS t
WHERE uniq_id = '$q'
GROUP BY t.atname HAVING COUNT(DISTINCT t.atic) ");

    $data = array();

    while ($row = mysql_fetch_array($query)) {
        $data[] = array(
            'value' => $row['uniq_id'],
            'atid' => $row['atid'],
            'atic' => $row['atic'],
            'region' => $row['region'],
            'town' => $row['town'],
            'uniq_id' => $row['uniq_id'],
            'position' => $row['position'],
            'salary_grade' => $row['salary_grade'],
            'salary' => $row['salary'],
            'atname' => $row['atname'],
            'other_sum' => $row['other_sum'],
            'interview_sum' => $row['interview_sum']
        );
    }

    header('Content-type: application/json');
    echo json_encode($data);

}

?>

最佳答案

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

Ajax 长轮询

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

这称为长轮询。虽然搜索结果很复杂,但让我们从更简单的 Angular 来看这个问题。假设 ajax 调用想要获取最新/最新的数据库条目,因此它请求一个执行此 SQL 查询的 PHP 文件:

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

PHP 文件只返回 id。并让我们附加一个调试 timestamp 来区分各个请求。如果一切顺利,您只会在 id 发生变化时看到 timestamp 发生变化。

现在 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 调用它并且最新的 DB 条目也是 3,您将在 20 秒内返回 timeout。除非在那段时间内 id 更改为其他值。

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

就是这样! 搜索结果也是如此,但您应该考虑使用哈希、CRC、时间戳或其他低 CPU 方法来查看结果是否与新查询结果不同。

网络套接字

当网络套接字在所有主流浏览器中实现标准化和实现时,这可能是一个更好的选择。它基本上就像长轮询一样使用,但超时时间要长得多,所以在那里没有太多收获。

关于javascript - 如果数据库有变化,脚本再次执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21939937/

相关文章:

Javascript:改进四个嵌套循环?

javascript - UIAutomation 测试计时器等到完成

javascript - Canvas toBlob 在 iPhone Safari 上不起作用?

javascript - 如何将文本区域中的空格或换行符转换为逗号分隔的 PHP 数组

php inside php with $_session echo

mysql - 添加两个外键时出现 1215 错误

mysql - 团队总数/mysql

javascript - 当我上传文件后尝试读取事件目标时,事件目标返回为空

php - 如何检查 'YYYY-MM-DD' 格式的日期和 PHP 中 'Unix Time stamp' 格式的日期?

java - 我应该如何创建这个新页面? JSP 还是 servlet?