php/mysqli 查询未正确执行某些查询

php/mysqli query not executing some of the query's with no errors

我的服务器上每分钟都有一个脚本 运行 基本上是一个 cron 作业,为我为一些朋友制作的小游戏更新数据库中的一些变量。

我遇到的问题是脚本只运行某些查询但无法更新其他查询。我已验证它正在连接,但比较不起作用。任何帮助将不胜感激。

这是我当前的通话,但打不通。

//Query server
$query = "SELECT id, usr, dt, is_online FROM player_data WHERE is_online =1";
$result = mysqli_query($conn, $query);
// If connection is good
if ($result = mysqli_query($conn, $query)) 
    {
        echo "Connected </br>";
    /* fetch associative array */
    while ($row = mysqli_fetch_assoc($result)) 
        {
            //Get time of NOW, and time of last activity
            echo "loop started </br>";
            $now = strtotime(date("Y-m-d h:i:s", strtotime("now")));
            $before = strtotime(date("Y-m-d h:i:s", strtotime($row['dt'])));
            //Add five minutes to the last activity
            $then = $before + (60 * 5);
            //Display the times
            echo $before . "</br>";
            echo $now . "</br>";
            echo $then . "</br>";
            //determine if the time now is more then 5 minutes after the last activity
            if (strtotime($now) > strtotime($then))
                {
                    //set user to offline if more then 5 minutes has passed.
                    mysqli_query($conn, "UPDATE player_data SET is_online = 0");
                    echo "1.User: " . $row['usr'] . "</br>";
                    echo "1.Database: " . $row['dt'] . "</br>";
                    echo "1.System: " . date('Y-m-d H:i:s') . "</br>";
                    echo "Now: " . $now . "</br>";
                    echo "Before: " . $before . "</br>";
                    echo "then: " . $then . "</br>";
                }

        }

    }
`````````````````````````````````````````````````````````````````````````
this should set anyone who has not been active in the last 5 minutes to is_online = 0 but does not.

This is the actual output as of right now with the last activity being more then 1.5 hours earlier.


Connected 
loop started 
1555687200
1555777824
1555687500
loop started 
1555687227
1555777824
1555687527

好吧,让我猜猜,脚本正在设置所有人离线,对吧? 问题是您错过了我们 UPDATE 语句

中的 WHERE 子句
mysqli_query($conn, "UPDATE player_data SET is_online = 0");

所以最好复习一下那部分。应该是这样的

mysqli_query($conn, "UPDATE player_data SET is_online = 0 WHERE id = " . $row['usr']);

也没有必要比较 strtotime($now)strtotime($then)$now$then 已经持有 "microtime" 值,所以你可以这样做:

if ($now > $then) {
    //your code here
}

顺便说一句,即使您没有使用任何 REQUEST 参数,我也建议您使用准备好的语句。

关于您的时间转换的一些注意事项:

$now = strtotime(date("Y-m-d h:i:s", strtotime("now")));
$before = strtotime(date("Y-m-d h:i:s", strtotime($row['dt'])));

在第一行中,将文本 "now" 转换为时间戳,然后将其转换为字符串,然后再次转换为时间戳。一种简短且更有效的方法是将行替换为

$now = time();

第二行类似。替换为:

$before = strtotime($row['dt']);

总的来说,时间转换比通常的算术要慢得多。因此,我建议始终使用 unix 时间戳(自纪元以来的秒数),并在用户界面需要时将它们转换为纯文本。

我从不使用数据库类型 datetimestamp,但总是将 int 与 UNIX_TIMESTAMP() 一起使用。这使许多事情变得容易得多,尤其是当您需要具有不同时区的用户相关输出时。另外,您对夏令时没有任何问题。

比较输出:

mysql -e 'select unix_timestamp("2019-03-31 04:00")-unix_timestamp("2019-03-31 02:00")'
mysql -e 'select timediff("2019-03-31 04:00","2019-03-31 02:00")'

结果是

3600
02:00:00 

只有第一个结果是正确的,因为夏令时开始,相差只有1小时。