あなたは一種の紛らわしい役割です: php はサーバー側で実行され、クライアントに表示するデータを返します。通常はブラウザーが直接表示する本格的な HTML ですが、使用するとjsonやXMLなどのさまざまな形式のデータだけを返すこともできます。これはRPCのプロバイダーとして使用されます。これは、php ファイルのエンドポイントを使用して関数を呼び出し、データを返すという手の込んだ方法です。
クライアント側 (通常は Web ブラウザー) がユーザーと対話する方法を操作する場合は、その特定のコンテキストで対話するコードを記述する必要があります。ブラウザーでこれを行う統一された方法は、JavaScriptを使用することです。
javascript を使用すると、 setIntervalを使用して X 秒ごとにルーチンを呼び出すなど、さまざまな方法でページを (相互に) アクティブにすることができます。
var cMR;
function callMyResults(){
}
window.onload = function(){
cMR = setInterval('callMyResults',5000);
}
;
ページがロードされたときにコードが自動的に呼び出されるようにするには、onLoadイベント ハンドラーに関数をアタッチします。これにより、割り当てられた関数のすべてが実行されます。毎回 CallMyResults() 関数。setInterval の結果は cMR グローバルに保存されるため、後で必要に応じて間隔で実行されているコードを停止するために使用できます。
したがって、現在、このコードは何もしません。Javascript は他のページを呼び出すことができるため、現在AJAXと一様に呼ばれているものによってデータを取得できます。元々、これは XML ドキュメントを取得するためのものでした。これは、後で操作する (または単に現在表示されているドキュメントに書き込むだけ) ものでした。その後、これは json を使用するように進化しました。これは、javascript ネイティブ要素を返すため、使いやすく、ネットワーク接続を介して転送するサイズが一般的に小さくなり、ページがより高速になります。
これを簡単に行うための多くのライブラリが存在します。最も人気のあるライブラリの 1 つはjqueryですが、 XMLHttpRequestオブジェクト (AJAX の基礎)を使用して独自の呼び出しを記述することもできます。json データを取得するための this one のように、この例は Web 上にたくさんあります。
一般的に言えば、使いやすさ、独自の正気、およびより優れた簡単にアクセスできるコーディングのために、確立されたライブラリを使用することをお勧めします。
最後に、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 (mysql) とは別のRDBMSに切り替える場合に備えて、データベースにアクセスするための統一された方法が提供されます。その場合に適応する必要があるのは、インスタンス化するときにPDOオブジェクトに提供する DSN 文字列です。PDO のもう 1 つの非常に大きな利点は、自動的に引用される (したがって保護される)パラメーターを提供する準備済みステートメントを簡単に作成するメソッドを提供することによって、SQL インジェクションから保護することです。mysql_* 関数ファミリーの使用は推奨されなくなりました。PDO を使用するか、mysqli を使用してください。
だから、あなたに実用的な例を与えるために:
1 つのクライアント ページがあります: display.html と、データを生成して返すための 2 つのサーバー側ページ (fillList.php と retrieveList.php )
fillList.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をダウンロードして、このファイルと同じディレクトリに配置してください。
display.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 の datetime 値のリストが常に増えて更新されていることがわかります。