";谁登录了“;不起作用


"Who is logged in" Not working

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

我已经尝试了很多东西,我觉得我已经找到了一些东西——但它不起作用。我需要别人帮我找出哪里出了问题。

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

<?
$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."

当您使用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>

我认为,因为当查询运行no时,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=设置为false或0,我希望你能看到我在这里试图解释的逻辑,我会写代码,但我对laravel太深入了,有一段时间没有接触到香草数据库管理。

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

你最好使用基于RAM的数据库,比如Redis(http://redis.io)。

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

你不需要担心那些没有注销的人,你会以高效的方式实现你想要的。

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

 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语句而不是对象。