Intereting Posts
Утечка памяти DOMDocument PHP ZF2 – необходимо отобразить конкретное сообщение об ошибке при отказе определенного состояния Файл виртуального хоста CakePHP 2.x для Apache2 В Laravel любой недостаток использования App :: make (''), а не инсталляции конструктора? Проблема с обработчиком сеанса session.handler.native_file в symfony2 получить все группы от пользователей – sfDoctrineGuardPlugin MySQL – обновление, если существует else, вставить двумя ключами Команда zip -P не работает для создания защищенного паролем файла zip Как соединить эхо Установка APC в Windows Прекращение процессов дочерних процессов зомби, раздвоенных с сервера сокетов установить значение компонента webform с помощью hook_form_alter в drupal php file_get_contents () показывает страницу вместо html-исходного кода Изменить .htaccess с помощью PHP как создать веб-службу php, которая принимает строку и выполняет операции с базой данных

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

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

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

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

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

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

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

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

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

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

Ideea:

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

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

Казалось бы, вы можете использовать что-то вроде этого, используя цикл 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; } ?>