2011-01-07 26 views
10

データベースに行われた最新の更新を検出し、変更が発生したときにページを自動的に更新するにはどうすればよいですか?任意のアイデアやサンプルをいただければ幸いですデータベースが更新されたときにページを更新するにはどうすればよいですか?

$host = "localhost"; 
$username = "root"; 
$password = "root"; 
$db = mysql_connect($host,$username,$password) or die(mysql_error()); 
mysql_select_db('ccr') or die(mysql_error()); 

はのは、データベースへのアクセスがどのように見えるとしましょう。ありがとうございました。

答えて

9

これは私が最近jQueryを使用してソリューションを実装した方法です。

PHPは、の重要度がの更新が発生するたびにデータベースのフィールドをインクリメントします。ページが最初にロードされている

<?php 

// Call this function when data changes 
function update_clients() 
{ 
    mysql_query("UPDATE pageGen SET id = id + 1 LIMIT 1"); 
} 

// Call this function to get the ID to pass to JavaScript 
function get_update() 
{ 
    $result = mysql_query("SELECT id FROM pageGen LIMIT 1"); 
    $update = mysql_result($result, 0, 'id'); 
    return $update; 
} 

?> 

は、データベースからの数でJavaScript変数を移入:

<script type="text/javascript"> 
var pageGenID = 25218603 // generated by PHP 
var processUpdate = function(response) 
{ 
    if (pageGenID < response) 
    { 
     replace_current_data_with_new_via_ajax(); 
     pageGenID = response; 
    } 
} 
// Compare our Page Generate ID against that of the server 
var checkUpdates = function() 
{ 
    serverPoll = setInterval(function() 
    { 
     $.get('script_to_return_latest_pageGenID.php', 
      { lastupdate: 1 }, 
      processUpdate, 'html'); 
    }, 10000) 
}; 

// Check for updates every 10 seconds 
$(document).ready(checkUpdates); 

</script> 
+1

まず第一に、jQueryのは仕方が追加されません。このような単純なタスクにはあまりにも多くのオーバーヘッドが必要です。 AJAXルートを使用する場合は、単に 'XMLHttpRequest'オブジェクトを使用してください。また、私の記事で述べたように、javascriptやMySQLの注入の危険性が高まっているため、あなたの 'pageGenID' *サーバサイド*のようなものを保つようにしてください。 – Qix

+0

あなたのPHPでそれをエコーする必要があります返すことはありません –

+0

@OfirAttia:うん、エコーは、JavaScriptを生成したPHPスクリプトによって行われました。私はそれを明確にすべきだった。 – Kalessin

0

PHPを使用するときにデータベースをポーリングする必要があると思われますが、Java Webアプリケーションが永続的な接続を作成できるJavaコンテナの場合のように、PHPは長期実行プロセスでは存在しません)あなたはおそらくJavascriptでタイマーをセットアップすることを意味するいくつかの種類のポーリングメカニズムを採用する必要があります。クライアントコードは定期的にリクエストを行うことです。 usersテーブルに格納され、ユーザが最後にポーリングした後にデータベースが無効になったことを示すようにフラグを設定すると、そのユーザがすべてを全員に送信するのではなく、あるいは、この作業のためにPHPを放棄する必要があると思います。

0

Ideea:あなたはPHPでページをレンダリングするとき

、あなたはJS変数魔女「は、現在のデータベースのリビジョン」(番号)を保持している渡すことができます。このページでは、30秒に1回、ajaxコールを行います。魔法使いは、新しい現在のデータベースリビジョンを発声します。これらの2つをテストし、ajax呼び出しから取得したものが高い場合は、ページをリロードする必要があることを意味します。

サーバ側では、現在のリビジョンを保存するテーブルが必要です。現在のリビジョン+1(リビジョンデータベーステーブル内)を設定するたびに、phpからクエリを作成します。クライアントからajax呼び出しを受け取ると、データベースからその番号を読み取り、それをcilentに渡します。あなたは毎日カウンターをリセットするcronジョブをセットアップすることができます。

1

厳密に言えば、これは不可能です。 PHPが何か変更された場合、MySQLはトリガーを起動しません。それだけでは不可能です。また、MySQLはセッションを使用して動作するため、データベースの変更を報告できる場合でも、そのような種類のトリガーにアクセスできるように永続的な接続を使用する必要があります。

データベースの変更を検出するためにselectステートメントを実行する場合は、これとは異なります。あなたのコードをどのようにしたいのか(それがどのような互換性があるかに応じて)「新しい」方法に応じて、次のいずれかを使用してPHPページを "ポーリング"して変更を確認できます:Comet、AJAX、a永遠のフレーム、またはHTML5の新しいWebSocketクラスです。

他にも、クライアントを使用してデータベースバージョンのような変数を介して変更を検出する場合は、javascriptの注入方法を知っている人がその値を変更できるため、これは望ましくない悪意のある結果(たとえその値がどのように使用されているかにもよるが、MySQLのインジェクションにもよる)を生成する可能性がある。

2

これは私がやったことです、あなたがマークした答えを使用しましたが、私はそこに変更することがいくつかあると思います。メインページの (データベース内の何かが変更された場合に更新する) 私は自分のデータベース内でテーブルを作成しました。このテーブルでは、rowCounterという行を作成しました。 チェックしているテーブルの行数が変更されたときに、rowCounterが更新されています。 私のコードは2つのブロックにあります。 1つは私の設定から番号を与えている> rowCounter ともう一つは私にテーブルの現在の番号を与えるスクリプトです。それらが等しくなければ、私はページをリフレッシュします。

これは最初に必要なファイルです。メインページで
script_to_return_latest_pageGenID.php

// here you will make you connection query. 

$result = mysql_query("SELECT rowCounter FROM setting WHERE `id`='2'"); 
$update = mysql_fetch_assoc($result); 
     echo implode($update); 

    $count=mysql_query("SELECT `id` FROM log_".$datestamp."")or die(mysql_error); 
    $number = mysql_num_rows($count); 
//echo $number; 

    $countFromSetting=mysql_query("SELECT `rowCounter` FROM setting WHERE id='2'")or die(mysql_error); 
    $numberFromSetting=implode(mysql_fetch_assoc($countFromSetting)); 

    if($number != $numberFromSetting) 
     { 
      mysql_query("UPDATE setting SET `rowCounter`='$number' WHERE `id`='2'")or die(mysql_error); 

     } 


それを呼び出すあなたはスクリプトの前にそれを置く、私が書いたコードの二つのブロックを書き込みます。このコードの後

$countFromSetting=mysql_query("SELECT `rowCounter` FROM setting WHERE id='2'")or die(mysql_error); 
     $numberFromSetting=implode(mysql_fetch_assoc($countFromSetting)); 

あなたは数字が、それはページを更新します等しくないかどうかを確認、PHPページ数秒ごとに照会するスクリプトを置きます。

var pageGenID = "<?php echo $numberFromSetting; ?>"; 
var processUpdate = function(response) { 


var x=response; 
//console.log(pageGenID); by removing the remarks you will see the compared numbers all the time. 
//console.log(x); 
if (pageGenID != x) 
{ 
    //replace_current_data_with_new_via_ajax(); 
    pageGenID = response; 

    window.location.reload();  
    } 
} 

var checkUpdates = function() 
{ 
    serverPoll = setInterval(function() 
    { 

$.get('script_to_return_latest_pageGenID.php', 
     { lastupdate: 1 }, 
     processUpdate, 'html'); 
    }, 5000) }; 
    $(document).ready(checkUpdates); 
0

あなたはwhileループを使用して、このようなものを使用することができますようにそれは思われます。これは、ユーザーの膨大な量のため 仕事(おそらくクラッシュPHPやSQL意志)、およびいくつかの点で、あなたのスクリプト内のカウント変数をリセットする必要があります :

<?PHP 
//initialize the variables somewhere before any of the following. do not use these 
//variables for any other purpose other than the refresh routines: 
$a==0; 
$b==0; 
//First design code within a function to refresh the database a single iteration. 
fuction refresh(){ 
    insert code here to output database; 
     } 

//Now, call function refresh in a loop at the spot in the code 
//where we want to refresh the database. where $b here is equal to 
//the number of times you want the database to automatically refresh 
//before having to reset the variables to 0. 

$b==1 
while ($b!==$a){ 
     refresh(); 
     $a==$a+1; 
     } 

?> 
関連する問題