如何每隔几秒就用php中的print语句和图像功能刷新div

时间:2018-01-28 06:38:26

标签: javascript php jquery ajax page-refresh

我正在尝试构建一个主要使用PHP的浏览器卡片游戏,并且可能还会使用其他一些有用的语言来测试和扩展我的PHP知识,并使用我一直想做的事情。但是我读过并试图实现的每个在线解决方案都行不通,我不知道为什么。我有这样的逻辑:

//find game form
        print "<form method='post' action='game.php'>
        <label>Enter host generated game #</label><br>
        <label><input type='text' name='gamenumber'></label><br>
        <label><input type='submit' name='findgame' value='FindGame'></label><br><br>
        </form>";

        //host game button
        print "<form method='post' action='game.php'>
        <label><input type='submit' name='hostgame' value='HostGame'></label>
        </form>";

//game logic



if(isset($_POST['hostgame'])) 
    {
        $roomnumber = rand();
        print $roomnumber;

        insertField($Ausername,$roomnumber); //insert field GUI

        //link game to host for future field printing
        $query = "UPDATE game".$roomnumber." SET host='".$Ausername."' WHERE host='null'";
        $result = mysqli_query($link, $query);

        print "<div id='quote'>"; //populate host just disappears <meta http-equiv='refresh' content='5' />

        //populates self and opponents in hosts perspsective
        populatehost($roomnumber); 

        print "</div>";


    }

    if(isset($_POST['findgame'])) //this processes after user submits data.
    {
        $roomnumber = $_POST['gamenumber'];
        $_SESSION['gamenumber'] = $_POST['gamenumber'];

        //link game to find for future field printing
        $query = "UPDATE game".$roomnumber." SET find='".$Ausername."'WHERE find='null'";
        $result = mysqli_query($link, $query);

        print "<form method='post' action='game.php'>
        <label><input type='submit' name='startgame' value='StartGame'></label>
        </form>";

        //populates self and opponents in finds perspsective
        populatefind($roomnumber); 

    }


    if(isset($_POST['startgame'])) //this processes after user submits data.
    {
        print "<br>Game started.<br>";

        print "heads or tails?\n\n";

        print "<form method='post' action='game.php'>
        <label><input type='text' name='headstails'></label><br>
        <label><input type='submit' name='select' value='Select'></label><br><br>
        </form>";

        //finder always starts game
        populatefind($_SESSION['gamenumber']);
    }

    $gameStatus="";
    $flip = rand(1,2);
    $coin = "heads";
    $gameStarted = "game not started";

    if($flip==1)
        $coin="heads";
    else if($flip==2)
        $coin="tails";

    if(isset($_POST['headstails'])) //this processes after user submits data.
    {
        if($_POST['headstails']==$coin)
        {
            print "find game player goes first";
            $gameStarted = "game started";
            //notify find game player he goes first
            //do logic where he goes first
        }
        else
        {
            print "host game player goes first";
            $gameStarted = "game started";
            //notify host game player he goes first
            //do logic where he goes first
        }

        populatefind($_SESSION['gamenumber']);
    }

这是我尝试过的粘贴在页面底部的jquery函数。

?>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js%22%3E%3C/script%3E">
    jQuery(function () {
        var $els = $('div[id^=quote]'),
            i = 0,
            len = $els.length;

        $els.slice(1).hide();
        setInterval(function () {
            $els.eq(i).fadeOut(function () {
                i = (i + 1) % len
                $els.eq(i).fadeIn();
            })
        }, 2500)
    })
</script>

</body>
</html>

所以我能够为主持人和发现者打印字段,一旦取景器翻转硬币,就会说出谁先从他们的角度出发..但是我很难让它出现在其他玩家身上透视。我正在考虑通过使用执行所有打印的功能刷新div来实现它,但无论如何都似乎没有任何效果。我尝试了很多不同的PHP睡眠方法,我尝试了一些jquery函数,没有任何效果。 btw populate host和populate find只是基于变量数组的巨型表的函数。

2 个答案:

答案 0 :(得分:7)

您尝试实现的这类事情将使用常规Ajax调用来花费大量服务器资源。

类似问题:Link

让我们考虑两个用户之间的聊天作为示例:

用户的1页有一个Javascript计时器,每秒都会询问新消息:“嘿服务器,给我发新消息。”无论是否有新消息,服务器都会处理请求,搜索新消息要回复的消息“我现在没有给您留言”“这是您的新留言”。 对于用户2也是如此。

如果两个用户都将聊天页面保持打开状态10秒钟,您的服务器将收到20个新消息请求,将搜索20个新消息,并将发送20个回复,其中包含新消息或“无新消息”回复。即使两个用户都没有发送任何内容,只需保持页面打开即可。想象一下,如果有1000个用户连接到您的聊天室!

在这种情况下,最好的方法是Socket。在同一个聊天示例中,用户1和用户2将继续收听新消息,而不是每秒都要求他们。当用户1发送消息时,服务器将通知用户2“我有一条新消息。这是。”

如果连接了1000个用户,则完全没有问题。服务器将新消息发送到套接字通道,并且将通知所有连接的用户。没有延迟。

在您的具体情况下,将这样工作:播放器1和播放器2正在侦听新消息。当玩家1点击卡片时,将触发服务器命令。服务器将接收并发送套接字通道的消息:“嘿,等待新卡的所有人,这里是”,然后每个玩家都会收到通知。瞬间。

第一种情况的另一个问题,使用Javascript计时器:如果您增加计时器间隔,则回复将延迟传递。

套接字的另一个好处是:它独立于技术。 PHP,Java,Node等

使用WebSocket和Php的GitHub项目:Link

You can see some socket demos here

Here is a repository with some tests I ran when I tried Socket earlier

答案 1 :(得分:3)

你可以这样做:

setInterval(function refresh(){
  var value = Math.round(Math.random()*100);
  $("#target").addClass("hidden");
  $("#target").html(value);
  $("#target").removeClass("hidden");
}
, 1500);
.hidden {
  display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="target">
</div>