如何在某个表获取新行(PHP)时刷新页面?

时间:2014-02-11 14:37:47

标签: javascript php jquery mysql ajax

我一直在寻找一些脚本,它会在注意到数据库特定表中的新条目后刷新我的页面。所以基本上......脚本会每隔五秒左右检查一次表,如果它注意到时间戳大于time()(加载页面的时间,显然,不是当前时间)的任何内容都带有id列例如,价值。 14,它会刷新页面。

我试图解决这个问题很多,但我似乎找不到合适的答案。你看,问题是JavaScript和AJAX对我来说并不是那么熟悉。

对不起,如果它看起来像是一个愚蠢的问题,它现在对我来说真的意味着世界。 其他答案也很受欢迎......我怎么能用Comet或长插座做到这一点? 因为我100%无能为力。

以下是该页面的当前(简化)代码:

if (isset($_GET['view'])) {
$duel_id = mysqli_real_escape_string($query, $_GET['view']);
$result = mysqli_query($query, "SELECT * FROM duels WHERE `id` = '$duel_id' LIMIT 0, 1") or die(mysqli_error($query));
$row = mysqli_fetch_array($result);
if ($row['member_1'] !== $member_id && $row['member_2'] !== $member_id) {
    echo '<meta http-equiv="refresh" content="0; url=redirect.php" />';
    exit;
} else {
    //IRRELEVANT FUNCTIONS
    if ($my_turn == false && $row['winner'] == 0) {
        //IRRELEVANT FUNCTIONS
    } else {
        echo '<center><form action="spell.php" method="post"><table style="margin: 20px;">';
        //300 LINES OF DYNAMIC FORMS AND INPUTS             
        echo '</form></center>';
        }
    }
    echo '<center><table style="margin: 20px; margin-top: 40px;">';
    $result = mysqli_query($query, "SELECT * FROM duelling WHERE `duel_id` = '$duel_id' ORDER BY `timestamp` DESC") or die(mysqli_error($query));
    //THIS IS THE WHILE LOOP WHICH DISPLAYS ALL LOGS ON REFRESH
    while ($row = mysqli_fetch_array($result)) {
        //$spell, $name, $defence ARE DEFINED HERE, ANOTHER 20 LINES
        echo '<tr><td style="padding: 5px; color: #a20d0d; font-family: \'Courier New\', Courier, monospace; text-align: right;">' . date('d.m.y H:i', $row['timestamp']) . '</td><td style="padding: 5px;">' . $name . ' used ' . $spell . '. <span style="font-family: \'Courier New\', Courier, monospace; color: #a20d0d; font-size: 10px;">' . $defence . '</span></td></tr>';
    }
    echo '</table></center>';
}

3 个答案:

答案 0 :(得分:2)

使用setInterval和jQuery的$.get

setInterval(function(){
    $.get( "page.php", function( data ) {
            //Write data to div
            $( "#result" ).html( data );
    });
},5000);

当然,这将涉及您编辑当前脚本以允许page.php获取结果,以及显示给客户端的页面具有<div id="result"></div>

您的page.php只需要在表格中显示数据(因为这是您原始帖子建议的首选输出),而不是其他内容,因为它将每隔5000毫秒调用一次; 5秒。

几乎忘记了。确保包含jQuery lib

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>

page.php中,添加“奴隶”,以所需的格式为您提供内容。

<?php
//We've connected to the database using mysqli
echo '<center><table style="margin: 20px; margin-top: 40px;">';
$result = mysqli_query($query, "SELECT * FROM duelling WHERE `duel_id` = '$duel_id' ORDER BY `timestamp` DESC");
while ($row = mysqli_fetch_array($result)) {
    echo '<tr><td style="padding: 5px; color: #a20d0d; font-family: \'Courier New\', Courier, monospace; text-align: right;">' . date('d.m.y H:i', $row['timestamp']) . '</td><td style="padding: 5px;">' . $name . ' used ' . $spell . '. <span style="font-family: \'Courier New\', Courier, monospace; color: #a20d0d; font-size: 10px;">' . $defence . '</span></td></tr>';
}
echo '</table></center>';
?>

另外,只是一个提示:不使用内联样式可能对您有用,因为如果它不是全部在一个(或两个)css文件中,那么稍后更新样式将是一件麻烦事。

答案 1 :(得分:2)

所以你猜对了。你需要ajax,如果你不介意每5秒钟请求引起的服务器负载。 要实现这一点你需要一些像这样的js代码:

var startTime = Math.round(new Date().getTime() / 1000);
function checkTables(startTime)
{
    $.get( "checkdb.php?startTime=" + startTime, function(res) {
        if(res == "1")
        location.reload();
    });
}
setInterval("checkTables(" + startTime + ")",5000);

你checkdb.php可能看起来像:

$startTime = $_GET['startTime']; //do appropriate sanitizing/escaping
$result = mysqli_query($query, "SELECT * FROM duelling WHERE `duel_id` = '$duel_id' AND `timestamp` > " . $startTime) or die(mysqli_error($query));
if(mysqli_num_rows($result) > 0)
echo "1";

答案 2 :(得分:0)

  1. 如果您的页面内容已使用file_get_contents更改,您可以编写一个ajax请求(使用设置间隔或websockets)进行检查。

    file_get_contents(“http://your_page.php”,false);

  2. 您可以存储最后一项的索引并检查新项目。

  3. 我还建议不要刷新整个页面,只需使用ajax更改更新的区域,例如jquery's html函数或纯JavaScript