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

Posted

技术标签:

【中文标题】php/mysqli 查询未执行某些查询且没有错误【英文标题】:php/mysqli query not executing some of the query's with no errors 【发布时间】:2019-04-20 04:33:41 【问题描述】:

我的服务器上每分钟都会运行一个脚本来执行一项 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

【问题讨论】:

【参考方案1】:

好吧,让我猜猜,脚本将每个人都设置为离线,对吧? 问题是您在我们的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 已经持有“微时间”值,所以你可以这样做:

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

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

【讨论】:

@Zeusarm-- 感谢您抽出宝贵时间回答这个问题,但它实际上并没有改变任何内容,而不是所有行。我还添加了 where 子句,但值也没有变化。真正奇怪的是它昨天还在工作,而我没有对其进行任何更改。我比较 strtotime() 的原因是因为其中一个是来自数据库的时间戳,并且在我这样做之前它不起作用。 @Walt 是的,这是真的,但确实如此,因为您正在比较 strtotime,您应该只比较 $now$then,因为它们已经保存了时间值,请查看您的输出- 它们是整数 谢谢,我起初错过了在最后一个 IF 中从 $now 和 $then 中删除 strtotime() ,这是导致问题的原因。奇怪的是它星期四还在工作,但在星期五停止了,它一定是在一夜之间恢复了,但我不确定这是怎么发生的。【参考方案2】:

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

$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()。这使许多事情变得更加容易,尤其是当您需要具有不同时区的用户相关输出时。此外,您对 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 

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

【讨论】:

Wiimm -- 谢谢,一旦我弄清楚它为什么没有真正更新数据库,或者至少弄清楚它为什么一夜之间崩溃,我会再研究一下 UNIX_TIMESTAMP()。我试图这样做只是感到困惑,所以我使用了我使用的方法,我确实接受了你和@Zeusarm 的建议并更改了 $now 和 $before 变量。

以上是关于php/mysqli 查询未执行某些查询且没有错误的主要内容,如果未能解决你的问题,请参考以下文章

PHP - MySQLi 处理查询两次或错误

PHP mysqli 子查询返回 Impossible WHERE 在读取 const 表后注意到

PHP显示查询不同的sql执行

php mysqli 查询期望参数 1 为字符串

php Mysqli 未定义函数

PHP : MySQLi面向过程操作数据库 连接建库建表增删改查关闭