“谁登录”不工作

时间:2015-12-21 14:50:03

标签: php jquery html mysqli

我正在尝试编写一个显示谁登录我网站的系统。

我已经尝试了很多东西,而且我觉得我对此有所了解 - 但它无法正常工作。我需要帮助才能找到我出错的地方。

这是我的显示代码(我知道我不应该用表格格式化,但是我用它来测试):

<?
$loggedInUsers2 = "SELECT * FROM techs WHERE Level='0' AND LastTimeSeen>DATE_SUB(NOW(), INTERVAL 5 MINUTE)";
$loggedInUsers3 = "SELECT * FROM techs WHERE Level>'0' AND LastTimeSeen>DATE_SUB(NOW(), INTERVAL 5 MINUTE)"; 
?>
<div class="col-sm-4">
    <div class="thumbnail">
        <center><h4 style="height:35px;">Users Online</h4></center>
        <div class="modal-body" style="min-height:498px;">
            <table>
                <tr><td> 
                <?
                mysqli_query($con, $loggedInUsers2) or die("Error " . mysqli_error($con));
                while($row2 = mysqli_fetch_array($loggedInUsers2)) { //if level less than 1
                    echo $row2['Name']."<br/>";
                }
                ?>
                </td><td>
                <?
                mysqli_query($con, $loggedInUsers3) or die("Error " . mysqli_error($con));
                while($row3 = mysqli_fetch_array($loggedInUsers3)) { //if level more than 1
                    echo $row3['Name']."<br/>";
                }
                ?>
                </td></tr>
            </table>
        </div>
    </div>
</div>

这是我保存到数据库:

$userId = $_SESSION['UserId'];
$loggedInUsers1 = "UPDATE techs SET LastTimeSeen=NOW() WHERE UniqueID='$userId'";
mysqli_query($con, $loggedInUsers1) or die("Error " . mysqli_error($con));

这将输出到我的数据库(在LastTimeSeen字段中)到2015-12-21 08:35:43之类的东西(通过重新加载页面页脚的jquery每隔几秒更新一次)

基本上,第一页的表格中没有输出。

编辑:

建议使用登录按钮将用户设置为活动状态,并使用注销按钮将其设置为非活动状态 - 这是我对此的回复:

"The problem with that is people won't use the logout button. They will just close the browser. I want this to keep track of only users that are online. The footer updates the time in the database, every couple of seconds, and then the table is listed on a part of the page that reloads every few seconds aswell, so they are both always up to date. It should only list people that have been on a page in the past 5 minutes."

4 个答案:

答案 0 :(得分:0)

我认为因为last seen = now仅在查询运行时不等于NOW?意味着它现在只设置为瞬间?我可能错了,但把想法扔出去了。说实话,我认为还有一种更简单的方法可以做到这一点!

当您登录用户时也运行查询以更新字段..所以登录

//Code to log in
if password and email comp is found in database then log user in

//Code to set user active
UPDATE user WHERE username& password match, SET active = TRUE or 1 or something of the sort.

然后在注销时设置active = to false或0,我希望你看到我试图在这里解释的逻辑,我会编写代码但是在laravel中太深,并且暂时没有触及vanilla db管理。

答案 1 :(得分:0)

使用mysqli_query时,它会返回结果对象。您需要将此对象传递给mysqli_fetch_array而不是查询字符串。

<?
    $loggedInUsers2 = "SELECT * FROM techs WHERE Level='0' AND LastTimeSeen>DATE_SUB(NOW(), INTERVAL 5 MINUTE)";
    $loggedInUsers3 = "SELECT * FROM techs WHERE Level>'0' AND LastTimeSeen>DATE_SUB(NOW(), INTERVAL 5 MINUTE)"; 
?>
<div class="col-sm-4">
    <div class="thumbnail">
        <center><h4 style="height:35px;">Users Online</h4></center>
        <div class="modal-body" style="min-height:498px;">
            <table>
                <tr><td> 
                    <?
                    $results1 = mysqli_query($con, $loggedInUsers2) or die("Error " . mysqli_error($con));
                    while($row2 = mysqli_fetch_array($results1)) { //if level less than 1
                        echo $row2['Name']."<br/>";
                    }
                    ?>
                </td><td>
                    <?
                    $results2 = mysqli_query($con, $loggedInUsers3) or die("Error " . mysqli_error($con));
                    while($row3 = mysqli_fetch_array($results2)) { //if level more than 1
                        echo $row3['Name']."<br/>";
                    }
                    ?>
                </td></tr>
            </table>
        </div>
    </div>
</div>

答案 2 :(得分:0)

我认为这个任务根本不应该用MySQL来完成。因为当每秒都有成千上万的访问者打开新页面时,您将面临巨大的超载和数据库死锁。

使用基于RAM的数据库(如Redis(http://redis.io))会更好。

在Redis中,您可以为当前活跃的访问者设置自动过期的条目(比如5分钟)。如果该条目在5分钟内未更新,则会自动删除。我建议使用Redis命令SETEX。

您不必担心没有退出的人会以有效的方式达到您想要的目标。

答案 3 :(得分:0)

因此,如前所述,您需要在两行代码中更改以下内容。

 mysqli_query($con, $loggedInUsers2) or die("Error " . mysqli_error($con));
 while($row2 = mysqli_fetch_array($loggedInUsers2)) { //if level less than 1
                        echo $row2['Name']."<br/>";
                    }

 $query_1 = mysqli_query($con, $loggedInUsers2) or die("Error " . mysqli_error($con));
 while($row2 = mysqli_fetch_array($query_1)) { //if level less than 1
                        echo $row2['Name']."<br/>";
                    }

问题是传递给mysqli_fetch_array的参数不是查询对象,意味着循环只是通过MySQL语句而不是对象。