在线节目播放器(PHP)需要帮助

时间:2019-10-11 02:35:43

标签: php

我需要帮助才能在我的网站上在线显示玩家的姓名。

我已经完成所有工作,但是当我选择0级(成员)时,可以看到1000位在线/离线玩家。

我希望它仅显示玩家(在线)和隐藏玩家(离线),希望您知道我的意思

我的代码:

<?php               
    $findAdmins = $odb->query("SELECT * FROM `users` WHERE `rank` = '1'");

    while($rowAdmins = $findAdmins->fetch(PDO::FETCH_BOTH)) {    
        $diffOnline = time() - $rowAdmins['activity'];

        $countOnline = $odb->prepare("SELECT COUNT(*) FROM `users` WHERE `username` = :username  AND {$diffOnline} < 60");

        $countOnline->execute(array(':username' => $rowAdmins['username']));

        $onlineCount = $countOnline->fetchColumn(0);

        $logo = "fa fa-ban";

        if($onlineCount == "1") {  
            echo '<li><a href="#"><i></i><center>'. $rowAdmins['username'] .'  <span class="labelon " style="border-radius:3px; color:white; float:right; font-weight:500; padding:6px; background-color:#1388a0;">Online</span></center></a></li>';
        } else {     
            echo '<li><a href="#"><i></i><center>'. $rowAdmins['username'] .'  <span class="labelon " style="border-radius:3px; color:white; float:right; font-weight:500; padding:6px; background-color:#f71c11;">Offline</span></center></a></li>';
        }
    }

?>      

2 个答案:

答案 0 :(得分:0)

您已经使这一过程变得非常复杂-您可以在单个查询中更高效地完成所需的操作。而且,如您所说,如果您只希望它显示在线的玩家,那么您就不需要这段代码来回显“脱机”文本。如果这是您的要求,那么我不确定您为什么添加该行:-)

此查询将返回具有所需排名的所有“在线”用户:

SELECT * FROM `users` WHERE `rank` = 0 and unix_timestamp() - `activity` < 60

演示:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=5fc7238d7c9ecc968fef7da4e4657a9d

因此,PHP代码可以简化为:

$findAdmins = $odb->query("SELECT * FROM `users` WHERE `rank` = 0 and unix_timestamp() - `activity` < 60");

while($rowAdmins = $findAdmins->fetch(PDO::FETCH_BOTH)) {
  echo '<li><a href="#"><i></i><center>'. $rowAdmins['username'] .'  <span class="labelon" style="border-radius:3px; color:white; float:right; font-weight:500; padding:6px; background-color:#1388a0;">Online</span></center></a></li>'
}

这将返回具有该排名的所有在线用户,并为每个用户回显一个链接。


P.S。只是一点说明,HTML中的<center>标签是obsolete-您应该使用CSS text-align属性将文本居中。也考虑更改代码的这一部分。

答案 1 :(得分:0)

您为什么要第二次查询?如果您判断$onlineCount == 1,则用户名字段是唯一的,并且$diffOnline变量在计算后保持不变。与常数60的比较是固定的。尝试以下代码:

$findAdmins = $odb->query("SELECT * FROM `users` WHERE `rank` = '0'");

while($rowAdmins = $findAdmins->fetch(PDO::FETCH_BOTH)) {
    $logo = "fa fa-ban";

    if(time() - $rowAdmins['activity'] < 60) {  
        echo '<li><a href="#"><i></i><center>'. $rowAdmins['username'] .'  <span class="labelon " style="border-radius:3px; color:white; float:right; font-weight:500; padding:6px; background-color:#1388a0;">Online</span></center></a></li>';
    } else {     
        echo '<li><a href="#"><i></i><center>'. $rowAdmins['username'] .'  <span class="labelon " style="border-radius:3px; color:white; float:right; font-weight:500; padding:6px; background-color:#f71c11;">Offline</span></center></a></li>';
    }
}