我需要编写一个应用程序,每隔10秒检查一次来自外部服务器的数据库,看是否有新数据。目前我有一个javascript,通过比较两个JSON(旧的JSON和从服务器获取的新)以及是否有警报用户来检查数据是否已更改服务器。但这不是我在这个应用程序中所需要的。只有在数据是新的时候才会提醒用户,而不是在数据发生变化时。
我想也许我可以使用查询MYSQL的PHP代码执行此操作,如果查询num_results为0循环,则在用户收到通知时,num_results大于0。在这个应用程序中,只要用户获得新数据,用户是否可以在0,1秒或10秒内使用它并不重要。这就是我尝试进行MYSQL检查的方法,但它不起作用:
<?php
include 'config.php';
if(isset($_GET['ID'])) {
$maxLoop = 20;
while($maxLoop--) {
$dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
$sth = $dbh->prepare('select * from testit where id = :id');
$sth->bindParam(':id',$_GET['ID'],PDO::PARAM_INT);
$sth->execute();
if($sth->rowCount()>0) {
$results = $sth->fetchAll(PDO::FETCH_OBJ);
echo '{"key":'. json_encode($results) .'}';
exit; // Found new data, end loop and script
}
} catch(PDOException $e) {
break;
}
sleep(3);
} // end while
} // end if
那么如何更改此代码以使其工作,或者我应该尝试编写一些可以执行此操作的JavaScript?如果是这样,我如何检查数据是否是新的,而不仅仅是检查它是否已经改变?
答案 0 :(得分:3)
如何录制'新'数据?有时间戳吗? auto_increment主键字段?
最简单的轮询方法是简单地跟踪上一个已知的id /时间戳,看看是否有更高ID /更新时间戳的内容。
原样,你的方法效率很低。您选择表中的所有记录,强制mysql / pdo开始从磁盘中获取该数据等...然后在获取行计数后将其丢弃。一个更有效的方法是select count(*) ...
并检查该值。这使得mysql不必开始从磁盘中获取实际的行数据。在某些表类型(特别是myisam)上,count(*)操作非常快。
答案 1 :(得分:1)
如果您希望应用程序每10秒检查一次更改,则必须使用AJAX
向服务器上的php文件发出asyncronous
个请求。在php文件中,您只需要select * from testit where condition=false
,您就可以获得&#34;新数据&#34;。这是一个链接,您可以从中学习AJAX
的基础知识:
http://www.w3schools.com/ajax/default.asp