php / mysqli查询未执行某些查询且没有错误

时间:2019-04-20 04:33:41

标签: php mysql execution

我的服务器上每分钟都有一个脚本运行,基本上可以完成一项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

2 个答案:

答案 0 :(得分:2)

好让我猜,该脚本将所有人都设置为脱机,对吗? 事实是您错过了我们的WHERE语句中的UPDATE子句

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参数,我还是建议您使用准备好的语句。

答案 1 :(得分:0)

关于时间转换的一些说明:

$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,但在UNIX_TIMESTAMP()中始终使用int类型。这使操作变得容易得多,尤其是在需要具有不同时区的用户相关输出时尤其如此。另外,您还没有DST问题。

比较以下内容的输出:

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 

只有第一个结果是正确的,因为DST介于两者之间,并且相差只有1小时。