你有点令人困惑:php运行服务器端,它返回你显示给客户端的数据,通常是浏览器直接显示的完整HTML,但它也可以在你使用时只返回各种格式的数据,如json或XML它作为RPC的提供者,这是一种通过 php 文件端点调用函数并让它返回数据的奇特方式。
如果您想操纵客户端(通常是网络浏览器)如何与用户交互,那么您需要编写在该特定上下文中交互的代码,浏览器的统一方法是使用JavaScript。
使用 javascript,您可以使用setInterval以多种方式使您的页面(交互)处于活动状态,例如每 X 秒调用一次例程。
var cMR;
function callMyResults(){
}
window.onload = function(){
cMR = setInterval('callMyResults',5000);
}
;
为了在页面加载时自动调用您的代码,我们将一个函数附加到onLoad事件处理程序,这将执行分配给它的函数中的所有内容,在我们的例子中,它将设置一个 5000 毫秒的间隔,它将执行每次调用 MyResults() 函数。setInterval 的结果保存在 cMR 全局中,以便以后可以在需要时停止在间隔上执行的代码。
所以目前这段代码什么都不做。Javascript 可以调用其他页面,从而通过现在统一称为AJAX的东西检索数据。最初,这意味着检索您随后操作的 XML 文档(或只是简单地写入当前显示的文档)。后来这已经演变为使用 json,因为它返回一个 javascript 本机元素,使其更易于使用并且通常更小,以通过网络连接传输,这使得页面更快捷。
许多库可以轻松完成此操作,其中最流行的库之一是jquery ,但您也可以使用XMLHttpRequest对象(AJAX 的基础)编写自己的调用。你会在网上找到很多这样的例子,比如这个用于检索 json 数据的例子。
一般来说,建议您使用已建立的库,以便于使用、您自己的理智以及更好、更容易访问的编码。
最后,在 PHP 端,您只需像往常一样收集数据,但打印数据略有不同,可以是您自己指定格式的 XML,也可以使用json_encode将其作为 json 返回。这可以简单如下:
<?php
$pdo = new PDO('mysql:dbname=testdb;host=127.0.0.1',$user,$password);
$result = $pdo->query('SELECT * FROM msgs');
print json_encode($result->fetchAll());
请注意,我使用PHP 数据对象(通常称为 PDO)来访问数据库,这提供了一种访问数据库的统一方式,以防您切换到另一个RDBMS,而不是当前使用的 RDBMS(mysql)。在这种情况下,您需要调整的是在实例化PDO对象时提供给它的 DSN 字符串。PDO 的另一个非常大的优点是它通过提供方法来保护您免受SQL 注入,这些方法可以轻松创建准备好的语句,您可以向该语句提供自动引用的参数(因此受到保护);不再推荐使用 mysql_* 系列函数:使用 PDO 或使用 mysqli。
所以,给你一个工作的例子:
我们有 1 个客户端页面:display.html 和 2 个用于生成和返回数据的服务器端页面(fillList.php 和 retrieveList.php)
填充列表.php
<?php
// we work with the following table
// create table list_data (`when` DATETIME NOT NULL);
// make sure to adapt these settings to yours, including username and password
$pdo = new PDO('mysql:dbname=scratch;host=localhost','username','password');
$pdo->exec('INSERT INTO list_data VALUES (NOW())');
这将在表的when
列中插入一个新值list_data
检索列表.php
<?php
// make sure to adapt these settings to yours, including username and password
$pdo = new PDO('mysql:dbname=scratch;host=localhost','scratch','scratch');
print json_encode($pdo->query('SELECT `when` FROM list_data
ORDER BY `when` DESC'
)->fetchAll(PDO::FETCH_ASSOC)
);
检索list_data
在按降序排列的表中找到的所有值,并将结果关联数组作为 json 对象返回。
我决定向您展示一个使用 jquery 的示例客户端页面,确保您下载最新的jquery-1.7.2.js并将其放在与此文件相同的目录中。
显示.html
<html><head><title>Refreshing List</title>
<script src="http://localhost/jquery-1.7.2.js" />
</head>
<body>
<p>this list refreshes every 5 seconds, a new value is inserted every 2 seconds</p>
<ul id="toRefresh">
<li>base</li>
</ul>
<script>
function fillList(){
// we insert a new value in the database by calling fillList.php
$.get("http://localhost/fillList.php");
}
function refreshList(){
/*
we retrieve the json encoded data returned by retrieveList.php
and process it in our anonymous function
*/
$.getJSON("http://localhost/retrieveList.php",function (data){
var items = [];
// loop through the returned array
$.each(data,function(key,val){
// we passed an associative array so we can use the columnname: 'when'
items.push("<li>when: " + val['when'] + "</li>");
});
// clear the list and append the data to it
$("#toRefresh").empty();
$("#toRefresh").append(items.join(''));
});
}
// jquery uses .ready() instead of window.onload = function(){}
$(document).ready(function (){
// retrieve the data every 5 seconds
setInterval(function(){refreshList();},5000);
// insert additional new data every 2 seconds
setInterval(function(){fillList();},2000);
// we fill the list with its initial values
refreshList();
});
</script>
</body>
</html>
如您所见,jquery 为您提供了一种简单的方法来执行这些操作。运行 display.html 页面,您将看到一个不断增长和刷新的 mysql 日期时间值列表。