web-dev-qa-db-ja.com

データベースが更新されたときにページを更新するにはどうすればよいですか?

データベースに加えられた最新の更新を検出し、変更が発生したときにページをサイレントに更新するにはどうすればよいですか?

データベースアクセスが次のようになっているとします。

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

任意のアイデアやサンプルをいただければ幸いです。ありがとうございました。

13
omc11

これは私が最近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>
11
Kalessin

これが私がやったこととあなたがマークした答えを使ったものですが、そこには変更すべきことがいくつかあると思います。メインページ(データベースで何かが変更された場合に更新するページ)。データベースにテーブルという設定を作成しました。このテーブルに、rowCounterという行を作成しました。チェックするテーブルの行数が変更されると、rowCounterが更新されます。だから私のコードは2つのブロックに分割されました。 1つ目は、設定> rowCounterから数を取得し、2つ目は、テーブルの現在の数を取得するスクリプトです。それらが等しくない場合は、ページを更新します。

これが最初に必要なファイルです
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);

        }


メインページで、提供した2つのコードブロックを記述し、スクリプトの前に配置する必要があります。

$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 );
2
Ofir Attia

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;
      } 

 ?>
1
Scott Fulkerson

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

ここで、selectステートメントを実行してデータベースの変更を検出する場合は異なります。コードをどの程度「新規」にしたいかに応じて(コードの互換性に応じて)、次のいずれかを使用して「ポーリング」するPHP page to変更を確認します。Comet、AJAX、foreverフレーム、またはHTML5の新しいWebSocketクラス。

他の人はJavaScriptに保存されているデータベースバージョンのような変数を介して変更を検出するためにクライアントを使用すると言いますが、JavaScriptを注入する方法を知っている人がその値を変更できるため、そのサーバーをそのままにしておくことをお勧めします。望ましくない、または悪意のある結果(その値の使用方法によっては、MySQLインジェクション)。

PHPを使用する場合はデータベースをポーリングする必要があると思います。PHPはJava Java Webアプリケーションが永続的な接続を作成できるコンテナ)(理論的には)ある種のポーリングメカニズムを使用する必要がある可能性があります。つまり、JavaScriptまたはクライアントコードでタイマーを設定することになります。これは、必要に応じてユーザーのテーブルにフラグを作成し、フラグを設定して、ユーザーが最後にポーリングしてからデータベースが無効化されていることを示す必要がある場合、効率を高めるという観点から、定期的にリクエストを行うことです。最初のチェックはすべてのユーザーに常にすべてを送信するのではなく、ユーザーが最後に更新してから無効化が発生した場合。または、このタスクではPHPを放棄する必要があると思います。

1
shaunhusain

Ideea:

Phpでページをレンダリングするとき、witchが「現在のデータベースリビジョン」(数値)を保持しているjs変数を渡すことができます。このページでは、魔女が30秒ごとに1回ajax呼び出しを行い、いわば魔女が現在の新しいデータベースリビジョンを受け取ります。これら2つをテストし、ajax呼び出しから取得したものの方が高い場合は、ページをリロードする必要があることを意味します。

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

1
Poelinca Dorin