如何基于表更改php + mysql轮询数据库

时间:2017-03-21 11:37:25

标签: javascript php jquery html mysql

我想在我的php文件中更新我生成的表,只有在数据库表中有更改但我不知道如何执行此操作时。在阅读了所有类似的问题后,我仍然无法理解我应该做的事情。

我在main.php

中的div <div id="table_holder" class="table-responsive" style="height: 300px;"></div>中显示我的表格

这是我每隔5秒刷新一次表的JS。

<script type="text/javascript">
    $(document).ready(function(){
        refreshTable();
    });

    function refreshTable(){

        $('#table_holder').load('live_table_data.php', function(){
            setTimeout(refreshTable, 5000);
        });
    }
</script>

这是我在 live_data_table.php

中显示我的表格的方式
$result = $conn->query("select date,student_id, s.s_name as Name, s.s_lname as Last, s.s_email as Email, time from attendance_record A 
                            inner join student s on A.student_id = s.s_id
                            inner join session b on A.session_id = b.session_id
                        where b.module_id = 7 and A.date = '2017-03-20' and b.start_time = '16:00'");

?>
<table class="table-responsive" id="live_table">
    <thead>
    <tr >
        <th>Student ID</th>
        <th>Name</th>
        <th>Last Name</th>
        <th>Email</th>
        <th>Arrival</th>
        <th>Date</th>
    </tr>
    </thead>
    <tbody style="overflow: auto">
    <?php
    while ($row = $result->fetch_assoc()) {
        unset($student_id, $Name, $Last, $Email, $time, $date);
        $student_id = $row['student_id'];
        $Name = $row['Name'];
        $Last = $row['Last'];
        $Email = $row['Email'];
        $time = $row['time'];
        $date = $row['date'];
        echo "<tr>";
        echo "<td>".$student_id."</td>";
        echo "<td>".$Name."</td>";
        echo "<td>".$Last."</td>";
        echo "<td>".$Email."</td>";
        echo "<td>".$time."</td>";
        echo "<td>".$date."</td>";

        echo "</tr>";
    }
    ?>
    </tbody>
</table>

我的问题是,我不知道如何根据if和动态更新表格,只有在数据库中有变更时

4 个答案:

答案 0 :(得分:0)

要知道您的桌子上是否有修改,我可以想到:

  • 检查并保存information_schema中的最后更新时间
  • 创建&#34;版本化表&#34;触发表格数据更新,插入或删除的每次更新
  • 计算并保存所选结果集的哈希值

可能还有其他一些方法可以做到这一点。

答案 1 :(得分:0)

您无法在不从前端发送请求的情况下更新浏览器中的内容。但是你可以最小化这个过程。只需创建php脚本,它将输出状态并生成json。 为了使PHP脚本易于理解,当表更新时,何时更新,使用哈希summ。

  1. 更新数据库中的任何数据时,请更改此哈希值。
  2. 渲染表格时,将此哈希值汇总为data-hash="<some hash>"添加到表格标记中。
  3. 当您向php脚本发送ajax请求时,请将此哈希添加为发送数据。
  4. 然后只是编写实际的哈希和脚本发送的哈希。如果不相等,请将json状态设置为已更新并输出实际数据。
  5. 然后使用jquery在表中呈现新数据。
  6. 然而,也许它不值得,你最好保持原样。

答案 2 :(得分:0)

通常人们不会做你想做的事情,因为做一个可以判断是否有任何改变的查询需要与原始查询相同的资源量。因此,最好的解决方案可能是在固定的时间间隔内重复查询,就像每分钟一样。

但是如果你有一个非常繁重的查询,你希望减少它的完成次数,你可以执行以下操作:

由于传统的关系数据库没有事件驱动方面,唯一的方法是对固定时间间隔内的更改进行轮询。所以这要在应用程序级别上解决,即:每次修改数据时,都会使用当前日期时间更新数据库中的某些内容。有很多可能性:

  • 您可以在last_modified表中添加student字段,每次代码添加或修改记录时,都会设置当前时间。然后,您可以仅查询已修改的记录,或通过以下方式检查最新的修改时间:

    select
        max(`last_modified`)
    from
        `student`
    
  • 您可以创建一个单独的表,其中包含您要跟踪的每个表的记录。每次您的代码添加或修改学生时,它都会设置学生表的当前时间。

    insert into
        `track_updates`
        (`table_name`, `time`)
    values
        ("student", "2017-03-21 12:59:00")
    on duplicate key update
        `time` = "2017-03-21 12:59:00"
    

    然后按表格查询:

    select
        `time`
    from
        `track_updates`
    where
        `table_name` = "student"
    
  • 您甚至可以拥有一张始终包含单条记录的表格,其中包含所有相关表格的上次更新时间的单个字段。

您可以使用以下技术提高这些类型的轮询效率:https://en.wikipedia.org/wiki/Comet_%28programming%29

答案 3 :(得分:0)

根据许多人的推荐,我决定采用不同的路线,每隔5秒就消除一次刷新表,而是设置一个按钮来刷新表中的行数。

<button type="button" onClick="refreshTable()">Refresh</button>
<div id="table_holder" class="table-responsive" style="height: 300px;"></div>


<script type="text/javascript">
$(document).ready(function(){
    refreshTable();
});

function refreshTable(){
    $('#table_holder').load('live_table_data.php')};