Как обновить страницу при обновлении базы данных?

Как я могу обнаружить последние обновления, сделанные в базе данных, и тихо обновлять страницу при изменении?

Скажем, доступ к базе данных выглядит следующим образом:

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

Любые идеи и образцы будут оценены. Спасибо.

Ответ 1

Вот как я недавно реализовал решение с помощью 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>

Ответ 2

Вот что я сделал и использовал ответ, который вы отметили, но я думаю, что есть несколько вещей, которые нужно изменить. На главной странице (которую вы хотите обновить, если что-то изменилось в базе данных). Я создал таблицу в своей базе данных с именем setting, в этой таблице я создал строку с именем rowCounter. rowCounter обновляется, когда изменяется количество строк в проверяемой вами таблице. поэтому мой код разделен на два блока. один, который дает мне номер из настройки> 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 );

Ответ 3

Я считаю, что вам придется опросить базу данных при использовании PHP, PHP не существует в длительном процессе, как в случае контейнера Java, где веб-приложение Java может создавать постоянное соединение (теоретически) вам, скорее всего, понадобится использовать какой-то механизм опроса, с помощью которого я имею в виду установку таймера в Javascript или что бы ваш клиентский код периодически делал запрос с точки зрения повышения эффективности для этого, если вам нужно создать флаг на users и установите флаг, чтобы указать, что база данных была признана недействительной с момента последнего опроса пользователя, тогда ваша первая проверка будет, если с момента последнего обновления пользователя произошла недействительность, а не все время для отправки всем. В качестве альтернативы, я думаю, вам нужно отказаться от PHP для этой задачи.

Ответ 4

Ideea:

При рендеринге страницы с помощью php вы можете передать переменную js, которая хранит "текущую ревизию базы данных" (число). На странице вы делаете вызов ajax один раз каждые 30 секунд, ведьма возвращает новую текущую версию базы данных, так сказать. Вы тестируете эти 2, и если тот, который вы получили от вызова ajax, выше, значит, вам нужно перезагрузить страницу.

На стороне сервера вам нужна таблица для хранения текущей версии, каждый раз, когда вы делаете запрос с php, вы устанавливаете текущую ревизию +1 (в таблице базы данных ревизий). Когда вы получаете ajax-вызов от клиента, вы читаете это число из базы данных и передаете его на циклон. Вы можете настроить cronjob, который будет reset счетчик каждый день.

Ответ 5

Строго говоря, это невозможно. MySQL не запускает триггеры на PHP, если что-то изменилось. Это просто невозможно. Кроме того, MySQL работает с использованием сеансов, поэтому даже если он сможет сообщить об изменениях в базе данных, вам придется использовать постоянное соединение, чтобы вы могли получить доступ к этому типу триггера.

Теперь, если вы хотите выполнить команды выбора, чтобы обнаружить изменения в базе данных, это разные. В зависимости от того, как "новый" вы хотите, чтобы ваш код был (в зависимости от того, насколько вы совместимы), вы можете использовать любое из следующих действий для "опроса" страницы PHP для проверки изменений: Comet, AJAX, a forever frame или HTML5 новый класс WebSocket.

В то время как другие говорят, что клиент обнаруживает изменение через переменные, такие как версия базы данных, хранящаяся в javascript, я бы посоветовал вам оставить этот сервер стороной только потому, что люди, которые знают, как вставлять javascript, смогут изменить это значение, что может привести к нежелательным или даже злонамеренным результатам (даже в зависимости от того, как это значение используется, инъекции MySQL).

Ответ 6

Казалось бы, вы могли бы использовать что-то вроде этого, используя цикл while. Это не будет работать для огромного количества пользователей (возможно, сбой PHP или SQL), и в какой-то момент вам потребуется reset переменные count в script.:

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

 ?>