【问题标题】:change status after 1 hour and after 24 hours1 小时后和 24 小时后更改状态
【发布时间】:2017-11-01 16:00:21
【问题描述】:

我已经安装了一个 cron 作业来自动运行。它检查数据库中的作业,一小时后它应该从私有状态更改为公共状态,并且在 24 小时后它应该从公共状态更改为过期。 cron 作业运行顺利,但以下代码没有带来预期的结果。数据库数据没有改变,当我自己运行它时,没有任何信息显示为消息。

我怎样才能扭转它以实现这一目标?

我的代码:

      // Check and do something: private to public
      $now=date("Y-m-d H:i:s");
      $timeBefore=strtotime($now-3600);
      $check=mysqli_query($con,"SELECT * FROM ibirakas WHERE status='private' AND added<'$timeBefore'") or die(mysql_error());
      while($exe_check=mysqli_fetch_assoc($check)){
        $id=$exe_check['kiraka_id'];
        $query=mysql_query("UPDATE ibirakas SET status='public' WHERE id='$id'") or die(mysql_error());
        if($query==true){
          echo "CRON_1_DONE";
        } else {
          echo "CRON_1_FAIL";
        }
      }
      //check and do something: public to expired
      $now=date("Y-m-d H:i:s");
      $timeBefore=strtotime($now-86400);
      $check=mysqli_query($con,"SELECT * FROM ibirakas WHERE status='public' AND added<'$timeBefore'") or die(mysql_error());
      while($exe_check=mysqli_fetch_assoc($check)){
        $id=$exe_check['kiraka_id'];
        $query=mysql_query("UPDATE ibirakas SET status='expired' WHERE id='$id'") or die(mysql_error());
        if($query==true){
          echo "CRON_2_DONE";
        } else {
          echo "CRON_2_FAIL";
        }
      }

我已经包含了 connect.php 文件,并且我已经打开了 php 打开和关闭标签(这里不包含) 您的帮助将不胜感激。谢谢

【问题讨论】:

  • 警告:如果您只是学习 PHP,请不要使用mysql_query 接口。它是如此可怕和危险,以至于它在 PHP 7 中被删除。像 PDO is not hard to learn 这样的替代品和像 PHP The Right Way 这样的指南解释了最佳实践。您的用户数据不是properly escaped,有SQL injection bugs,可以被利用。
  • 请尝试改掉用== TRUE 之类的不必要的东西弄乱代码的习惯。许多函数旨在返回评估为 true 的值,因此文字比较是多余的。
  • 我还打算立即提到 PDO,尽管鉴于所有变量都是由程序内部生成的,你没有任何打开的注入错误,除非 PHP 行为不端或你的 kiraka_id 已经打开注射。无论如何,您都应该使用 PDO 并转义。但是,您是否进行了通常的调试?它在哪里失败?您是否取回了您期望的数据,但没有更新?
  • 感谢您的参考,我需要它@tadman
  • 我没有收到任何输出,数据也没有改变。所以我真的不知道问题出在哪里

标签: php mysql cron


【解决方案1】:

我认为你可以在没有那么多 PHP 的情况下让它变得更容易,而更多地使用 MySQL 函数。有很多像TIMEDIFF 这样的函数,所以你可以检查从NOW() 到保存日期的差异是否大于90 分钟。这是一个很好的问题,如何从差异中获取分钟数。

Difference in minutes from two time fields in MySQL

那么您不需要选择并更新所有行。您可以直接更新所有符合您的条件的行。

【讨论】:

  • 是的,我知道我不必重新选择所有行。您能否提供一个语法来说明如何做到这一点?时间差异?谢谢
【解决方案2】:

我已经找到了这个问题的相关答案。因为我一开始就想使用 MySQL,所以这个简单的解决方案做到了。

      <?php
      include("connect.php");
      date_default_timezone_set("Africa/Kigali");
      // Change from private to public
      $query=mysqli_query($con,"SELECT * FROM ibirakas WHERE TIME_TO_SEC(TIMEDIFF(now(),`added`))>3600 AND status='private'");
      while($row=mysqli_fetch_assoc($query)){
        $change=mysqli_query($con,"UPDATE ibirakas SET status='public'");
      }
      // Change from public to expired
      $query=mysqli_query($con,"SELECT * FROM ibirakas WHERE TIME_TO_SEC(TIMEDIFF(now(),`added`))>86400 AND status='public'");
      while($row=mysqli_fetch_assoc($query)){
        $change=mysqli_query($con,"UPDATE ibirakas SET status='expired'");
      }
      ?>

谢谢

【讨论】:

    猜你喜欢
    • 2016-08-12
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    相关资源
    最近更新 更多