【问题标题】:How to update MySQL column/row when datetime column < now?当日期时间列<现在如何更新MySQL列/行?
【发布时间】:2021-05-06 02:34:48
【问题描述】:

我正在创建一个平台,人们可以在该平台上对商品进行投标。

我想让它在项目的过期日期时间之后,数据库会自动将项目的状态从“打开”更新为“过期”,然后发送电子邮件给项目所有者和投标人让他们知道新的状态。

我如何做到这一点?

我使用 PHP 作为我的脚本语言和 AWS 来发送电子邮件。

这是在 PHP 中还是在 MySQL 中完成的?

【问题讨论】:

  • 这将是一个由两部分组成的任务。首先,确保用户不能对仍然“开放”但逻辑上已过期的东西进行竞价。其次,查看cron。基本上,您希望系统定期(每分钟、五分钟等)运行一项任务,该任务是查找所有“打开但已过期”的项目,将它们标记为“已过期”并执行其他逻辑。对于其他逻辑,您可能还想查看队列。
  • 太棒了,如果可能的话,请详细说明 cron 和队列,我是新手
  • cron 是 Linux/Unix 的标准概念(Windows 也有类似的概念)。 AWS 也有 cron thing。我只是研究“cron 是如何工作的”来详细了解它。但一般来说,您要求系统(主机操作系统)在特定时间/间隔运行您选择的特定文件。你想要的文件是普通的 PHP,除了你应该假设像 $_GET 这样的全局变量不存在。您可以通过运行php you-file.php 手动测试它。队列是一个更大的主题。
  • 我不会费心更新数据库。如果我是你,我会忽略上面的 cmets。
  • 那你有什么建议?

标签: php mysql stored-procedures


【解决方案1】:

不要通过表格更改状态。像 SELECT 一样计算状态。

当您查看所有移动部件时,它会明显更快,并且可能更简单。

它会查询所有对该项目出价的用户,然后向每个用户发送一封电子邮件,让他们知道它已过期并检查结果

这必须通过 MySQL 之外的代码来完成。这样的程序将使用以下语句定期(每分钟?)轮询数据库。当它找到一些匹配项时,它会发送电子邮件并将状态设置为“email_sent”(或其他)。

SELECT ...
    FROM tbl
    WHERE this_date < NOW()   -- (I don't know the exact test you need)
      AND status != 'email_sent'

并且拥有

INDEX(this_date)

需要更新状态,否则您可能会随着时间的推移错过一些行,或者可能会重复一些电子邮件。由于发送电子邮件的成本有点高,您可以一次更新一行。

【讨论】:

  • 所以你的意思是,只有在状态过期后有人查询该行时才更新实际状态。当然这很容易。但是当日期过去时如何发送通知/电子邮件?但也不更新行?
  • @BrettMalone - 通过将NOW() 与表中的某些日期进行比较来计算“打开”和“过期”状态。当您发送电子邮件时,“email_sent”状态将存储在表中;它也可能会影响整体状态。什么是状态值?
  • 基本上,它是一个在expire date &lt;= now() 之前接受投标的项目。一旦该声明成立,它就会查询所有对该项目出价的用户,然后向每个用户发送一封电子邮件,让他们知道它已过期并检查结果。我的问题是我该怎么做?现在忽略状态值,我试图提供一个简单的例子,但是有多个状态的
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2019-07-01
  • 2016-04-09
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 2012-11-28
相关资源
最近更新 更多