【问题标题】:How can I refresh a page when a database is updated?更新数据库时如何刷新页面?
【发布时间】:2011-06-05 12:06:22
【问题描述】:

如何检测对数据库所做的最新更新并在发生更改时静默刷新页面?

假设数据库访问如下所示:

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

任何想法和示例将不胜感激。谢谢。

【问题讨论】:

    标签: php database refresh


    【解决方案1】:

    这是我所做的并使用了您标记的答案,但我认为那里有一些地方需要改变。 在主页中(如果数据库发生更改,您要刷新该页面)。 我在我的数据库中创建了一个名为 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 );
    

    【讨论】:

    • 如果您更改记录怎么办?行数不会改变。
    • @macmuri 实际上这是一篇旧帖子,我建议使用 WebSockets 通知您的网站在 db 发生更改时再次获取您的 API。如果您仍然想使用这种方法,我建议在这里为它添加另一个标志( 0 或 1 ),当它为 1 时,您将刷新页面并将其更改回 0 并且数据库上的每次更改都会将此标志更新为 1 .
    【解决方案2】:

    看起来你可以使用这样的东西,使用一个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;
          } 
    
     ?>
    

    【讨论】:

      【解决方案3】:

      严格来说,这是不可能的。如果发生更改,MySQL 不会将触发器返回给 PHP。这是不可能的。此外,MySQL 使用会话进行操作,因此即使它可以报告数据库中的更改,您也必须使用持久连接才能访问此类触发器。

      现在,如果您想执行 select 语句来检测数据库中的变化,那就不同了。根据您希望代码的“新”程度(取决于您希望它的兼容性),您可以使用以下任何一种方法来“轮询”PHP 页面以检查更改:Comet、AJAX、永远的框架,或者 HTML5 的新 WebSocket 类。

      虽然其他人说使用客户端通过变量(例如存储在 javascript 中的数据库版本)来检测更改,但我建议您将服务器留在服务器端,因为知道如何注入 javascript 的人将能够更改该值,这可能会产生不希望的甚至恶意的结果(甚至,取决于该值的使用方式,MySQL 注入)。

      【讨论】:

      • 这个 websocket 东西似乎是更好的解决方案之一,但它似乎需要一套新的技能。
      【解决方案4】:

      这就是我最近使用 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>
      

      【讨论】:

      • 首先,JQuery 为这样一个简单的任务增加了太多的开销。如果您要使用 AJAX 路线,只需使用 XMLHttpRequest 对象。另外,就像我在帖子中所说的那样,保留您的 pageGenID 服务器端之类的东西,因为 javascript 或 MySQL 注入的风险增加。
      • 在你的 php 中你需要回显它而不是返回
      • @OfirAttia:是的,回显是由生成 JavaScript 的 PHP 脚本完成的。我应该说清楚的。
      • 好吧,你知道我拿了你的代码并做了一些改变,因为我遇到了这个问题并且没有成功用你给的东西刷新页面..也许我错过了一些东西。但你可以在我的帖子下面看到。
      【解决方案5】:

      想法:

      当你用 php 渲染一个页面时,你可以传递一个 js 变量来保持一个“当前数据库修订”(一个数字)。在您每 30 秒进行一次 ajax 调用的页面上,女巫会收到一个新的当前数据库修订版。你测试那些 2,如果你从 ajax 调用中得到的更高,那么这意味着你需要重新加载页面。

      在服务器端,您需要一个表来存储当前版本,每次从 php 进行查询时,您都会设置当前版本 +1(在版本数据库表中)。当您收到来自客户端的 ajax 调用时,您会从数据库中读取该号码并将其传递给 cilent 。您可以设置一个每天都会重置计数器的 cronjob。

      【讨论】:

        【解决方案6】:

        我相信您在使用 PHP 时必须轮询数据库,PHP 不存在于长时间运行的进程中,就像 Java Web 应用程序可以创建持久连接的 Java 容器(理论上)您可能需要使用某种轮询机制,我的意思是在 Javascript 或任何您的客户端代码中设置一个计时器来定期发出请求,以提高效率,如果需要的话,您可以在users 表并设置标志以指示自用户上次轮询以来数据库已失效,那么您的第一个检查将是自该用户上次更新以来是否发生了失效,而不是一直将所有内容发送给每个人。或者,我认为您需要放弃 PHP 来完成这项任务。

        【讨论】:

          猜你喜欢
          • 2016-10-22
          • 1970-01-01
          • 1970-01-01
          • 2013-03-14
          • 2019-04-09
          • 1970-01-01
          • 2018-10-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多