Как я могу обновить страницу при обновлении базы данных? - PullRequest
12 голосов
/ 07 января 2011

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

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

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

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

Ответы [ 6 ]

11 голосов
/ 07 января 2011

Так я недавно реализовал решение с использованием 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 голосов
/ 06 декабря 2012

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

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

1 голос
/ 07 января 2011

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

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

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

1 голос
/ 07 января 2011

Ideea:

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

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

1 голос
/ 07 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...