我想从mySQL中获取一些数据而不使用jQuery刷新页面。如果更新了mysql表中的任何记录,有人可以告诉我如何获取数据。例如,以下代码从数据库中获取一个数字计数,如果有人在数据库中添加了一个数字并且它已更新,那么如何在没有页面刷新的情况下显示新数字?感谢。
<?
$query = "SELECT number, name FROM members WHERE id=1";
$result = mysql_query($query);
$row = mysql_fetch_array($result);
$number = $row['number']; ?>
答案 0 :(得分:3)
已经提到过两次,但我仍然想强调它。您永远不会希望客户端能够直接访问数据库。这是一个严重的安全风险。
现在解决方案。首先,您需要设置一个可以使用ajax请求的PHP文件。我们称之为check.php
,它看起来像这样:
<?php
// include necessary files to enable connection to the database
$query = "SELECT number, name FROM members WHERE id=1";
$result = mysql_query($query);
$row = mysql_fetch_array($result);
$number = $row['number'];
// send correct content type header of json
header("Content-Type", "application/json");
// we create an array, and encode it to json
// then echo it out while killing the script
die(json_encode(array('numbers'=>$number)));
现在进入JavaScript。解决方案类似于Kyle Humfeld,但不会使用setInterval
,因为这是一个非常糟糕的做法。这背后的原因是因为setInterval
不关心你的ajax调用的状态,如果它已经完成了。因此,如果服务器出现问题,您最终可能会收到堆叠请求,但这并不好。
为了防止出现这种情况,我们改为使用success
的组合 - ajax方法的回调(.getJSON
本质上是.ajax
的简写)和setTimeout
创建一个名为polling的东西:
$(function(){
// placeholder for request
var request = null;
// request function
var check = function() {
request = $.getJSON('check.php', function(data){
// this will log the numbers variable to the dev console
console.log(data.numbers);
// initiate a timeout so the same request is done again in 5 seconds
setTimeout(check, 5000);
});
});
// initiate the request loop
check();
// if you want to cancel the request, just do request.abort();
});
此外,还有一个更高级的解决方案,使用comet server将数据从服务器推送到客户端,但在挖掘彗星之前,您应该尝试先使用上述工具。如果你想阅读这个主题,我建议你看一下APE。
答案 1 :(得分:0)
正如@Pekka所提到的,你需要对执行db调用的PHP页面进行AJAX调用。但是,看起来您的问题比这更复杂,因为您想要在插入新记录时定期检查并更新(部分?)您的页面,对吗?
如果是这样,您应该可以使用setInterval()来执行此操作。它是一个原生的javascript函数,基本上只是设置一个间隔(以毫秒为单位),然后运行一些代码。使setInterval()
与setTimeout()
不同的是setInterval()
重复运行,直到您告诉它停止(使用clearInterval()
)。
因此,您可以使用它每30秒(或您喜欢的任何方式)进行AJAX调用,以查找新记录并相应地更新结果div。