如果数据库有更改,则再次执行脚本
Posted
技术标签:
【中文标题】如果数据库有更改,则再次执行脚本【英文标题】:script execute again if the database have changes 【发布时间】:2014-03-23 07:01:27 【问题描述】:任何人都可以帮助我如何做到这一点,如果数据库只有一些更改,我的脚本只会再次自动执行....在我当前的脚本中,它一直根据 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);
?>
【问题讨论】:
两个字不可能 您需要 a) 在您的 javascript 层中存储当前状态的表示,b) 定期使用 ajax 轮询您的 PHP 函数(或使用 websocket 侦听器或类似的)和 c) 比较结果您的民意调查与当前状态表示。像 Angular 这样的框架会为你做一些这样的事情,但你仍然需要一些机制来轮询和更新数据。 或者更简单...您在 dba 中存储修改后的时间戳并在 JS 中比较这个... 【参考方案1】:这很难,但你可以做到。 (这就是想法和计算机的问题:答案总是肯定的,只是需要一段时间才能做到......)
Ajax 长轮询
假设您可以让 ajax 检索结果并将其显示给用户。现在理论上,如果您再次执行 ajax 请求,您应该会得到更新的结果。您甚至可以循环执行此操作!但这对于流量和用户系统来说不是很有效。相反,为什么不让服务器尽可能长时间地延迟它的回答,同时它会定期检查(比如每两秒一次)数据库是否给出不同的结果?
这称为长轮询。搜索结果虽然复杂,但让我们从更简单的角度来看。假设 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 方法,以查看结果是否与新查询结果不同。
网络套接字
当网络套接字在所有市长浏览器中标准化并实施时,这可能是一个更好的选择。它基本上就像长轮询一样使用,具有更高的超时时间,因此没有太大的收获。
【讨论】:
以上是关于如果数据库有更改,则再次执行脚本的主要内容,如果未能解决你的问题,请参考以下文章