Как обновить страницу при обновлении базы данных?
Как я могу обнаружить последние обновления, сделанные в базе данных,и тихо обновить страницу при изменении?
допустим доступ к базе данных выглядит так:
$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 ответов
вот как я недавно реализовал решение с помощью 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>
вот что я сделал, и я отвечу вы отметили, но я думаю, что есть несколько вещей, чтобы там пересесть. на главной странице (которую вы хотите обновить, если что-то изменится в базе данных). я создал таблицу в моей базе данных под названием 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 );
Я считаю, что вам придется опрашивать базу данных при использовании PHP, PHP не существует в длительном процессе, как в случае с контейнером Java, где веб-приложение Java может создать постоянное соединение (теоретически), вам, вероятно, придется использовать какой-то механизм опроса, с помощью которого я имею в виду установку таймера в Javascript или любой другой клиентский код, чтобы периодически делать запрос, с точки зрения повышения эффективности для этого, если нужно, вы можете создать флаг в таблице пользователей и установите флаг, чтобы указать, что база данных была недействительна с момента последнего опроса пользователя, тогда ваша первая проверка будет, если недействительность произошла с момента последнего обновления этого пользователя, а не отправки всего всем все время. В качестве альтернативы, я думаю, вам нужно отказаться от PHP для этой задачи.
Ideea:
когда вы рендерите страницу с php, вы можете передать переменную JS, которая содержит "текущую ревизию базы данных" (число ) . На странице вы делаете вызов ajax один раз в 30 секунд ведьма восстанавливает новую текущую ревизию базы данных, так сказать . Вы тестируете для этих 2, и если тот, который вы получили от вызова ajax, выше, это означает, что вам нужно перезагрузить страницу .
на стороне сервера, вам нужен стол для хранения текущей версии , каждый раз, когда вы делаете запрос из php вы устанавливаете текущую ревизию +1 (в таблице базы данных ревизий ) . Когда вы получаете вызов ajax от клиента, Вы читаете этот номер из базы данных и передаете его в cilent . Вы можете настроить cronjob, который будет сбрасывать счетчик каждый день .
строго говоря, это невозможно. MySQL не запускает триггеры обратно в PHP, если что-то изменилось. Это просто невозможно. Кроме того, MySQL работает с использованием сеансов, поэтому, даже если он может сообщить об изменении в базе данных, вам придется использовать постоянное соединение, чтобы вы могли получить доступ к такому триггеру.
теперь, если вы хотите выполнить инструкции select для обнаружения изменения в базе данных, это другое. В зависимости от того, как "Новый" вы хотите, чтобы ваш код был (в зависимости от того, насколько вы хотите, чтобы это было совместимо) вы можете использовать любую из следующих страниц для "опроса" PHP-страницы для проверки изменений: Comet, AJAX, a forever frame или HTML5's new WebSocket
класса.
в то время как другие говорят, что используют клиент для обнаружения изменений через переменные, такие как версия базы данных, хранящаяся в javascript, я бы посоветовал вам оставить этот сервер на стороне просто потому, что люди, которые знают, как вводить javascript, смогут изменить это значение, которое может привести к нежелательным или даже вредоносные результаты (даже, в зависимости от того, как это значение используется, инъекции MySQL).
казалось бы, вы могли бы использовать что-то вроде этого, используя цикл while. Это не работа для огромного количества пользователей (вероятно, сбой PHP или SQL), и в какой-то момент вам придется сбросить переменные count в вашем скрипте.:
<?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;
}
?>